...
#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中却不行,为什么
谢谢,如果可能的话,请帮忙把上面的四个函数翻译过来

解决方案 »

  1.   

    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;可能是这样吧,我也不能完全肯定
      

  2.   

    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 ;