我在翻译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是一个句柄,它实际上是一个指针;您应该为此使用NativeUintUIntPtr,否则代码将以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/

10-11 22:07
查看更多