【发布时间】:2014-10-14 16:28:25
【问题描述】:
我需要在 C++ 中动态加载一个 dll。
我已按照本教程http://msdn.microsoft.com/en-us/library/ms235636.aspx 创建了 dll,一切正常。
然后我关注了这个http://msdn.microsoft.com/en-us/library/64tkc9y5.aspx,并调整了控制台应用程序如下:
typedef DOUBLE(CALLBACK* DllFunc)(DOUBLE, DOUBLE);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDLL; // Handle to DLL
DllFunc dllFunc1;
DOUBLE p1 = 1.0, p2 = 2.0, r;
hDLL = LoadLibrary(L"MathFuncsDLL");
if (hDLL != NULL)
{
cout << "DLL loaded: " << hDLL << endl;
dllFunc1 = (DllFunc)GetProcAddress(hDLL, "MyMathFuncs@MathFuncs@Multiply");
if (!dllFunc1)
{
// handle the error
FreeLibrary(hDLL);
cout << "Function not found!" << endl;
return -1;
}
else
{
// call the function
r = dllFunc1(p1, p2);
cout << "The result is: " << r << endl;
}
}
else {
cout << "Dll not found" << endl;
return -1;
}
cout << "Press any key to exit." << endl;
int i;
cin >> i;
return 0;
}
DLL 已正确加载且不为空。问题是 GetProcAddress() 函数总是返回 0。
我已经尝试过命名空间、类名、方法名的所有组合。我尝试在函数名中使用范围运算符 (::) 而不是 @。
我尝试将整个命名空间定义为 外部“C” 但没有任何改变。每次我运行或调试控制台应用程序时,它都找不到“乘法”功能。
我想我错过了什么... 我哪里错了?
编辑
Dependency Walker 向我展示了以下导出表:
现在我想知道函数名的最后一部分是什么意思... 为什么 __declspec(dllexports) 添加这些符号?
【问题讨论】:
-
请转储你的 dll 的符号,然后添加。
-
很难猜出你从哪里得到这个名字,看起来你只是猜到了。对于 MSVC++ 编译器,它应该是 "?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z"。使用 DLL 上的 Dumpbin.exe /exports 查看名称。通过链接 DLL 项目生成的 .lib 文件,您可以避免做这种可怕的事情。
-
您使用显示导出名称的屏幕截图更新了问题。因此,我们当然完成了。你还期待什么?
-
仅此而已,实际上...出于好奇,我在问为什么编译器会添加这些符号.. Khouri Giordano 的回答如下,解释一下! ;)
标签: c++ dll dllexport dynamic-loading getprocaddress