当前位置:编程学习 > C#/ASP.NET >>

c#调用一个dll返回一个大字符串时出错

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返回一个小字符串是不会出错,返回一个大字符串是会出错,不知道为什么?
哪位大侠帮看看啊,多谢~:) --------------------编程问答-------------------- 看样子是*szVar空间不够呀。
看看c语言的内容。 --------------------编程问答--------------------
     char *buf[100]={""};
     Foo(buf);
c++中的调用方法是
--------------------编程问答-------------------- 参数是二级指针 --------------------编程问答-------------------- 用sb试试


--------------------编程问答-------------------- 这个DLL如果是你写的,可以改一下DLL的函数,要一个*就可以了。

extern "C" __declspec(dllexport) int __stdcall Foo(char* szVar)
{
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 = "";
替换为

string strRet = new string('\0', 100);
--------------------编程问答-------------------- 将string改为StringBuilder后好一些
但是当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经常程序崩溃
大家可以验证下,有没有完美的解决方法啊?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,