【问题标题】:try to execute function in dll - translate from C to Delphi尝试在 dll 中执行函数 - 从 C 到 Delphi
【发布时间】:2022-12-12 10:09:35
【问题描述】:

我必须使用 delphi 访问 DLL。问题是:我只有 .h 文件而没有 delphi 文件。 大多数功能翻译和工作都很容易,但这是:

`FUNCTION_PRE64 ULONG FUNCTION_PRE OpenModuleEx(ULONG moduleID, ULONG nr, unsigned char *exbuffer, ULONG open_options);`F

我对德尔福的翻译是:

function  OpenModuleEx(moduleID:Longint; nr:Longint; &buffer: exbuffer; open_options: longint): Longint; stdcall; external 'master.dll'
typedef struct
{
    unsigned char address[256];
    ULONG timeout;
    ULONG portno;
    
    ULONG encryption_type;
    unsigned char encryption_password[32];
} DAPI_OPENMODULEEX_STRUCT;

在德尔福。

type exbuffer = packed record
  address : array of byte;
  timeout : Longint;
  portno : Longint;
  encryption_type : Longint;
  encryption_password : Array of byte;
end;

至少这样可以填充记录并执行:

BinarySize := (Length('10.241.0.147') + 1) * SizeOf(Char);
SetLength(buffer.address, BinarySize);
Move('10.241.0.147'[1], buffer.address[0], BinarySize);
buffer.portno := 9912;
buffer.timeout := 5000;
buffer.encryption_type := 0;
BinarySize := (Length('') + 1) * SizeOf(Char);
SetLength(buffer.encryption_password, BinarySize);
Move(''[1], buffer.encryption_password[0], BinarySize);

lhandle := OpenModuleEx(42, 0, &buffer, 0 );

返回的句柄总是 0 :-(

我必须说,我没有 C 专家,也没有 Delphi 专家使用“bitmoving”;-)

我的delphi版本是XE7

谁能帮我把struc翻译成delphi,怎么填啊??

非常感谢 史蒂夫

【问题讨论】:

  • array of Byte 是一个动态的大批;它是一个引用类型。记录成员只是一个指向 Delphi 动态数组堆对象的指针。记录本身需要 256 和 32 个字符:也就是说,您需要静止的阵列。

标签: c delphi dll


【解决方案1】:

Delphi 记录翻译不正确。它应该是:

type 
  exbuffer = record
    address : Array [0..255] byte;
    timeout : Cardinal;
    portno : Cardinal;
    encryption_type : Cardinal;
    encryption_password : Array [0..255] byte;
  end;

记录不应打包。 ULONG 映射到无符号 32 位类型。并且数组必须是固定长度的数组。

函数声明也是错误的。它应该是:

function OpenModuleEx(
    moduleID: Cardinal; 
    nr: Cardinal; 
    exbuffer: PByte; 
    open_options: Cardinal
): Cardinal; stdcall; external 'master.dll';

也可能函数应该是cdecl而不是stdcall,我们无法判断。

【讨论】:

    【解决方案2】:

    您的 ULONG 类型不正确。您应该使用 Cardinal 或更可能使用 NativeUInt,这取决于 32/64 位编译的选择。 NativeUInt 常用于指针寻址,以及大量的 Delphi 到 Windows 通信。它是 THandle、HWND、UIntPtr 等的基础数据类型!

    ULONG 和 Cardinal 范围为 0 到 40 亿 LongInt是-20亿到+20亿 如果我没记错的话,32 位的 NativeUInt 是 0 到 40 亿,64 位的是 0 到 1.8x10^19

    Andreas 对 256 和 32 字节静态数组的需求是正确的——它们可能必须有一个 /0 终止字符来指示字符串的结尾。

    添加为评论比“答案”要容易得多......但是w / e ......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      相关资源
      最近更新 更多