2015-10-20 29 views
1

我想調用DLL中的函數WinCE系統上。 這是回調不編譯(參數錯號指定

 

type 
    TPREVIEW_CALLBACK = procedure (pData: PByte; len: long; height: Integer; width: Integer; stride: Integer) of object; cdecl; 
    PPREVIEW_CALLBACK = ^TPREVIEW_CALLBACK; 
    function camRegisterPreviewCallback(PreviewCallbackProc: PPREVIEW_CALLBACK): Integer; cdecl; external 'CameraAPI.dll'; 

我做了所有功能的全球性定義,這是回調(仍然爲空)

 

procedure PreviewCallback(pData: PByte; len: long; height: Integer; width: Integer; stride: Integer); 
begin 
end; 

通話(還一個全局函數)是

 

CamRegisterPreviewCallback(PreviewCallback); 

我得到的編譯錯誤是 錯誤:爲調用「PreviewCallback」指定的錯誤參數數量 據我瞭解,參數是一個指針,所以我不明白我在做什麼錯。 任何人都可以幫助我嗎? 在此先感謝 赫爾曼

+0

首先你錯過了'物體; cdecl;'在'TPREVIEW_CALLBACK'聲明中,所以你的回調過程必須是'cdecl'指令的類方法。接下來,'CamRegisterPreviewCallback(@PreviewCallback);'其中'@'表示它是一個指向方法的指針,而不是調用它。 – Abelisto

+1

僅當它是一個類中的函數時才需要該對象嗎?在我的情況下,我做了所有的全球功能。我將聲明更改爲函數camRegisterPreviewCallback(PreviewCallbackProc:TPREVIEW_CALLBACK):Integer; CDECL;外部'CameraAPI.dll'; (不是PPre ....但TPrev ....)連同提出的@現在它編譯並似乎工作。謝謝 – Herman

回答

1

當你寫使用FPC方言({$MODE OBJFPC})函數指針必須使用@符號明確指定。

如果沒有這個編譯器認爲你想調用該函數,而不是採取其地址。

所以重寫了最後行

CamRegisterPreviewCallback(@PreviewCallback); 

順便說一句,如有人在評論指出,驗證以及您的TPREVIEW_CALLBACK原型。你聲明它爲of object,但是你將它實現爲一個全局函數,這是一個錯誤。 of object真的意味着該方法必須在一個類中實現。對象方法的過程變量與自由函數的過程變量不同。在第一種情況下,有一個額外的上下文指針(Self),所以兩者完全不兼容!

如果dll是用C編寫的,很可能of object是多餘的,但不幸的是,沒有庫API文檔很難說。

+0

謝謝,關於對象,我知道但其他我沒有。關於多餘的部分,我可以做一些測試,但它仍然是多餘的。 – Herman