请教c++格式的函数接口如何翻译到delphi

hslzf 2003-04-03 12:14:18
...
#ifndef PIPTR
#if (defined(_WINDOWS) || defined(DOS)) && !defined(WIN32)
#define PIPTR _far
#else
#define PIPTR
#endif
#endif

#if defined(_WINDOWS) || defined(WIN32)
#include <windows.h>
#define PIINT32 int32 WINAPI
#define PIVOID void WINAPI
#define PIWIN WINAPI
#define PIBOOL pibool WINAPI
#elif defined ( __alpha )
#define PIINT32 int
#define PIVOID void
#define PIWIN
#define PIBOOL pibool
#else
#define PIINT32 int32
#define PIVOID void
#define PIWIN
#define PIBOOL pibool
#endif
...
PIINT32 piut_connect( const char PIPTR *procname );
PIINT32 piut_disconnect( void );
PIINT32 piut_login( const char PIPTR *, const char PIPTR *, int32 PIPTR * );
PIINT32 pipt_findpoint( char PIPTR *tagname, int32 PIPTR *pt );
...
上面是c++源代码的一部分,用于调用piapi32.dll
下面是vb中的正确形式:
Declare Function piut_connect Lib "piapi32.dll" (ByVal ProcName$) As Long
Declare Function piut_disconnect Lib "piapi32.dll" () As Long
Declare Function piut_login Lib "piapi32.dll" (ByVal username$, ByVal password$, valid&) As Long
Declare Function pipt_findpoint Lib "piapi32.dll" (ByVal TagName$, pt&) As Long
现在我想用delphi重写一遍,以便我在delphi中写函数,但是有几点我看不懂:
1.“const char PIPTR *procname”翻译成delphi是什么意思?尤其是这里的piptr不明白;
2.如何翻译按值调用和按地址调用?
3.vb中的pipt_findpoint函数的tagname参数是传值调用,而c++中好像是传地址,却都能正确调用,而在delphi中却不行,为什么
谢谢,如果可能的话,请帮忙把上面的四个函数翻译过来

...全文
50 点赞 收藏 2
写回复
2 条回复
bottom 2003年04月06日
C++太强大了,有些写法在DELPHI中不一定支持
如#define宏定义和“const char PIPTR *procname”
你最好装装c++builder看看BORLAND公司是如何把
c++和dephi互相翻译的
OBJECT PASCAL是对C++
的一种简化,所以翻译的不一定对,见谅:
DEPHI的条件编译预处理
{$ifndef PIPTR}
{$if (defined(_WINDOWS) or defined(DOS)) and not defined(WIN32)}
type
_far=PIPTR
{$define }
{$else}
__far=PIPTR
end;
{$endif}

{$endif}

{$if defined(_WINDOWS) or defined(WIN32)}
uses windows.pas
type
int32 WINAPI=PIINT32//
void WINAPI=PIVOID//
WINAPI=PIWIN
pibool WINAPI=PIBOOL
{$elif defined ( __alpha )}
int=PIINT32
void=PIVOID
win =PIWIN
pibool2=PIBOOL//dephi不区分大小写
{$else}
int32=PIINT32
void=PIVOID
win =PIWIN
pibool2=PIBOOL//dephi不区分大小写
end;
{$endif}

function piut_connect( const PIPTR procname:PChar ):PIINT32;
function piut_disconnect:PIINT32;//DELPHI无参数就不用写了
function piut_login(const PIPTR procname:PChar;const PIPTR procname2:PChar;const PIPTR procname:int32):PIINT32
//dephi不支持无名参数声明,C++过分强大了!注意DELPHI声明是参数是用;割开
function pipt_findpoint( var PIPTR tagname:char; var PIPTR pt:int32):PIINT32 ;
或:function pipt_findpoint(PIPTR tagname:Pchar;PIPTR pt:^int32):PIINT32 ;
回复 点赞
ColdWolf 2003年04月03日
const char PIPTR *procname
#define PIPTR _far
const char _far *procname


C++默认是按值传,如果要穿引用可以加上一个 & 标志

不过_far对应了Delphi的什么,我就不知道了。
PIINT32 int32 WINAPI
PIINT32 piut_connect( const char PIPTR *procname );
function piut_connect(const procname;pchar):int32; stdcall;
PIINT32 piut_disconnect( void );
function piut_disconnect:int32;stdcall;
PIINT32 piut_login( const char PIPTR *, const char PIPTR *, int32 PIPTR * );
type
pint32 = ^int32
function piut_login(const pv1:pchar; const pv2:pchar; pv3:pint32):int32;stdcall;
PIINT32 pipt_findpoint( char PIPTR *tagname, int32 PIPTR *pt );
function pipt_findpoint(tagname;pchar; pt:pint32):int32; stdcall;

可能是这样吧,我也不能完全肯定

回复 点赞
发动态
发帖子
Windows SDK/API
创建于2007-08-02

797

社区成员

2.2w+

社区内容

Delphi Windows SDK/API
社区公告
暂无公告