我用.net调用delphi写的动态链接库返回值是pchar
.net调用代码
 [DllImport("QBSqlData.dll", CharSet = CharSet.Ansi, PreserveSig = false)]
        public static extern string SelectSqlData(ref StringBuilder sbStr);
        //public static extern StringBuilder SelectSqlData(); 
        protected void Page_Load(object sender, EventArgs e)
        {
            StringBuilder sbStr = new StringBuilder(102400);
            string s = SelectSqlData(ref sbStr);
            Div1.InnerText = sbStr.ToString();
        }delphi动态库函数
function SelectSqlData(var sbStr:PChar):string;stdcall;       HotelConNet.ReadDataset('SELECT top 50 * FROM feeitem ',cdsData);
      GetMem(SS,102400);
      GetMem(sbStr,102400);
      SS:=PChar(cdsData.XMLData+char(#0));
      sbStr:=SS;
      str:='1';
      Result:=str;返回值sbStr是一个大容量xml数据集。如果只返回一两条记录则是成功的,返回10条以上就被截断了。
delphi动态库.net调用delphiPcharstringbuilder

解决方案 »

  1.   

    不知道具体原因,但发现一些问题,
    sbStr在调用前已经分配了内存空间,为何在 Delphi 中又重新分配?
    返回数据为何用赋值操作,我认为要用复制到 sbStr 的操作吧。
      

  2.   

    Delphi函数返回值最好设成整型
      

  3.   

    str是局部变量,离开函数的时候就被释放了,pchar内存不保证是正确的.
    其实你也可以用widestring这个是COM所支持的.
      

  4.   

    function SelectSqlData(var sbStr:PChar):string;stdcall; 
    这不需要这样义
    而是:
    function SelectSqlData(sbStr:PChar):string;stdcall; 这个sbStr是外面分配好的传进来的在函数内部不能重新分配
    GetMem(sbStr,102400);这个是多余的,并且也不对下面这句 sbStr:=SS;也是不对的
    而是应该COPY,怎么能直接把指针地址赋值呢CopyMemory(sbStr,SS,102400);这样才把数据真的给了sbStr
         
      

  5.   

    CopyMemory(sbStr,SS,102400);会报错  [错误] SqlData.pas(78): Undeclared identifier: 'CopyMemory'
      

  6.   


    CopyMemory(sbStr,SS,102400);会报错  [错误] SqlData.pas(78): Undeclared identifier: 'CopyMemory'
      

  7.   

    老兄,这种基础问题还得问么,没用引用相关的单元啊,
    CopyMemory是在Windows中定义的
      

  8.   


    明白了,不好意思,我的delphi只接触了两天。非常感谢您的帮助,经过测试,.net已经能够顺利接收到值了。