“线程中的异常”;“主要”;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;