DLL导出部分如下:
extern "C" __declspec(dllexport) int __stdcall Foo(char** szVar)
{
//strcpy(*szVar, "123"); //1
strcpy(*szVar, "123456123456123456123456123456"); //2
return 0;
}调用时声明部分如下:
public class Process {
[DllImport("Process.dll", CharSet = CharSet.Ansi)]
public static extern int Foo([MarshalAs(UnmanagedType.LPStr)]ref string szVar);
}调用时声明部分如下:
string strRet = "";
Process.Foo(ref strRet);
TextBox1.Text = strRet;上述//1不会出错,//2会出错,即C#调用DLL返回一个小字符串是不会出错,返回一个大字符串是会出错,不知道为什么?
哪位大侠帮看看啊,多谢~:)
extern "C" __declspec(dllexport) int __stdcall Foo(char** szVar)
{
//strcpy(*szVar, "123"); //1
strcpy(*szVar, "123456123456123456123456123456"); //2
return 0;
}调用时声明部分如下:
public class Process {
[DllImport("Process.dll", CharSet = CharSet.Ansi)]
public static extern int Foo([MarshalAs(UnmanagedType.LPStr)]ref string szVar);
}调用时声明部分如下:
string strRet = "";
Process.Foo(ref strRet);
TextBox1.Text = strRet;上述//1不会出错,//2会出错,即C#调用DLL返回一个小字符串是不会出错,返回一个大字符串是会出错,不知道为什么?
哪位大侠帮看看啊,多谢~:)
看看c语言的内容。
Foo(buf);c++中的调用方法是
{
strcpy(szVar, "123456123456123456123456123456"); //2
return 0;
}
调用的时候最好用stringBuilder
public class Process {
[DllImport("Process.dll", CharSet = CharSet.Ansi)]
public static extern int Foo([MarshalAs(UnmanagedType.LPStr)]stringBuilder szVar);
}
替换为string strRet = new string('\0', 100);
但是当Dll改为如下时仍然出错extern "C" int _declspec(dllexport) __stdcall Foo(char** szVar)
{
for (int i=0; i<10; i++) //1
//for (int i=0; i<100; i++) //2
strcat(*packageName, "123456");
return 0;
}
情况和之前类似//1时很少出错,//2经常程序崩溃
大家可以验证下,有没有完美的解决方法啊?