把VC的dll声明写成DELPHI的.

zhaozhen2004 2009-02-05 04:09:47
int _stdcall EstablishConnect(char * IP_Address,int IP_Port,int TimeOut,unsigned int *Sock)
int _stdcall SMT_Read_Id_MacNo(unsigned int Sock,unsigned char id[5])
...全文
114 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ljfwyh 的回复:]
我一直有个疑问,就是c里边额unsigned int 在Delphi里能用Longword表示吗?不会出现不兼容吗? [/Quote]
只要是类型差不多就兼容了。比如在VB当中还没有无符号的32位整形,那么就只能用long来表示。数据字节对齐之后可以保证数据不会丢失即可,对于二进制数据只要字节数一样,并且字节序相同就不存在问题,等需要具体解释或运算的时候,那是解释/运算程序该做的事。比如在VB当中没有那么大的整数,则只能通过Currency转换,然后表达出来。
Seamour 2009-02-05
  • 打赏
  • 举报
回复
人家也没写DWORD,反正都默认x86的32位程序就没问题
虎滴小猪猪 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 unsigned 的回复:]
C/C++ codeint _stdcall EstablishConnect(char * IP_Address,int IP_Port,int TimeOut,unsigned int *Sock)
int _stdcall SMT_Read_Id_MacNo(unsigned int Sock,unsigned char id[5])



Delphi(Pascal) codefunction EstablishConnect(IP_Address: PAnsiChar; IP_Port: Integer; TimeOut: Integer; var Sock: LongWord): Integer; stdcall;
function SMT_Read_Id_MacNo(Sock: LongWord;id: array[0..4] of Byte): Integ…
[/Quote]

我赞同,但是我一直有个疑问,就是c里边额unsigned int 在Delphi里能用Longword表示吗?不会出现不兼容吗?
僵哥 2009-02-05
  • 打赏
  • 举报
回复
推荐的声明是:
function SMT_Read_Id_MacNo(Sock: LongWord; const id): Integer; stdcall;
僵哥 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Seamour 的回复:]
Delphi不支持直接用固定数组做参数的语法[/Quote]
类似于7楼的代码预先定义一个类型即可。
Seamour 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kampan 的回复:]

Type
TId=Array[0..4] of char;

function SMT_Read_Id_MacNo(Sock: LongWrod; id: TId): Integer;

function SMT_Read_Id_MacNo(Sock: LongWrod; id: PChar): Integer;(这种好像不大严格)

最后别忘了加stdcall; external 'XXXX.dll';
[/Quote]
第一种写法也可以,不过从delphi的语义讲,最好在id前加上const/var/out中的一个,不然在使用delphi接口的人看来,会产生一种传入数组拷贝的错觉。虽然实际上传入的也还是指针,并且dll中也不会再生成一个拷贝
Seamour 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 unsigned 的回复:]
C/C++ codeint _stdcall EstablishConnect(char * IP_Address,int IP_Port,int TimeOut,unsigned int *Sock)
int _stdcall SMT_Read_Id_MacNo(unsigned int Sock,unsigned char id[5])



Delphi(Pascal) codefunction EstablishConnect(IP_Address: PAnsiChar; IP_Port: Integer; TimeOut: Integer; var Sock: LongWord): Integer; stdcall;
function SMT_Read_Id_MacNo(Sock: LongWord;id: array[0..4] of Byte): Integ…
[/Quote]
第二个应该是
function SMT_Read_Id_MacNo(Sock: Cardinal; id: PAnsiChar): Integer;

Delphi不支持直接用固定数组做参数的语法
僵哥 2009-02-05
  • 打赏
  • 举报
回复
当然也可以改成:
procedure TForm1.Button1Click(Sender: TObject);
var
nResult: Integer;
sock:Cardinal;
szid : array[0..4] of byte;
szIp : string;
begin
szIp:='10.23.5.152';
nResult := EstablishConnect(PChar(szIp),10001,1000,@Sock);
僵哥 2009-02-05
  • 打赏
  • 举报
回复
EstablishConnect最好参考5楼的声明,否则的话使用方法不是象你那样使用的。sock参数是一个回写的参数,如果你没有提供相应的内存,而只是提供一个指针,那么这个写出就会访问到一个非法地址。
zlibo2008 2009-02-05
  • 打赏
  • 举报
回复
帮顶~
zhaozhen2004 2009-02-05
  • 打赏
  • 举报
回复
非常感谢各位的帮助.可我的问题仍然存在.我是这样声明的.
function EstablishConnect(IP_Address:pchar;IP_Port:Integer;TimeOut:Integer;Sock:pCardinal):Integer;stdcall;

function SMT_Read_Id_MacNo(Sock:Cardinal;output:array of byte):Integer;stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var
nResult: Integer;
sock:PCardinal;
szid : array[0..4] of byte;
szIp : string;
begin
szIp:='10.23.5.152';
nResult := EstablishConnect(PChar(szIp),10001,1000,Sock);
case nResult of
0: begin
hSock := sock^;
bOpen := True;
end;
-7:showmessage('Timeout');
-13: ShowMessage('Ip Error');
-14: ShowMessage('socket init error');
end;

if bOpen then
begin
nResult:=SMT_Read_Id_MacNo(hSock,szId);//********
case nResult of
0: ;//ShowMessage(szid[0]);
$07: ShowMessage('length error');
$0b:ShowMessage('ime1 # error');
-6: showmessage('no response');
end;
end;
end;

//********这部分老是返回失败的,我怀疑是返回的SOCK不对.再次谢谢大家.
kampan 2009-02-05
  • 打赏
  • 举报
回复

Type
TId=Array[0..4] of char;

function SMT_Read_Id_MacNo(Sock: LongWrod; id: TId): Integer;

function SMT_Read_Id_MacNo(Sock: LongWrod; id: PChar): Integer;(这种好像不大严格)

最后别忘了加stdcall; external 'XXXX.dll';
kampan 2009-02-05
  • 打赏
  • 举报
回复
Sock^
僵哥 2009-02-05
  • 打赏
  • 举报
回复
int _stdcall EstablishConnect(char * IP_Address,int IP_Port,int TimeOut,unsigned int *Sock) 
int _stdcall SMT_Read_Id_MacNo(unsigned int Sock,unsigned char id[5])

function EstablishConnect(IP_Address: PAnsiChar; IP_Port: Integer; TimeOut: Integer; var Sock: LongWord): Integer; stdcall;
function SMT_Read_Id_MacNo(Sock: LongWord;id: array[0..4] of Byte): Integer; stdcall;
zhaozhen2004 2009-02-05
  • 打赏
  • 举报
回复
比较困惑的是如何取Sock的值?
zhaozhen2004 2009-02-05
  • 打赏
  • 举报
回复
谢谢楼上的,我试一下,还有如何调用呢?声明成PINTGER.
kampan 2009-02-05
  • 打赏
  • 举报
回复
function EstablishConnect(IP_Address: PChar; IP_Port, TimeOut: Integer; Sock: PInteger): Integer;
bdmh 2009-02-05
  • 打赏
  • 举报
回复
char * IP_Address = IP_Address :Pchar
int * = ^Integer;最好做一个PInteger = ^Integer;
int * = PInteger

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧