1

これは非常に興味深い問題です。ネイティブコードがステートメントの一部を出力した後、前述の例外が発生します。スローされる例外は次のとおりです。

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)

最初の 2 つのステートメント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 <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;

}

何が原因でしょうか? CMD の出力

4

1 に答える 1

1

DllMainBOOL成功したかどうかを示すものを返すことになっています。MSDNから:

システムが値を使用してDllMain関数を呼び出すと、関数は成功した場合、または初期化が失敗した場合にDLL_PROCESS_ATTACH戻ります。プロセスが関数を使用しているためにが呼び出されたときの戻り値の場合、はを返します。(システムはすぐにDLLを使用してエントリポイント関数を呼び出し、DLLをアンロードします。)戻り値がプロセスの初期化中に呼び出されたときの場合、プロセスはエラーで終了します。拡張エラー情報を取得するには、を呼び出します。TRUEFALSEFALSEDllMainLoadLibraryLoadLibraryNULLDLL_PROCESS_DETACHFALSEDllMainGetLastError

関数に必要なreturnステートメントがありません。

于 2012-05-30T10:50:59.953 に答える