java 多线程 调用 dll 出错,线程“main”中的异常java.lang.UnsatisfiedLinkError:动态链接库(DLL)初始化例程失败...

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。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值