我正在开发一个项目,我正在创建一个小DLL,然后创建一个Windows应用程序来使用它。
我无法弄清楚发生了什么。
我在DLL中有一个名为" startPicadorVisual"的函数。它接受一个参数,即std :: string。
在依赖于DLL的应用程序中,我在一个主要是自动生成的.h文件中有以下代码:
typedef void (__stdcall *f_startPicadorVisual)(string s);
namespace PicadorPrototype {
f_startPicadorVisual startPicadorVisual;
Form1(void) {
//Load DLL Funcs
HINSTANCE hGetProcIDDLL = LoadLibrary(L"..\\Debug\\Picador.dll");
if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
throw "Bad Stuff";
}
startPicadorVisual = (f_startPicadorVisual)GetProcAddress(hGetProcIDDLL, "startPicadorVisual");
if (!startPicadorVisual) {
std::cout << "could not locate the function" << std::endl;
throw "More Bad Stuff";
}
当我调用GetProcAddress时,第二步失败的时候。
我的DLL中的函数定义如下:
void __declspec(dllexport) startPicadorVisual(string fixtureNamet);
PicadorResults __declspec(dllexport) getPicadorReading(string fixtureName);
谁能告诉我为什么这不起作用?
答案 0 :(得分:3)
GetProcAddress
与完全匹配您正在呼叫的功能的名称,则 GetProcAddress
会失败。通过 exact 我的意思是一切 - 构成函数名称的字符,函数名称必须与大小写匹配等。
因此,要么您的DLL导出了一个不同的名称而您没有意识到,或者您根本没有导出该名称。
您可以轻松找到导出的DLL函数的名称,您可以使用此处的Dependency Walker程序:http://www.dependencywalker.com/
此外,使用分配动态内存(如std::string
)作为参数的C ++对象并不是一个好主意。如果这样做,您的DLL将仅适用于
否则,您的代码将具有未定义的行为,即使您已正确检索函数指针,也可能会崩溃。