为什么GetProcAddress()不起作用?

时间:2013-10-17 09:12:55

标签: c++ windows visual-studio-2010 dll

我对DLL编程非常新手。

我创建了一个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()没有得到更新。 请帮我。 哪里出错了?

2 个答案:

答案 0 :(得分:3)

导出的函数具有“装饰名称”。使用DUMPBIN查看它们。

DUMPBIN / EXPORTS Your.dll

答案 1 :(得分:1)

您的函数和方法名称为mangled according to Visual C++ rules

如果从命令行使用DUMPBIN /EXPORTS MyDLL.dll,您将读取一些标识符名称,如:

     1    0 00001000 ?Hello@base@ME@@SAXXZ
     2    1 00001020 ?HelloWorld@@YAXXZ

因此,例如,HelloWorld实际上已导出为?HelloWorld@@YAXXZ。因此GetProcAddress()找不到原始标识符。使用 extern "C" 来避免HelloWorld上的名称错位:

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

有关从DLL导出C ++类的正确方法的更多详细信息,请参见this CodeProject article