2012-09-25 98 views
3
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。将C头转换为delphi

我试图使用headconv4.2但生成的静态单元没有完成,编译时出现错误。

预先感谢你的帮助:d

+2

+1你的问题,因为我完全不同意这两个“接近”的投票(不是一个真正的问题;太局部化了),因为这个问题很容易回答,指出HeadConv常常不是一个好的解决方案,并且允许回答者解释关于[C to Delphi头文件转换]的一些通用信息(http://stackoverflow.com/questio NS/100596 /最佳资源换转换-C-C-DLL-头到的Delphi)。它清楚地表明[主持人应该少于一台机器](http://www.delphifeeds.com/go/s/96502) –

回答

3

假设WINAPICALLBACK总是被__stdcallDWORDunsigned intLPBYTE作为unsigned 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。仅供参考:'PByte'和'PPByte'已经在Delphi中定义,就像'DWORD'一样。大多数常见的Windows API数据类型(如'HDC','HWND'等)都是在'System''或'Windows'单元中定义的,并且自Delphi 1发布以来就已经定义了。 –

+0

@KenWhite感谢您的信息,我从来没有注意到这一点。 –

+1

char *是PAnsiChar –

2

逐字翻译应该是:

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'; 
+0

感谢:D Im试试这个例子。 –