2012-04-20 146 views
2

我有以下代碼:GetProcAddress函數 - 返回NULL

//mydll.cpp 
    #include <Windows.h> 
    #include <io.h> 

    #define STDOUT_FILEDESC 1 

    class MYSTDOUT { 
     bool shouldClose; 
     bool isBuffered; 
    public: 
     MYSTDOUT(bool buf = true, bool cl = true) 
      : isBuffered(buf), 
       shouldClose(cl) 
     {} 
     ~MYSTDOUT() { 
      if (shouldClose) { 
       close(STDOUT_FILEDESC); 
      } 
     } 
    }; 

    __declspec(dllexport) void* mydll_init_stdout() 
    { 
     static MYSTDOUT outs; 
     return &outs; 
    } 
//test_dll.cpp 
#include <stdio.h> 
#include <stdlib.h> 
#include <Windows.h> 
#include <io.h> 


typedef void* (__cdecl *MYPROC)(void); 


int main(void) 
{ 
    int fd; 
    void *pstdout; 

    MYPROC init_stdout; 
    HMODULE handle = LoadLibrary(TEXT("mydll.dll")); 

    init_stdout = (MYPROC)GetProcAddress(handle,"mydll_init_stdout");//NULL 

    FreeLibrary((HMODULE) handle); 
    return 0; 
} 

我得到init_stdout是NULL.What可能是一個問題嗎? 手柄OK(NOT NULL) 謝謝

回答

7

這是由於名稱的問題。

你需要用導出功能extern "C"爲:

extern "C" 
{ 
    __declspec(dllexport) void* mydll_init_stdout() 
    { 
     static MYSTDOUT outs; 
     return &outs; 
    } 
} 
9

有一個支票的Dependency Walker,或dumpbin /exports,你會看到mydll_init_stdout已出口了錯位的C++名稱。這就是爲什麼GetProcAddress呼叫失敗。

使用extern "C"可以防止損壞。

extern "C" 
{ 
    __declspec(dllexport) void* mydll_init_stdout() 
    { 
     static MYSTDOUT outs; 
     return &outs; 
    } 
}