将C头文件转换为Delphi

4
int  WINAPI  BiMICRSetReadBackFunction(
    int  nHandle,
    int  (CALLBACK  *pMicrCB)(void),
    LPBYTE  pReadBuffSize,
    LPBYTE  readCharBuff,
    LPBYTE  pStatus,
    LPBYTE  pDetail);

    typedef int (CALLBACK* MICRCallback)(void);
    typedef int (CALLBACK* StatusCallback)(DWORD);

    int WINAPI BiSetInkStatusBackFunction(int nHandle,
        int (CALLBACK *pStatusCB)(DWORD dwStatus)
);

我需要将这个函数转换成 Delphi。

我尝试使用 headconv4.2,但生成的静态单元不完整,在编译时会出现错误。

非常感谢您的帮助:D


2
对于这个问题,我完全不同意两个“关闭”投票(不是一个真正的问题;太局部化),因为它很容易回答,指出HeadConv通常不是一个好的解决方案,并允许回答者解释一些关于C到Delphi头文件转换的通用信息。它清楚地表明管理员应该少于机器 - Jeroen Wiert Pluimers
2个回答

3
一个字面翻译的结果是:
type
  MICRCallback = function: Integer; stdcall; 
  StatusCallback = function(dwStatus: DWORD): Integer; stdcall; 

function BiMICRSetReadBackFunction( 
  nHandle: Integer; 
  pMicrCB: MICRCallback; 
  pReadBuffSize: PByte; 
  readCharBuff: PByte; 
  pStatus: PByte; 
  pDetail: PByte
): Integer; stdcall; 

function BiSetInkStatusBackFunction(
  nHandle: Integer;
  pStatusCB: StatusCallback
): Integer; stdcall; 

如果您正在从DLL导入函数,则需要将DLL文件名添加到函数声明中:

function BiMICRSetReadBackFunction( 
  nHandle: Integer; 
  pMicrCB: MICRCallback; 
  pReadBuffSize: PByte; 
  readCharBuff: PByte; 
  pStatus: PByte; 
  pDetail: PByte
): Integer; stdcall; external 'filename.dll';

function BiSetInkStatusBackFunction(
  nHandle: Integer;
  pStatusCB: StatusCallback
): Integer; stdcall; external 'filename.dll';

谢谢:D 我会尝试这些例子的。 - Rafael Miguel Caceres Choto

3

假设 WINAPICALLBACK 始终为 __stdcallDWORDunsigned intLPBYTEunsigned char *,您可以尝试我制作的这个 不太规范的转换

unit UHeader;

interface

// Data types

type
  PByte = ^Byte;
  PPByte = ^PByte;

// Prototypes

type
  TMICRCallback = function: Integer; stdcall;
  TStatusCallback = function(dwParam: Cardinal): Integer; stdcall;

// Functions

type
  TBiMICRSetReadBackFunction =
    function(nHande: Integer;
             pMicrCB: TMICRCallback;
             pReadBuffSize: PByte;
             readCharBuff: PByte;
             pStatus: PByte;
             pDetail: PByte
    ): Integer; stdcall;

var
  BiMICRSetReadBackFunction: TBiMICRSetReadBackFunction;

type
  TBiSetInkStatusBackFunction =
    function(nHandle: Integer;
             pStatusCB: TStatusCallback
    ): Integer; stdcall;

var
  BiSetInkStatusBackFunction: TBiSetInkStatusBackFunction;

implementation

end.

虽然我不完全确定这是否正确,但这可能是你尝试自己转换的路径。


3
+1. 仅供参考:PBytePPByte已经在Delphi中定义,DWORD也是如此。大多数常见的Windows API数据类型(如HDCHWND等)都在SystemWindows单元中定义,并自Delphi 1发布以来一直存在。 - Ken White
@KenWhite 谢谢你的信息,我从未注意到过。 - Toribio
1
@DavidHeffernan 这是真的,但是针对 LPBYTE 的目的,我认为派生 Byte 是更好的选择... - Toribio
好的,那么你为什么要谈论 char 呢? - David Heffernan
1
因为LPBYTE的声明如下:typedef BYTE far *LPBYTE;其中typedef unsigned char BYTE;根据MSDN - Toribio
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接