为啥 GetProcAddress() 不起作用?

Posted

技术标签:

【中文标题】为啥 GetProcAddress() 不起作用?【英文标题】:Why GetProcAddress() is not working?为什么 GetProcAddress() 不起作用? 【发布时间】:2013-10-17 09:12:54 【问题描述】:

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

【问题讨论】:

您可能想了解name mangling in C++。 GetProcAddress cannot find my functions的可能重复 @librik 某种重复,但是 extern "C" 技巧不适用于静态成员函数(或者会吗?) 【参考方案1】:

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

DUMPBIN /EXPORTS Your.dll

【讨论】:

我需要在哪里写?是在Propoties 还是CPP 文件中? 在 GetProcAddress 调用中使用修饰名称。【参考方案2】:

您的函数和方法名称是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。

【讨论】:

以上是关于为啥 GetProcAddress() 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 preventDefault 不起作用?

为啥 innerHtml 不起作用

为啥第二个(兄弟)React Context Provider 不起作用?或者,如果上面有同级 Context Provider,为啥 React Context Provider 不起作用

修改php.ini不起作用是为啥

为啥这种方法不起作用?

为啥(ngModel)不起作用?