dll问题,请高手指点。
implementation
function opencomm(port:integer):boolean;stdcall;
external 'ZComm.dll';
function closecomm(port:integer):boolean;stdcall;
external 'ZComm.dll';
function ztccomm(port:integer;resdata:pchar;inpdata:Pchar):integer;stdcall;
external 'ZComm.dll';
这是我申明部分
但在调用ztccomm()函数时出现以下错误:
"Access violation at address 00241ff9 in module 'ZComm.dll',read of address 01104000"
我在DLL中ztccomm的函数是这么写的:
function ztccomm(port:integer;resdata:pchar;inpdata:Pchar):integer;stdcall;
label lerrorwait,lwaitdata;
var
outbuff:Pchar;
buff:Pchar;
currentbag:integer;
inbuff:array[0..254] of byte;
i:integer;
restimer:integer;
param:integer;
begin
result:=-2;
restimer:=0;
outbuff:=resdata;
buff:= inpdata;
currentbag:=1;
while outbuff[3] > #0 do
begin
writecomm(1,outbuff,ord(outbuff[4]));
inc(restimer);
if restimer >3 then
begin
result :=-1;
exit;
end
else
begin
param:=readcomm(1,1000,300,Pchar(@inbuff[0]));
if param>0 then
begin
if jugeright(Pchar(@inbuff[0]),param) then
begin
if (inbuff[0]=ord('N')) and (inbuff[1]=ord('P')) then
begin
inc(outbuff,byte(outbuff[4]));
restimer:=0;
end;
end;
end;
end;
end;
writecomm(1,outbuff,ord(outbuff[3]));
param:=readcomm(1,30000,300,Pchar(@inbuff[0]));
if param >0 then
begin
lerrorwait:
if jugeright(Pchar(@inbuff[0]),param) then
begin
if (inbuff[0]=ord('O')) and (inbuff[1]=ord('K')) then
begin
while inbuff[2] >0 do
begin
NPNext(inbuff[2]);
if currentbag = inbuff[3] then
begin
inc(buff,ord(buff[3]));
inc(currentbag);
end;
for i:= 0 to inbuff[3]-1 do
buff[i]:=chr(inbuff[i]);
lwaitdata:
param:=readcomm(1,1000,300,Pchar(@inbuff[0]));
if param >0 then
begin
if not jugeright(Pchar(@inbuff[0]),param) or (inbuff[0]<>ord('O')) or (inbuff[1]<>ord('K'))then
goto lwaitdata;
end
else
begin
result:=-5;
exit;
end;
end;
NPNext(inbuff[2]);
{dispose data}
if currentbag >1 then
begin
inc(buff,ord(buff[3]));
end;
for i:= 0 to inbuff[3]-1 do
buff[i]:=chr(inbuff[i]);
//inc(buff,inbuff[3]);
result :=0;
exit;
end;
if (inbuff[0]=ord('E')) and (inbuff[1]=ord('R')) then
begin
NPNext(inbuff[2]);
for i:= 0 to inbuff[3]-1 do
buff[i]:=chr(inbuff[i]);
//inc(buff,inbuff[3]);
result :=0;
exit;
end;
if (inbuff[0]=ord('W')) and (inbuff[1]=ord('T')) then
begin
param:=readcomm(1,30000,300,Pchar(@inbuff[0]));
if param >0 then
goto lerrorwait
else
begin
result:=-4;
exit;
end;
end;
end
else
begin
param:=readcomm(1,1500,300,Pchar(@inbuff[0]));
if param >0 then
goto lerrorwait
else
begin
result:=-3;
exit;
end;
end;
end
else
begin
result:=-2;
exit;
end;
end;
其他两个函数都是可以用的。这是为什么,请高手指点,分不够再加!