我在C++中创建了dll,并且想用c#调用函数。如果函数,程序调用,返回字符串,我有一个错误。 DLL的代码:在从C#代码调用dll函数时出错代码
#include <string>
using namespace std;
#define EXPORT_API extern "C" __declspec(dllexport)
EXPORT_API void DllFunc()
{
MessageBoxA(0,"DDL box", "Yeah!", 0);
}
EXPORT_API string DllFuncStr()
{
return "testStr";
}
C#应用程序代码:
[DllImport("dllka.dll")]
static extern void DllFunc();
[DllImport("dllka.dll")]
static extern string DllFuncStr();
private void btnStart_Click(object sender, RoutedEventArgs e)
{
DllFunc();
string str = DllFuncStr();
}
“DllFunc();” - 工作很好,但在线“字符串str = DllFuncStr();”我有一个错误:
运行时遇到一个致命错误。错误的地址是0x5e6dceca,线程0x16b0。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码中不安全或不可验证的部分。此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈。
什么是错的字符串类型?如何解决这个问题?
这是一个很好的方法。但是,添加一个说明缓冲区有多大的参数是至关重要的。不这样做会因缓冲区溢出而导致堆损坏,非常难以调试。通过StringBuilder.Capacity。另外,strcpy_s()很好,但是你使用不正确。如果您传递字符串长度而不是缓冲区长度,它可以*从不*提供保护。 – 2011-03-19 21:32:22
谢谢。我修复了代码。 – jing 2011-03-19 21:45:37
你做到了。但是要么使用strcpy()要么修复strcpy_s()参数。让它轰炸程序通常是更好的选择顺便说一句,布尔返回值往往被忽略。不幸的是,这是一个非常不友好的炸弹。 – 2011-03-19 22:57:50