提问者:小点点

C++结构对Delphi记录dll调用


我正在尝试将C++结构转换为dll调用的delphi记录

// c++ struct

typedef struct dll_info_t
{
   char version[32];
   char r_type[128];
   char b_date[32];
   char c_list[32];
   char build[32];
}dll_info_t;

LIBEX_EXPORT int LIB_API Dll_get_lib_info(dll_info_t* info);

// Delphi Converted

dll_info_t = record
 version:AnsiChar;
 r_type:AnsiChar;
 b_date:AnsiChar;
 c_list:AnsiChar;
 build:AnsiChar;
end;
        
Dll_get_lib_info: Function (info : dll_info_t) : Integer; stdcall;

var
  hHandle:THandle;
begin
  hHandle := LoadLibrary(Dl_path);
    @Dll_get_lib_info:=GetProcAddress(hHandle, PChar('Dll_get_lib_info'));

    if Assigned(Dll_get_lib_info) then begin
     Dll_get_lib_info(info);
     ShowMessage(info.version); // <- I Get Empty Output
     ShowMessage(info.release_type); // <- I Get Empty Output
     ShowMessage(info.build_date); // <- I Get Empty Output
     ShowMessage(info.change_list); // <- I Get Empty Output
    end;

end;

我得到空输出

我不确定转换后的记录是否正确?

我在德尔福在线查过char是Ansichar吗?


共1个答案

匿名用户

字符版本[32]AnsiChar不同,因为该AnsiChar是单个字符。 您需要一个AnsiChar数组(version:array[0..31]of AnsiChar),就像C代码中使用的一样。 您需要对记录的所有成员进行适当的声明。

type
  dll_info_t = record
    version: array [0..31] of AnsiChar;
    r_type: array [0..127] of AnsiChar;
    b_date: array [0..31] of AnsiChar;
    c_list: array [0..31] of AnsiChar;
    build: array [0..31] of AnsiChar;
  end;

var 
  Dll_get_lib_info: Function(out info: dll_info_t): Integer; stdcall;
  hMod: HMODULE;
  info: dll_info_t;
begin
  hMod := LoadLibrary(Dl_path);
  @Dll_get_lib_info := GetProcAddress(hMod, 'Dll_get_lib_info');

  if Assigned(Dll_get_lib_info) then begin
    Dll_get_lib_info(info);
    ShowMessage(info.version);
    ShowMessage(info.release_type);
    ShowMessage(info.build_date);
    ShowMessage(info.change_list);
  end;
end;

stdcall是否正确取决于lib_api宏的定义。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|结构|delphi|记录|dll|调用)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?