最近遇到一个问题:
    前置应用程序规定了动态链接库的函数接口如下(C++ Builder格式):
      stdcall int write_card(char *deviceList, char *callPwd, char *dataItemList, char*returnData, char *errorMsg)
    其中参数errorMsg是要返写的,也就是说应用程序判断到write_card返回值不为0时,要显示errorMsg的具体内容    我要用delphi写一个dll来实现write_card这个函数,发现我无法在dll中对errorMsg变量进行赋值操作,代码如下:function read_card(deviceList, callPwd, readParam,dataItemList,
                   errorMsg:pchar):Integer;stdcall;export;
begin
  …………………………
  readParam := Pchar('01000=1&01001=1&01002=16&') ;
  Result:=0;
end;以上编译能通过,但调用的时候出现内存错误,而且跟踪调试的时候发现readParam的直接赋值语句根本不让执行)。另外我尝试写成如下:
var
  buf:array [0..100] of char;
begin
  strcopy(buf,pchar('01000=1&01001=1&01002=16&'));
  GetMem(readParam, sizeof(char) * 100);
  strcopy(readParam,@buf);
  FreeMem(readParam); }
  Result:=0;
end;
编译和调用的都不会出错,但是应用程序无法取得readParam这个变量的值因为动态库的接口是别的公司定义好的,无法更改,请教一下该如何解决???     

解决方案 »

  1.   

    不是说是errorMsg吗 怎么又是readParam了
      

  2.   

    function read_card(deviceList,callPwd,readParam,dataItemList,errorMsg:pchar):Integer;stdcall;export; 
    begin 
        ………………………… 
        strcopy(errorMsg,PChar('01000=1&01001=1&01002=16&'));
        Result:=0; 
    end; 
      

  3.   

    回1楼:
        实际readParam也是需要返写的,我前面说明里面漏了回2楼:
        按照您的方法试过了,编译通过,并且断点跟踪errorMsg的值也已经改成了'01000=1&01001=1&01002',但是调用的时候出现运行错误,大意就是某个地址的内存写出错
      

  4.   

    用c++调用的时候
    需要先给errorMsg分配内存  errorMsg=new char[80];
    或者char errorMsg[80];
    静态数组