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 is not NULL是其初始化失败dll的一个!为什么在实际找到dll并打印报表之后抛出异常。 ?
什么是A dynamic link library (DLL) initialization routine failed异常?它意味着什么?
Java代码:
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();
}
}
C代码:
#include
#include
#include
#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;
}
+1
可能不会与您当前的问题直接相关,但是:不要在DllMain中创建线程。 DllMain对你可以安全地使用它有什么限制;每个[MSDN手册页](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v = vs.85).aspx),它应该做的* only *事情是非常简单的初始化 - 例如设置关键部分,但仅此而已。当然,不要CreateThread或LoadLibrary或其他任何东西,否则你以后会遇到各种各样的麻烦。至少你应该在做任何事情之前检查fwdReason。 –