我在翻译c++头文件时遇到麻烦。当我执行我的Delphi代码时,它返回代表“无效参数”的代码125。我将解释到目前为止我做了什么:
头文件(片段):
IDSEXP is_AOI(HIDS hCam, UINT nCommand, void *pParam, UINT SizeOfParam);
我的翻译:
function is_AOI(hCam: Cardinal; Command: Cardinal; Param: Pointer; ParamSize: Cardinal): integer; cdecl; external 'ueye_api.dll';
示例C++代码:
IS_SIZE_2D imageSize;
imageSize.s32Width = m_nSizeX;
imageSize.s32Height = m_nSizeY;
is_AOI(m_hCam, IS_AOI_IMAGE_SET_SIZE, (void*)&imageSize, sizeof(imageSize));
我的代码:
var
size2D: TSize2D;
size2D.S32X := maxWidth;
size2D.S32Y := maxHeight;
ret := is_AOI(cam, IS_AOI_IMAGE_SET_SIZE, Pointer(@size2D), SizeOf(size2D));
C++结构:
typedef struct
{
INT s32Width;
INT s32Height;
} IS_SIZE_2D;
我的翻译是:
TSize2D = record
S32X, S32Y: integer;
end;
最佳答案
尽管对pointer
的翻译是正确的,但我通常发现用无类型的*void
参数替换var
更为优雅。hCam
是一个句柄,它实际上是一个指针;您应该为此使用NativeUint
或UIntPtr
,否则代码将以64位中断。请注意,THandle
仅适用于Windows API调用,这是一个Google dll。
Delphi 7警告
Delphi 7 seems to think that SizeOf(NativeUInt) = 8
,在D2009中已修复。
{$IFNDEF VER200} //anything prior to Delphi 2009
type
NativeUInt = Cardinal;
NativeInt = Integer;
{$ENDIF}
IDSEXP
定义如下:请注意,调用约定仅为32位的
cdecl
。在64位中,使用默认的Win64调用约定。#if defined __i386__
#define IDSEXP __attribute__((cdecl)) INT
#define IDSEXPUL __attribute__((cdecl)) ULONG
#else
#define IDSEXP INT
#define IDSEXPUL ULONG
#endif
但是,按照@David的注释,x64会忽略调用约定关键字,因为只有一个,因此定义应如下所示:
function is_AOI(hCam: NativeUInt;
Command: Cardinal;
var Param;
ParamSize: Cardinal): integer;
cdecl; external 'ueye_api.dll';
您现在可以这样称呼它:
ret:= is_AOI(cam, IS_AOI_IMAGE_SET_SIZE, size2D, SizeOf(size2D));
是什么真正导致您的功能失败
起初我以为错误125是运行时错误,但实际上它是该函数的返回值。
可以调用该函数并返回值的事实意味着该函数的签名很好。
您提供的句柄无效,或者您的Size2D参数超出范围。
因为您正在传递
maxint
,所以我认为您在这里碰运气。在
Size2D
中传递更合理的内容。size2D.S32X := 100;
size2D.S32Y := 100;
ret := is_AOI(cam, IS_AOI_IMAGE_SET_SIZE, size2D, SizeOf(size2D));
关于c++ - C++到Delphi Header文件的转换:指向void的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19280570/