Delphi 记录 dll 调用的 C++ 结构
C++ struct to Delphi Record dll call
我正在尝试将 C++ 结构转换为 delphi 记录 dll 调用
// 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;
我得到空输出
我不确定转换后的记录是否正确?
我查过在线字符 delphi 是 Ansichar ?
char version[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
宏的定义。
我正在尝试将 C++ 结构转换为 delphi 记录 dll 调用
// 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;
我得到空输出
我不确定转换后的记录是否正确?
我查过在线字符 delphi 是 Ansichar ?
char version[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
宏的定义。