首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ GetProcAddress不工作

C++ GetProcAddress不工作
EN

Stack Overflow用户
提问于 2016-02-05 22:22:25
回答 1查看 1.3K关注 0票数 0

我有以下代码:

代码语言:javascript
复制
typedef int (WINAPI* fnEngineStart)();


int __stdcall EngineStart()
{
BOOL FreeResult = 0, RunTimeLinkSuccess = 0; //variables for later use
HMODULE LibraryHandle = 0; //Here the handle to API module/dll will be stored.
fnEngineStart fn = 0;

LibraryHandle = AfxLoadLibrary(L"FlowEngine.dll"); //get the handle of our API module
//so it will now be loaded.
if (LibraryHandle != NULL) //if the library loading was successfull..
{
    fn = (fnEngineStart)GetProcAddress(LibraryHandle,
        "fnEngineStart");
    if (RunTimeLinkSuccess = (fn != NULL)) //if operation was successful...
    {
        int ReturnValue = fn(); //call messageboxa function
        //from user32.dll
    }
    else
    {
        MessageBox(0, L"Error", 0, 0);
    }
    FreeResult = FreeLibrary(LibraryHandle);
    //from this process...
    return FreeResult; //routine was successful
}
return EXIT_FAILURE; //else, it failed
}

这段代码对于user32.dll和MessageBoxA来说工作得很好,但我自己的dll却不行……

代码语言:javascript
复制
int __declspec(dllexport) __stdcall fnEngineStart()
{
   MessageBox(0, L"Succes!", 0, 0);
   return 0;
}

我如何让它也适用于我自己的dll?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-02-05 22:30:22

您正在处理的问题是Name Mangling。使用extern "C",这样编译器就不会破坏名称。示例:

代码语言:javascript
复制
extern "C" int __declspec(dllexport) __stdcall fnEngineStart()
{
   MessageBox(0, L"Succes!", 0, 0);
   return 0;
}

注意:__stdcall函数的名称用前导下划线修饰,后跟@,然后是传递到堆栈的参数数量(以字节为单位)。在32位对齐的计算机上,此数字始终是4的倍数。Source

如果您的编译器支持它,您可以在您的dll中执行此操作,并且一切都应该以您现在拥有的方式工作。

代码语言:javascript
复制
extern "C" int __declspec(dllexport) __stdcall fnEngineStart()
{
   #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
   MessageBox(0, L"Succes!", 0, 0);
   return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35226449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档