2

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

4

2 回答 2

4

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

DUMPBIN /EXPORTS Your.dll

于 2013-10-17T09:36:06.920 回答
2

您的函数和方法名称根据Visual C++ 规则进行了修改。

如果您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++ 类的正确方法的更多详细信息,请参阅此 CodeProject 文章

于 2013-10-17T10:47:53.717 回答