2012-09-25 99 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試試這個例子。 –