我正忙着了解一点C / C ++,并与C#互操作。我已经检查了几个创建一个简单的Win32 DLL并使用它来自C#的例子,但是当我尝试调用我的DLL时,我得到了运行时错误:“无法找到名为TestFunc的入口点”。我的DLL看起来像这样,我用Win32 DLL项目创建它,使用空项目选项:
部首:
__declspec(dllexport) int TestFunc(char *, char *, char *);
代码文件:
#include "stdafx.h"
#include "TestLib.h"
__declspec(dllexport) int TestFunc(char *arg1, char *arg2, char *arg3)
{
char str1[] = "Brady Kelly";
char str2[] = "Hello World";
char str3[] = "1234567890";
strcpy(arg1, str1);
return 128;
}
我做错了什么?
答案 0 :(得分:6)
您的函数是使用C或C ++绑定编译的吗?你没有指定,但它看起来像你有可能使用C ++编译器 - 编译器使用与C编译器非常不同的名称修改,你将无法简单地找到名称“TestFunc”好像您正在使用C编译器或使用C名称修改规则。
要简单地告诉C ++编译器使用C名称修改规则,请在头文件中使用它:
extern "C"
{
__declspec(dllexport) int TestFunc(char *, char *, char *);
}
答案 1 :(得分:2)
此外,您只需要在函数声明(在头文件中)前面的declspec,而不是定义。用于检查从DLL导出的内容以及DLL所依赖的内容的有用工具是Dependency Walker。
答案 2 :(得分:2)
实际上,由于您已将此问题标记为C,我建议对1800 INFORMATION的解决方案进行一些细微更改:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef EXPORT_MODE
#define METHODTYPE __declspec(dllexport)
#else
#define METHODTYPE __declspec(dllimport)
#endif
#ifdef __cplusplus
}
#endif
/*! _The_ method */
METHODTYPE int TestFunc(char *, char *, char *);
这将允许您在客户端代码和代码中使用相同的标头。
NB: Dependency Walker不再与VS2008捆绑在一起。如果您使用的是VS2008,则必须下载它。