2015-10-20 43 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