2016-09-07 3 views
0

프로세스에 의해로드 될 때 MessageBox를 표시하는 짧은 DLL을 만들었습니다. 그러나 메시지 상자가 두 번 표시됩니다. 따라서 DLL 내보내기 기능이 두 번 호출 된 것처럼 보입니다. MessageBox가 한 번만 표시되도록 코드에서 수정해야하는 것이 있는지 확인해 주시겠습니까? 아래와 같이DLL 내보내기 함수가 두 번 호출되었습니다.

#include <windows.h> 
#include <stdio.h> 

__declspec(dllexport) void sampledllmain() 
{ 
    MessageBox(NULL, "sample text","sample title", 0); 
} 

BOOL APIENTRY DllMain(HANDLE hHandle, DWORD dwReason, LPVOID Reserved) 
{ 
    switch(dwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
       sampledllmain(); 
       break; 
    } 
    return 1; 
} 

난 Rundll32는 사용하는 DLL을로드 :

rundll32 "path to DLL",sampledllmain 
+0

이, 당신의 검사 결과에 대한 두 번째 더미 함수를 추가하십시오에 48,전화 rundll32 "DLL 경로", dummy' – dvhh

+2

물론 두 번 호출됩니다. 'sampledllmain'을'DllMain'에서 제거하십시오. – Ari0nhh

답변

2

information page about rundll32.exe 설명 같이

  1. 그것은 LoadLibrary() 통해 지정된 DLL을로드한다.
  2. GetProcAddress()을 통해 함수의 주소를 가져옵니다.
  3. 그것은 명령 줄 꼬리를 전달하여 함수를 호출합니다. 귀하의 경우에는

: LoadLibrary()이이 sampledllmain를 호출 DllMain 귀하의 경우, DllMain 호출 호출

  1. .
  2. sampledllmain
  3. 의 주소를 얻습니다. sampledllmain (두 번째)을 호출합니다. 명령 행에
  4. PS를

    • (예를 들어) 두 번째 기능 dummy를 추가
    • 사용 rundll32 "path to DLL",dummy :

문제를 해결하기 위해 당신은 또한 수 추가 메모에서 거기에 DLL을 디버그 guides that describe how to do it

당신은`사용할 수 있도록 dllMain

#include <windows.h> 
__declspec(dllexport) void sample(void) 
{ 
    MessageBox(NULL, "sample text test", "sample title test", 0); 
} 
BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     MessageBox(NULL, "attach", "DllMain", 0); 
     break; 
    case DLL_THREAD_ATTACH: 
     break; 
    case DLL_THREAD_DETACH: 
     break; 
    case DLL_PROCESS_DETACH: 
     MessageBox(NULL, "detach", "DllMain", 0); 
     break; 
    } 
    return TRUE; 
} 

실행 rundll32.exe lib.dll,sample

이 당신의 호출이`DllMain` '로하고'rundll32` 호출과 sampledllmain` 호출
+0

프로세스에서 DLL을로드 할 때 MessageBox를 표시하려고합니다. 하지만 DllMain 함수에서 MessageBox에 직접 호출하면 4 번 호출됩니다. 나는 어딘가에 다른 내보내기 함수를 만들어 DLL_PROCESS_ATTACH와 같은 조건을 기반으로 DLL 메인에서 호출해야한다고 읽었습니다. 그렇다면 DllMain()에 대한 호출시 메시지 상자를 어떻게 표시합니까? –

+0

하지만'rundll32.exe' (매개 변수로 전달)로 왜 두 번째 호출합니까? – dvhh

+0

나는 rundll32를 테스트 용으로 만 사용합니다. DLL을로드 할 때 MessageBox 함수를 한 번만 실행하려면 어떻게해야합니까? LoadLibrary()를 사용하여 DLL을로드하면 DllMain() 함수가 자동으로 호출됩니다.그래서 이상적으로, MessageBox를위한 DllMain()에 직접 호출하면 MessageBox()가 한 번만 실행되어야합니다. 왜 그것은 두 번 이상 일어나는가? 직접 테스트 할 수 있습니다. –

관련 문제