“线程中的异常”;“主要”;java.lang.UnsatisfiedLinkError:动态链接库(DLL)初始化例程失败
这是一个非常有趣的问题。在本机代码打印一些语句之后,我得到了提到的异常。引发的异常是:“线程中的异常”;“主要”;java.lang.UnsatisfiedLinkError:动态链接库(DLL)初始化例程失败,java,c++,winapi,dll,java-native-interface,Java,C++,Winapi,Dll,Java Native Interface,这是一个非常有趣的问题。在本机代码打印一些语句之后,我得到了提到的异常。引发的异常是: hookThreadHandle is not NULL hookThreadHandle is not NULL Exception in thread "main" java.lang.UnsatisfiedLinkError: W:\elita\jnitesters\ workspace\c\MyHook\bin\Debug\MyHook.dll: A dynamic link library (DL
hookThreadHandle is not NULL
hookThreadHandle is not NULL
Exception in thread "main" java.lang.UnsatisfiedLinkError: W:\elita\jnitesters\
workspace\c\MyHook\bin\Debug\MyHook.dll: A dynamic link library (DLL) initialization r
outine failed
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at keylogger.TestKeys.main(TestKeys.java:12)
前两条语句hookThreadHandle不为NULL
是来自初始化失败的dll
的语句!为什么它在实际找到dll
并打印语句之后抛出异常
什么是动态链接库(DLL)初始化例程失败
异常?这意味着什么
Java代码:
C代码:
#包括
#包括
#包括
#包括“keylogger_TestKeys.h”
静态HHOOK handleKeyboardHook=NULL;
HINSTANCE hInst=NULL;
静态DWORD hookThreadId=0;
静态句柄hookThreadHandle=NULL;
BOOL-WINAPI安装钩子(HINSTANCE-hinstDLL、DWORD-fwdReason、LPVOID-lpvReserved);
静态LRESULT回调LowLevelKeyboardProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM){
printf(“您按下了键!\n”);
返回CallNextHookEx(handleKeyboardHook、nCode、wParam、lParam);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL、DWORD fwdReason、LPVOID lpvReserved){
LPTHREAD\u START\u例程lpStartAddress=&installHook;
hookThreadHandle=CreateThread(NULL,0,lpStartAddress,NULL,0,&hookThreadId);
if(hookThreadHandle==NULL){
printf(“\nhookThreadHandle为空\n”);
}否则{
printf(“\nhookThreadHandle不是NULL\n”);
}
}
JNIEXPORT void JNICALL Java\u键盘记录器\u测试键\u注销WinHook
(JNIEnv*env,jobject对象){
if(handleKeyboardHook!=NULL){
解锁键盘钩(把手键盘钩);
printf(“键盘钩子成功注销!”);
}否则{
printf(“不能解开键盘挂钩!”);
}
}
BOOL-WINAPI安装钩子(HINSTANCE-hinstDLL、DWORD-fwdReason、LPVOID-lpvReserved){
handleKeyboardHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,hinstDLL,0);
味精;
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回msg.wParam;
}
原因可能是什么
DllMain
应该返回一个BOOL
,指示它是否成功。发件人:
当系统使用DLL\u PROCESS\u ATTACH
值调用DllMain
函数时,如果成功,函数将返回TRUE
;如果初始化失败,函数将返回FALSE
。如果由于进程使用LoadLibrary
函数而调用DllMain
时返回值为FALSE
,LoadLibrary
返回NULL
。(系统立即使用DLL\u PROCESS\u DETACH调用您的入口点函数,并卸载DLL。)如果在进程初始化期间调用DllMain
时返回值为FALSE
,则进程将以错误终止。要获取扩展错误信息,请调用GetLastError
您的函数缺少必需的return
语句。DllMain
应该返回一个BOOL
,指示它是否成功。发件人:
当系统使用DLL\u PROCESS\u ATTACH
值调用DllMain
函数时,如果成功,函数将返回TRUE
;如果初始化失败,函数将返回FALSE
。如果由于进程使用LoadLibrary
函数而调用DllMain
时返回值为FALSE
,LoadLibrary
返回NULL
。(系统立即使用DLL\u PROCESS\u DETACH调用您的入口点函数,并卸载DLL。)如果在进程初始化期间调用DllMain
时返回值为FALSE
,则进程将以错误终止。要获取扩展错误信息,请调用GetLastError
您的函数缺少必需的return
语句。异常已解决。当它已经找到dll
异常得到解决时,为什么会出现未满足的链接错误异常…
。为什么我会得到未满足的链接错误异常…
当它已经发现dll
可能与您当前的问题没有直接关系,但是:不要在DllMain中创建线程。DllMain对如何安全使用它有很多限制;根据,它应该做的唯一事情是真正简单的初始化-例如设置关键部分,但仅此而已。当然不要创建线程、LoadLibrary或其他任何东西,否则以后会有各种各样的麻烦。在做任何事情之前,至少你应该检查一下fwdReason。这可能与你当前的问题没有直接关系,但是:不要在DllMain中创建线程。DllMain对如何安全使用它有很多限制;根据,它应该做的唯一事情是真正简单的初始化-例如设置关键部分,但仅此而已。当然不要创建线程、LoadLibrary或其他任何东西,否则以后会有各种各样的麻烦。至少你应该在做任何事情之前检查一下原因。
package keylogger;
public class TestKeys {
private static int i = 0;
private native void setWinHook();
private native void unregisterWinHook();
public static void main(String args[]) {
//TestKeys o = new TestKeys();
System.loadLibrary("MyHook"); // load the library that registers the hook
Runnable r = new Runnable() {
@Override
public void run() {
try {
System.out.println("Sleeping for 10 seconds..");
Thread.sleep(10000);
}catch(Exception exc) {
exc.printStackTrace();
}
}
};
new Thread(r,"new thread").start();
}
}
#include <stdio.h>
#include <windows.h>
#include <w32api.h>
#include "keylogger_TestKeys.h"
static HHOOK handleKeyboardHook = NULL;
HINSTANCE hInst = NULL;
static DWORD hookThreadId = 0;
static HANDLE hookThreadHandle = NULL;
BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved);
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
printf("You pressed the key !\n");
return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) {
LPTHREAD_START_ROUTINE lpStartAddress = &installHook;
hookThreadHandle = CreateThread(NULL, 0, lpStartAddress, NULL, 0, &hookThreadId);
if(hookThreadHandle == NULL) {
printf("\nhookThreadHandle is NULL\n");
} else {
printf("\nhookThreadHandle is not NULL\n");
}
}
JNIEXPORT void JNICALL Java_keylogger_TestKeys_unregisterWinHook
(JNIEnv *env, jobject obj) {
if(handleKeyboardHook != NULL) {
UnhookWindowsHookEx(handleKeyboardHook);
printf("Keyboard hook successfully unregistered !");
} else {
printf("Coudn't Unhook the keyboard hook !");
}
}
BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) {
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstDLL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;