最近遇到一个问题:
前置应用程序规定了动态链接库的函数接口如下(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这个变量的值因为动态库的接口是别的公司定义好的,无法更改,请教一下该如何解决???
前置应用程序规定了动态链接库的函数接口如下(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这个变量的值因为动态库的接口是别的公司定义好的,无法更改,请教一下该如何解决???
解决方案 »
- Delphi中使代码简洁的 5 条忠告
- 关于一个panel嵌套一个form的问题 ~ 又急又汗
- 求一排序题,谢谢啦!
- [ ? ] 到底能不能修改rtl.bpl中所包含的单元的源码?
- 关于在Delphi中读取Access中已存在的图片
- 请问,开发多层分布式数据库网络系统与XML有何区别?
- 如何让用户自己设置报表格式
- FASTREPORT做Master-detail-subdetail 报表的问题 !!
- 关于WIN2K的快速查看
- 如何用一个变量可以同时来代替Tedit或Tcombobox的实例,以引用它们共有的属性
- 终止循环的问题?求助各位大哥
- delphi里怎么把 String类型转换到 Tbitmap类型
begin
…………………………
strcopy(errorMsg,PChar('01000=1&01001=1&01002=16&'));
Result:=0;
end;
实际readParam也是需要返写的,我前面说明里面漏了回2楼:
按照您的方法试过了,编译通过,并且断点跟踪errorMsg的值也已经改成了'01000=1&01001=1&01002',但是调用的时候出现运行错误,大意就是某个地址的内存写出错
需要先给errorMsg分配内存 errorMsg=new char[80];
或者char errorMsg[80];
静态数组