【发布时间】:2015-08-31 12:40:42
【问题描述】:
在 32 位 DLL 上使用 GetProcAddress() 的正确方法是什么?在win32上,共有三种调用约定,cdecl、stdcall和fastcall。如果 DLL 中的函数是foo,它们将以下列方式装饰名称:_foo、_foo@N 和@foo@N。
但是如果 dll 的作者使用了 .def 文件,那么导出的名称将被更改为“foo”而没有任何修饰。
这给我带来了麻烦,因为如果我想从使用 stdcall 的 dll 加载 foo,我应该使用修饰名称吗:
void *h = LoadLibraryEx(L"foo.dll", NULL, 0);
GetProcAddres((HMODULE)h, L"_foo@16");
或未装饰的:
void *h = LoadLibraryEx(L"foo.dll", NULL, 0);
GetProcAddres((HMODULE)h, L"foo");
?我应该猜吗?我查看了很多 32 位 DLL 文件(stdcall 和 cdecl),它们似乎都导出了未修饰的名称。但是你能假设总是如此吗?
【问题讨论】:
标签: winapi calling-convention stdcall getprocaddress name-decoration