应该是在应用程序中分配吧! 我的dll中定义了var str Pchar 在应用程序中调用前也定义了 var str Pchar 我也不知道是怎么回事的?
我现在用的Dll导出的函数比较多,抄一部分吧。要不你给我个邮箱,我发一个比较全的给你。pchar是delphi内定类型,其实也就相当于c语言里面的字符数组,实现实符串操作。比string用起来要烦一些,但是与Dll交互用string又烦了。Dll中: library cio;uses SysUtils, Classes, u_Comm in 'u_Comm.pas' {frm_Comm}, u_protocol in 'u_protocol.pas';exports //串口操作 InitComm, //初始化指定串口 CheckComm, //检查串口是否已经打开 CloseComm; //关闭指定串口,最后一个用分号,前面的用逗号隔开。end; 所有的函数在各个模块中实现。例如一个传字符串的函数如下: function KQ_QueryInfoByCardno(const iDeviceID:integer;var pcCardno:pchar):integer;//查询指定的卡号是否已经注册: var sin,sout:string; begin if not CheckComm then begin result:=E_CONNECT; exit; end; sin:=string(pcCardno); result:=ProcessPacket(sout,sin,WAITTIME_LONG); if result=E_OK then begin Unpacket(sin); sout:=copy(sin,5,6); strCopy(pcCardno,pchar(sout)); end; writelog('查卡号: '+sin) end;在主程序中,调用Dll的函数如下: procedure QueryInfo; var pcCardno:pchar; errno:integer; begin getmem(pcCardno,12); strCopy(pcCardno,pchar('1258FB3F')); errno:=KQ_QueryInfoByCardno(devices[ideviceid],pccardno); if errno <> 0 then showmessage('查询失败') else showmessage('查询成功'); freemem(pcCardno); end; 这个是我正在用的,还有一些错误检查之类,很长。但关键的部分这里应该可以看得出来了。
我的dll中定义了var str Pchar
在应用程序中调用前也定义了 var str Pchar
我也不知道是怎么回事的?
library cio;uses
SysUtils,
Classes,
u_Comm in 'u_Comm.pas' {frm_Comm},
u_protocol in 'u_protocol.pas';exports
//串口操作
InitComm, //初始化指定串口
CheckComm, //检查串口是否已经打开
CloseComm; //关闭指定串口,最后一个用分号,前面的用逗号隔开。end;
所有的函数在各个模块中实现。例如一个传字符串的函数如下:
function KQ_QueryInfoByCardno(const iDeviceID:integer;var pcCardno:pchar):integer;//查询指定的卡号是否已经注册:
var
sin,sout:string;
begin
if not CheckComm then
begin
result:=E_CONNECT;
exit;
end;
sin:=string(pcCardno);
result:=ProcessPacket(sout,sin,WAITTIME_LONG);
if result=E_OK then
begin
Unpacket(sin);
sout:=copy(sin,5,6);
strCopy(pcCardno,pchar(sout));
end;
writelog('查卡号: '+sin)
end;在主程序中,调用Dll的函数如下:
procedure QueryInfo;
var
pcCardno:pchar;
errno:integer;
begin
getmem(pcCardno,12);
strCopy(pcCardno,pchar('1258FB3F'));
errno:=KQ_QueryInfoByCardno(devices[ideviceid],pccardno);
if errno <> 0 then
showmessage('查询失败')
else
showmessage('查询成功');
freemem(pcCardno);
end;
这个是我正在用的,还有一些错误检查之类,很长。但关键的部分这里应该可以看得出来了。