2013-10-17 165 views
1

我對DLL編程有相當新手。爲什麼GetProcAddress()不工作?

我創建了一個DLL項目作爲,

在DLL項目SimpleH.h

namespace ME{ 
    class base 
    { 
    public: 
     static __declspec(dllexport) void Hello(); 
    }; 
} 
__declspec(dllexport) void HelloWorld(); 

DLL.cpp

#include "stdafx.h" 
#include <iostream> 
#include "SimpleH.h" 
using namespace std; 
namespace ME 
{ 
    void base::Hello() 
     { 
      cout << "Hello World\n"; 
     } 
} 
void HelloWorld() 
{ 
    cout << "Hello I am world\n"; 
} 

我已經創建了一個.exe

Main.exe

#include "stdafx.h" 
    #include <stdlib.h> 
    #include <Windows.h> 
    #include <iostream> 

    using namespace std; 
    typedef void (*FunctionFunc)(); 
    typedef void (*FunctionAno)(); 
    int _tmain(int argc, _TCHAR* argv[]) 
    { 

     FunctionFunc _FunctionFunc; 
     FunctionAno _FunctionAno; 
     HINSTANCE hInstLibrary = LoadLibrary(L"MyDLL.dll"); 
     if(hInstLibrary) 
     { 
      /*Problem Happens here*/ 
      _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Hello"); 
      _FunctionAno = (FunctionFunc)GetProcAddress(hInstLibrary, "HelloWorld"); 
/**/ 
      if(_FunctionFunc) 
      { 
       _FunctionFunc(); 
      } 
      if(_FunctionAno) 
      { 
       _FunctionAno(); 
      } 
      DWORD error = ::GetLastError(); 
      if (error) 
      { 
      LPVOID lpMsgBuf; 
      LPVOID lpDisplayBuf; 

      FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | 
      FORMAT_MESSAGE_FROM_SYSTEM | 
      FORMAT_MESSAGE_IGNORE_INSERTS, 
      NULL, 
      error, 
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
      (LPTSTR) &lpMsgBuf, 
      0, NULL); 

      } 
     } 
     FreeLibrary(hInstLibrary); 
     system("pause"); 
     return 0; 
    } 

的hInstance是越來越正確更新。 但GetProcAddress()沒有得到更新。 請幫幫我。 哪裏出問題了?

+0

您可能想閱讀[C++中的名稱修飾](http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B)。 –

+0

[GetProcAddress可能找不到我的函數](http://stackoverflow.com/questions/2601908/getprocaddress-cannot-find-my-functions) – librik

+0

@librik某種重複,但外部「C」技巧贏得不工作的靜態成員函數(或將?) – manuell

回答

2

導出的函數具有「裝飾名稱」。使用DUMPBIN查看它們。

DUMPBIN/EXPORTS Your.dll

+0

我需要在哪裏寫它?它是在「Propoties」還是在「CPP」文件中? –

+0

使用GetProcAddress調用中的裝飾名稱。 – manuell

1

你的函數和方法的名稱是mangled according to Visual C++ rules

如果使用DUMPBIN /EXPORTS MyDLL.dll在命令行中,你會讀到像一些標識符名稱:

 1 0 00001000 [email protected]@[email protected]@SAXXZ 
    2 1 00001020 [email protected]@YAXXZ 

因此,舉例來說,HelloWorld實際上導出爲[email protected]@YAXXZ。所以GetProcAddress()找不到原始標識符。使用extern "C"避免名字改編上HelloWorld:在適當的方式

extern "C" __declspec(dllexport) void HelloWorld(); 

更多細節從DLL導出C++類可以this CodeProject article找到。