在VC++中调用Delphi编写的DLL,并且该DLL函数参数包含记录(在Delphi中称为结构体),你需要确保在两种语言中记录的布局是一致的。对于返回参数,如果记录是通过指针或引用返回的,你也需要正确处理。 以下是一个示例,展示了如何在Delphi中定义一个包含记录的函数,以及如何在VC++中调用它。 Delphi DLL首先,在Delphi中定义你的DLL和记录: - library DelphiDLL;
- uses
- SysUtils, Classes;
- type
- TPerson = record
- Name: array[0..49] of Char;
- Age: Integer;
- end;
- function GetPersonInfo(out Person: TPerson): Boolean; stdcall;
- var
- // 假设这里有一些逻辑来填充Person记录
- begin
- StrCopy(Person.Name, 'John Doe');
- Person.Age := 30;
- Result := True;
- end;
- exports
- GetPersonInfo;
- begin
- end.
复制代码在上面的Delphi代码中,TPerson是一个记录,包含Name和Age两个字段。GetPersonInfo函数接受一个TPerson类型的out参数,用于返回信息。 VC++ 调用在VC++中,你需要定义一个与Delphi记录相对应的结构体,并确保内存布局一致。然后,你可以调用DLL中的函数。 - #include <windows.h>
- #include <iostream>
- #include <cstring>
- // 定义与Delphi记录对应的C++结构体
- struct TPerson {
- char Name[50];
- int Age;
- };
- // 定义DLL函数的类型
- typedef BOOL (*GetPersonInfoProc)(TPerson* Person);
- int main() {
- HINSTANCE hInst = LoadLibrary(TEXT("DelphiDLL.dll"));
- if (hInst != NULL) {
- GetPersonInfoProc GetPersonInfo = (GetPersonInfoProc)GetProcAddress(hInst, "GetPersonInfo");
- if (GetPersonInfo != NULL) {
- TPerson person;
- // 调用DLL函数
- if (GetPersonInfo(&person)) {
- std::cout << "Name: " << person.Name << std::endl;
- std::cout << "Age: " << person.Age << std::endl;
- } else {
- std::cerr << "Failed to get person info." << std::endl;
- }
- } else {
- std::cerr << "Failed to get function address." << std::endl;
- }
- FreeLibrary(hInst);
- } else {
- std::cerr << "Failed to load library." << std::endl;
- }
- return 0;
- }
复制代码在上面的VC++代码中,我们定义了一个TPerson结构体,它与Delphi中的TPerson记录具有相同的字段和内存布局。然后,我们加载DLL,获取GetPersonInfo函数的地址,并调用它。通过传递TPerson结构体的地址作为参数,我们可以接收从DLL返回的信息。 请确保Delphi DLL的编译选项与VC++的调用方式兼容(例如,使用相同的调用约定,通常是stdcall)。此外,如果DLL和调用程序在不同的编译器或平台上编译,可能需要考虑结构体的字节对齐和填充问题。 最后,记得在编译和运行之前将DLL的路径设置为正确的位置,并确保DLL文件是可用的。
|