请问我在dll中使用了spcomm控件,现在打开串口后关闭串口都正常,但再次打开串口时就打不开了,请问是为什么? ( 积分: 100 )

  • 主题发起人 主题发起人 doby_li
  • 开始时间 开始时间
D

doby_li

Unregistered / Unconfirmed
GUEST, unregistred user!
请问我在dll中使用了spcomm控件,现在打开串口后关闭串口都正常,但再次打开串口时就打不开了,请问是为什么?
dll的源文件为:
library Project1;
uses
SysUtils,
Classes,
spcomm;

{$R *.res}

function opencomm(scomm:pchar):LongBool;stdcall;
var
comm1:TComm;
begin
comm1:=TComm.Create(nil);
try
try
comm1.CommName:=scomm;
Comm1.StartComm;
Result:=true;
except
Result:=false;
end;
finally
comm1.Free;
end;
end;

function closecomm(scomm:pchar):LongBool;stdcall;
var
comm1:TComm;
begin
comm1:=TComm.Create(nil);
try
try
comm1.CommName:=scomm;
Comm1.stopComm;
Result:=true;
except
Result:=false;
end;
finally
comm1.Free;
end;
end;


exports
opencomm,closecomm;
begin
end.

调用程序的相关代码为:
function opencomm(scomm:string):longbool;stdcall;external 'project1.dll';
function closecomm(scomm:string):longbool;stdcall;external 'project1.dll';
打开串口的按纽:
procedure TFCOMM.btnopenClick(Sender: TObject);
begin
if opencomm(slt_com.Text) then
begin
label5.Caption:=slt_com.Text+'口已经打开!';
btnopen.Enabled:=false;
btnclose.Enabled:=true;
tagcomm:='open';
messagedlg('打开'+slt_com.Text+'串口成功!',mtinformation,[mbyes],0);
end;
else
messagedlg('打开'+slt_com.Text+'串口时失败,可能该串口已被占用或不存在,请换另一个串口!',mterror,[mbyes],0);

end;

关闭串口的按纽:
procedure TFCOMM.btncloseClick(Sender: TObject);
begin
if closecomm(slt_com.Text) then
begin
label5.Caption:=slt_com.Text+'口已经关闭!';
btnclose.Enabled:=false;
btnopen.Enabled:=true;
tagcomm:='close';
messagedlg('关闭'+slt_com.Text+'串口成功!',mtinformation,[mbyes],0);
end;
else
messagedlg('关闭'+slt_com.Text+'串口时失败,可能该串口不存在或尚未打开!',mterror,[mbyes],0);
end;

请高手指点,谢谢。
 
高手们啊,帮我看一下呀。
 
在function opencomm(scomm:pchar):LongBool;stdcall;中,comm1一free就关闭串口了,这种情况下你再编写个closecomm函数是没有必要的,

如果你确实需要单独的OpenComm和CloseComm,那么应该将comm1变量设为Dll内的全局变量,而不是某个函数体内的局部变量。同时注意,在OpenComm函数体内不要释放comm1对象。
 
TComm;用全局变量
 
用全局变量,或者把TComm作为参数传入。
 
非常感谢stargazer大哥和zj_mpy,
这个问题是这样搞定了。
 
多人接受答案了。
 
后退
顶部