我做一个读卡器的开发,公司提供了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 
 

解决方案 »

  1.   

    函数这样声明
    TFunct=function(var hCom:THandle;com_port:PChar): Boolean; 
      

  2.   

    type 
     TFunct=function(hCom:^THandle;com_port:pchar): Boolean; rec:=TFunct(PFunc)(@hcom,pchar('COM1'));
      

  3.   

    DLL里面的调用方式和调用的入栈方式要一样 //stdcall;和动态库一样
    TFunct=function(var hCom:THandle;com_port:PChar): Boolean; stdcall;
      

  4.   

    我的调用方式和各位写的差不多,但是总是会有问题,具体我也没有弄清楚是我的问题,还是本身sdk就有瑕疵,我看我是要和公司沟通一下的,谢谢各位帮忙
      

  5.   

    调用方式没问题的话,可以把com1改成"\\.\com1"试试,以前遇到过用相对路径不行,而绝对路径可以的,很奇怪。
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject); 
    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 
      

  7.   

    apiStatus  DrfCommOpen (HANDLE * hCom, char *com_port) 
    单从这个声明上来说最好是用
    function(hCom:PHandle;com_port:PChar):Boolean; stdcall;
    如果dll函数内不对参数的指针进行操作的话,也可以加上const修饰,可以让
    以后看代码的人更清楚点