我做一个读卡器的开发,公司提供了c++的dll,我用动态和静态的方式调试都没有成功。下面是dll里的函数:
函数描述
apiStatus DrfCommOpen (HANDLE * hCom, char *com_port)
功能
打开计算机串口
参数
Com_port:串口名hCom:串口句柄指针
返回值
成功返回0,失败返回非0值
应用实例
打开串口1:
if(DrfCommOpen(&ComHandle,”COM1”) = = 0 )下面是我写的调用程序,因为其中要用到串口句柄,所以我打算先去出句柄,我认为问题是出在这里的,因为如果我直接不给句柄赋值程序是可以通过的。所以我认为是取句柄的时候属性有不对的地方,但是我自己改了好久都没有弄好。
我想请高手指点一下。
unit Unit826;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
type
TFunct=function(hCom:THandle;com_port:String): Boolean;
cdecl;
var
PFunc:TFarProc;
Moudle:THandle;
hCom:THandle;
//brec:Boolean;
//com_Port:char;
rec:Boolean;
begin
hcom:=CreateFile( PChar('com1'),
0,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
CloseHandle(hcom);
Moudle:=Loadlibrary('DrfApiV10.dll');
if Moudle<>0 then
begin
Pfunc:=GetProcAddress(Moudle,'DrfCommOpen');
rec:=TFunct(PFunc)(hcom,'COM1'); ...............运行到这里的时候就出错了
//showmessage(BoolToStr(rec))
Edit1.Text:=BoolToStr(rec);
end;
Freelibrary(Moudle);
end;
end
函数描述
apiStatus DrfCommOpen (HANDLE * hCom, char *com_port)
功能
打开计算机串口
参数
Com_port:串口名hCom:串口句柄指针
返回值
成功返回0,失败返回非0值
应用实例
打开串口1:
if(DrfCommOpen(&ComHandle,”COM1”) = = 0 )下面是我写的调用程序,因为其中要用到串口句柄,所以我打算先去出句柄,我认为问题是出在这里的,因为如果我直接不给句柄赋值程序是可以通过的。所以我认为是取句柄的时候属性有不对的地方,但是我自己改了好久都没有弄好。
我想请高手指点一下。
unit Unit826;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
type
TFunct=function(hCom:THandle;com_port:String): Boolean;
cdecl;
var
PFunc:TFarProc;
Moudle:THandle;
hCom:THandle;
//brec:Boolean;
//com_Port:char;
rec:Boolean;
begin
hcom:=CreateFile( PChar('com1'),
0,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
CloseHandle(hcom);
Moudle:=Loadlibrary('DrfApiV10.dll');
if Moudle<>0 then
begin
Pfunc:=GetProcAddress(Moudle,'DrfCommOpen');
rec:=TFunct(PFunc)(hcom,'COM1'); ...............运行到这里的时候就出错了
//showmessage(BoolToStr(rec))
Edit1.Text:=BoolToStr(rec);
end;
Freelibrary(Moudle);
end;
end
TFunct=function(var hCom:THandle;com_port:PChar): Boolean;
TFunct=function(hCom:^THandle;com_port:pchar): Boolean; rec:=TFunct(PFunc)(@hcom,pchar('COM1'));
TFunct=function(var hCom:THandle;com_port:PChar): Boolean; stdcall;
type
TFunct=function(hCom:PHandle;com_port:PChar): Boolean; stdcall;
var
Moudle:THandle;
hCom:THandle;
rec:Boolean;
begin
Moudle:=Loadlibrary('DrfApiV10.dll');
if Moudle <>0 then
begin
Pfunc:=GetProcAddress(Moudle,'DrfCommOpen');
rec:=TFunct(PFunc)(@hcom,PChar('COM1'));
Edit1.Text:=BoolToStr(rec);
end;
Freelibrary(Moudle);
end;
end
单从这个声明上来说最好是用
function(hCom:PHandle;com_port:PChar):Boolean; stdcall;
如果dll函数内不对参数的指针进行操作的话,也可以加上const修饰,可以让
以后看代码的人更清楚点