gpt4 book ai didi

c++ - 将 Delphi DLL 函数导入 C++ Builder ,调用 PAnsiChar

转载 作者:行者123 更新时间:2023-11-27 23:59:28 26 4
gpt4 key购买 nike

我想使用 Delphi 代码,通过 C++ Builder 中的 DLL 导出

Delphi 代码片段是这样的

//  function declare 
function NameData(ItemIndex: Integer;
Buffer: PAnsiChar; var BufSize: DWORD): DWORD; stdcall;
external 'database.dll'


// function calling code
s1, S2: AnsiString;
begin


for i := 1 to ... do
begin
BufSize := 0;
NameData(i, nil, BufSize);
SetLength(s1, BufSize);
NameData(i, PAnsiChar(s1), BufSize);

mmo_dll.lines.Add(' name -> ' + string(s1));

相关DLL代码

library DLLCode; 


function NameData(ItemIndex: Integer;
Buffer: PAnsiChar; var BufSize: DWORD): DWORD; stdcall;
var
returnString: Ansistring;
begin
returnString := ' call some other functions .....';

if BufSize < Length(returnString) then
result := ERROR_BUFFER_TOO_SMALL
else
begin
StrPCopy(Buffer, returnString);
result := ERROR_NO_ERROR;
end;
BufSize := Length(returnString);
end;

Delphi 和 Delphi DLL,这个和其他很多东西都很好用。现在这是我不工作的 C++ 代码:

//  function prototype 
typedef void (__stdcall*IntCharIntIn_VoidOut)(int, PAnsiChar, int);

// DLL prototype
extern "C" __declspec(dllimport)
IntCharIntIn_VoidOut __stdcall NameData(int, PAnsiChar, int);

// instance declaration
IntCharIntIn_VoidOut NameData;


// load library data, no error raise, other simpler function call already working

........
NameData = (IntCharIntIn_VoidOut)::GetProcAddress(load,
"NameData");


/// calling code
int Bufsize;
PAnsiChar DataName;


for (i = 0; i < count - 1; i++) {

*Bufsize = 0;

NameData(i, NULL, Bufsize);

StrLen(SignalName);

NameData(i, DataName, Bufsize );


Memo1->Lines->Add(IntToStr(i)); // for test only
}

在第二次调用中,我遇到了访问冲突,但看不出为什么/哪里错了

最佳答案

你没有分配任何内存,而且你的函数声明是错误的。

函数真的应该这样声明:

typedef void (__stdcall *IntCharIntIn_VoidOut)(int, char*, unsigned int*);

你的调用代码应该是:

unsigned int Bufsize;
char* DataName;

for (i = 0; i < count - 1; i++) {
Bufsize = 0;
NameData(i, NULL, &Bufsize);
DataName = new char[Bufsize + 1];
NameData(i, DataName, &Bufsize);
// do something with DataName
delete[] DataName;
}

我省略了对内存分配和释放的错误检查。如果是我,我会使用成熟的 C++ 字符串对象而不是原始内存。循环看起来好像错过了最后一次迭代,应该是 <= count - 1< count一定。您的类型名称,IntCharIntIn_VoidOut无法识别其中两个参数是指针。我正在使用 char*而不是 PAnsiChar , 但我猜后者只是前者的别名。

我会把以上所有事情留给你处理。

关于c++ - 将 Delphi DLL 函数导入 C++ Builder ,调用 PAnsiChar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com