C语言dll 调用的问题!
delphi吧
全部回复
仅看楼主
level 7
gongjun527 楼主
****************************c语言 API调用说明*****************************************
//连接读写器
//参数:port->串口号,例:"com1"
// baud->波特率,读卡器上电为38400
// addr->读卡器地址,这个数值由程序员指定,相当于给读卡器一个身份标识,范围0~9,
// 缺省为0,如果你的程序只操作一个读写器,建议采用缺省值;
//返回:成功true,失败返回false
DECLDIR BOOL gOpenReader(char *port, DWORD baud, int addr=0);
**************************************************************************************
下面是我写的调用程序.
unit LFReader;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
openreader1: TButton;
Buttonclosereader: TButton;
lbl1: TLabel;
lbl2: TLabel;
Button1: TButton;
Button2: TButton;
procedure openreader1Click(Sender: TObject);
procedure ButtonclosereaderClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function gOpenReader(port: pChar; baud: LongInt; addr: Integer): Boolean; stdcall external 'LFReaderAPI.dll'; // Added by GongJun 2016-05-27 20:50:50连接读卡器端口
function gCloseReader(addr: Integer): Boolean; stdcall external 'LFReaderAPI.dll'; //关闭读卡器端口
function gSetLED(color:Byte;addr:Integer):Integer ; stdcall external 'LFReaderAPI.dll'; //设置读卡器LED灯颜色
implementation
{$R *.dfm}
procedure TForm1.openreader1Click(Sender: TObject);
var
st: Boolean;
port: PChar;
begin
port := PChar('com3');
st := gOpenReader(port, 38400, 0);
if st = True then
begin
lbl1.Caption:='连接成功'
end
else
begin
lbl1.Caption:='连接失败';
end;
end.
调用的时候会报错.
大神们帮忙看看 是哪里出了问题呢??
2016年05月27日 13点05分 1
吧务
level 14
如果那个dll的Char是WideChar......
2016年05月27日 13点05分 2
吧主,有何修正的指示不?
2016年05月27日 14点05分
@gongjun527 如果是,你就得用widestring
2016年05月27日 14点05分
level 7
gongjun527 楼主
改成 widestring 还是一样报错!
2016年05月28日 08点05分 3
吧务
level 14
把'com3'放在一个全局变量里面呢?
2016年06月01日 01点06分 4
level 13
首先,delphi有dword类型。其次,搞清楚是不是stdcall调用规则,很多c++的动态库都不是这种调用规则
2016年06月01日 02点06分 5
谢谢指点,这个动态库的调用文档说明不够详细
2016年06月01日 14点06分
level 13
还有,你的动态库在不在执行程序的搜索路径里
2016年06月01日 02点06分 6
level 12
把函数的调用规则 stdcall改成 cdcel;
DWORD对应Delphi的是LongWord或DWORD;
var
st: Boolean;
port: AnsiString;
begin
port := 'com3';
st := gOpenReader(pAnsiChar(port), 38400, 0);
应该差不多了
2016年06月01日 06点06分 7
谢谢,指点!
2016年06月01日 13点06分
大神,为什么我把stdcall改成 cdcel;编译不过呢?
2016年06月02日 13点06分
function gOpenReader(port:PwideChar; baud: DWORD; addr: Integer): Boolean; cdcel; External 'LFReaderAPI.dll'; 报错:Unknown directive: '<cdcel>'
2016年06月02日 13点06分
应该是cdecl吧,改成cdecl就可以了
2016年06月02日 13点06分
1