我在类名之前使用__declspec(dllexport)在c ++中创建了一个dll。现在,当我尝试在另一个c ++程序中使用它时,它会在两者之间崩溃。当我调试它时,我发现函数指针根本没有初始化。帮帮我。
using namespace std;
typedef void (*func)();
int main()
{
func funcpointer;
HINSTANCE xyz = LoadLibrary(TEXT("C:\\extra\\dll\\dlls\\debug\\random.dll"));
funcpointer = (func)GetProcAddress(xyz,"get it");
funcpointer();
return 0;
}
提前致谢。
答案 0 :(得分:2)
首先使用DUMPBIN /EXPORTS yourdll.dll
查看您希望导出的功能是否实际导出及其完全名称。如果你找到了名字" mangled"您可能需要将函数声明为extern "C"
。一旦确定了名称,你的方式就是正确的。加载库后,检查HINSTANCE xyz
是否为空。如果为null,则您可能无法访问dll(不在搜索路径中)或由于某种原因无法加载,例如因为某些依赖项缺失。
答案 1 :(得分:1)
您不仅应该拥有dllexport,还应该检索函数头文件中的整个dllexport / dllimport定义:
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif
extern "C"
{
DECLDIR void foo();
}
您可以阅读DLL Tutorial了解详情。
答案 2 :(得分:1)
导出函数时,请使用extern“C”fndecl。这将有助于获取未修饰的名称或使用def文件。要检查导出函数的名称,请使用工具Dependency Walker(depends.exe)。
如果您有C ++类,我建议您链接到DLL。使用GetProcAddress,使用C ++类会很痛苦。
如果您不熟悉DLL,此链接也可能对您有意义: Walkthrough: Creating and Using a Dynamic Link Library