请教一个c++的dll调用的问题,发了N张帖子没多少分了,请见谅
现在手上有一个myDll.dll文件,用查看工具得到的结果是:
void_cdecl Trim(char *)
这个dll的cpp文件是:
- C/C++ code
#ifdef _cplusplus extern "C"{ #endif __declspec(dllexport) void Trim(LPSTR lpString) {········· }
我现在需要在别的dll里面调用这个dll,先进行定义,
typedef void (_cdecl *abc)(char *x); 问题1:这是对的吗?
问题2如下代码调用为什么有错误了?:
- C/C++ code
HMODULE dlh = NULL; abc ab; if (!(dlh=LoadLibrary("myDll.dll"))) { printf("LoadLibrary() failed: %d\n", GetLastError()); //这里没有执行说明,加载成功 } if (!(ab =(abc)GetProcAddress(dlh, "Trim"))){ printf("GetProcAddress() failed: %d\n", GetLastError()); //这里执行了,并且报GetProcAddress() 127的错 }
[解决办法]
问题1写法正确。
问题2:看起来倒没有问题,使用了extern "C",理应不会发生函数名称改编,不过既然GetProcAddress出现了127错误就已经证明了函数名称Trim发生了改编,不知lz使用的是什么编译器?试试这样写会不会起作用?
__declspec(dllexport) void _cdecl Trim(LPSTR lpString);
或者尝试为Trim函数使用def文件强制其不进行名称改编或者尝试使用dll隐式加载。