一个奇怪的问题! ( 积分: 20 )

  • 主题发起人 主题发起人 sosmao
  • 开始时间 开始时间
S

sosmao

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Delphi 7中调用 C 写的Dll文件,我用的是动态调用,共用了其中的两个函数.其中一个可以正常运行,另一个则必需要引用静态调用:先看看程序还有更奇怪的事情发生:<br>var<br> &nbsp;Form1: TForm1;<br> &nbsp;Type TOpen_ComX=Function(Comport:Pchar;Band:Integer):Integer;Stdcall;<br> &nbsp;Type TSearchAR=Function(AD_ID:Integer):Integer;Stdcall;<br> &nbsp;Type TClose_ComX=Function():Integer;Stdcall;<br>implementation<br>function Search(AR_ID:Integer):Integer; Stdcall external 'JBC_Attend.dll'name 'SearchAR';<br><br>{$R *.dfm}<br>procedure TForm1.BitBtn1Click(Sender: TObject);<br>//调用方式:动态调用<br>//功能:打开串口<br>Var<br>Open_ComX1:TOpen_ComX;<br>Handle:THandle;<br>Comport:Pchar;<br>Band:Integer;<br>begin<br> &nbsp; Comport:='COM1';//设置Com1口<br> &nbsp; Band:=9600; &nbsp;//设置速率<br> &nbsp; Handle:=LoadLibrary('JBC_Attend.dll');<br> &nbsp; Open_ComX1:=GetProcAddress(Handle,'Open_ComX');<br> &nbsp; If Open_ComX1(Comport,Band)=0 Then Edit1.Text:='Com1 口开启成功'<br> &nbsp; Else Edit1.Text:='Com1 口开启失败';<br> &nbsp; FreeLibrary(Handle);<br>end;<br><br>procedure TForm1.BitBtn2Click(Sender: TObject);<br>//调用方式:动态调用<br>//功能:搜索卡钟<br>Var<br>Search1:TSearchar;<br>Handl:THandle;<br>AD_ID:Integer;<br>begin<br> &nbsp;AD_ID:=1;<br> &nbsp;Handl:=LoadLibrary('JBC_Attend.dll');<br> &nbsp;Try<br> &nbsp;Search1:=GetProcAddress(Handl,'SearchAR');<br> &nbsp;If (Search1(AD_ID1)=0) Then &nbsp;Edit2.Text:='搜索 1 号成功'<br> &nbsp;Else Edit2.Text:='搜索 1 号失败';<br> &nbsp;Finally<br> &nbsp;FreeLibrary(Handl);<br> End;<br>End;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>//调用方式:静态调用<br>//功能:搜索卡钟<br>Var<br>AR:Integer;<br>begin<br>AR:=1;<br>If Search(1)=0 Then ShowMessage('Ok');<br>end;<br>我先执行打开串口的动作执行成功,可以打开Com口,然后执行(BitBtn2Click)搜索卡钟就有点怪了,如果我将If Search(1)=0 Then ShowMessage('Ok');这行屏蔽掉则搜索卡钟失败,没有屏蔽掉但不执行则可以搜索卡钟成功;也就是说必需有静态调用其中的函数但可以不执行则可以正常执行动态调用的功能并返回正确结果,否则则不可以.实在让我郁闷.请高手明示!!谢谢!
 
我在Delphi 7中调用 C 写的Dll文件,我用的是动态调用,共用了其中的两个函数.其中一个可以正常运行,另一个则必需要引用静态调用:先看看程序还有更奇怪的事情发生:<br>var<br> &nbsp;Form1: TForm1;<br> &nbsp;Type TOpen_ComX=Function(Comport:Pchar;Band:Integer):Integer;Stdcall;<br> &nbsp;Type TSearchAR=Function(AD_ID:Integer):Integer;Stdcall;<br> &nbsp;Type TClose_ComX=Function():Integer;Stdcall;<br>implementation<br>function Search(AR_ID:Integer):Integer; Stdcall external 'JBC_Attend.dll'name 'SearchAR';<br><br>{$R *.dfm}<br>procedure TForm1.BitBtn1Click(Sender: TObject);<br>//调用方式:动态调用<br>//功能:打开串口<br>Var<br>Open_ComX1:TOpen_ComX;<br>Handle:THandle;<br>Comport:Pchar;<br>Band:Integer;<br>begin<br> &nbsp; Comport:='COM1';//设置Com1口<br> &nbsp; Band:=9600; &nbsp;//设置速率<br> &nbsp; Handle:=LoadLibrary('JBC_Attend.dll');<br> &nbsp; Open_ComX1:=GetProcAddress(Handle,'Open_ComX');<br> &nbsp; If Open_ComX1(Comport,Band)=0 Then Edit1.Text:='Com1 口开启成功'<br> &nbsp; Else Edit1.Text:='Com1 口开启失败';<br> &nbsp; FreeLibrary(Handle);<br>end;<br><br>procedure TForm1.BitBtn2Click(Sender: TObject);<br>//调用方式:动态调用<br>//功能:搜索卡钟<br>Var<br>Search1:TSearchar;<br>Handl:THandle;<br>AD_ID:Integer;<br>begin<br> &nbsp;AD_ID:=1;<br> &nbsp;Handl:=LoadLibrary('JBC_Attend.dll');<br> &nbsp;Try<br> &nbsp;Search1:=GetProcAddress(Handl,'SearchAR');<br> &nbsp;If (Search1(AD_ID1)=0) Then &nbsp;Edit2.Text:='搜索 1 号成功'<br> &nbsp;Else Edit2.Text:='搜索 1 号失败';<br> &nbsp;Finally<br> &nbsp;FreeLibrary(Handl);<br> End;<br>End;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>//调用方式:静态调用<br>//功能:搜索卡钟<br>Var<br>AR:Integer;<br>begin<br>AR:=1;<br>If Search(1)=0 Then ShowMessage('Ok');<br>end;<br>我先执行打开串口的动作执行成功,可以打开Com口,然后执行(BitBtn2Click)搜索卡钟就有点怪了,如果我将If Search(1)=0 Then ShowMessage('Ok');这行屏蔽掉则搜索卡钟失败,没有屏蔽掉但不执行则可以搜索卡钟成功;也就是说必需有静态调用其中的函数但可以不执行则可以正常执行动态调用的功能并返回正确结果,否则则不可以.实在让我郁闷.请高手明示!!谢谢!
 
幫忙阿!可以再給分阿
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
回复
0
查看
702
天地弦
I
回复
0
查看
758
import
I
后退
顶部