日期:2014-05-17  浏览次数:20967 次

C#调用Delphi的dllPchar传参不稳定的情况
C#声明如下
[DllImport("yy_mzsfjk.dll")]
        public static extern string fHisMzsf(int a, object BasicInfo, object RecipeInfo);
Delphi声明
 function fHisYjsf(aHandle:Integer;aBasicInfo :OleVariant;aRecipeInfo:OleVariant):PChar;stdcall;


在Delphi中返回的一个Result :=Pchar('T');
在C#中调用函数
            object[] a = new object[4];
            a.SetValue(patinfo[0].ToString(), 0);
            a.SetValue(patinfo[1].ToString(), 1);
            a.SetValue(patinfo[2].ToString(), 2);
            a.SetValue(patinfo[3].ToString(), 3);
            object[] b = new object[1];
            b.SetValue(cfinfo[0].ToString(), 0);
         string s = fHisMzsf(0, a, b);
在上面执行的那一句的时候我跟过,有时候会得到s 有时候就直接程序崩溃,
(不崩溃的情况是直接调用这个函数,不做其他任何操作,如果做其他操作,比如前面做一段业务处理等就会崩溃,怀疑和内存资源释放有关系,GC.Collect()没有效果)
不知道何解?
delphi函数中的所有操作都成功执行了,我在里面最后加上的
showmessage('T');
Result :=Pchar('T') ;
exit;
得到message能show出来。

不知道有哪位见过没有

------解决方案--------------------
这应该和你的参数类型有关,OleVariant对应的什么类型,这个要考虑一下,应该可以传递字节流
------解决方案--------------------
把你在Delphi使用fHisYjsf这个函数的几行代码贴出来看看。。
------解决方案--------------------
改成这样试试:

[DllImport("yy_mzsfjk.dll",CallingConvention=CallingConvention.StdCall)]
  public static extern string fHisMzsf(IntPtr a, object BasicInfo, object RecipeInfo);

------解决方案--------------------
在工程的调试属性:勾上启用非托管代码调试,F11进入非托管代码,看看问题到底处在哪里?