【发布时间】:2016-10-28 08:50:11
【问题描述】:
我想使用 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
}
在第二次通话中,我遇到了访问冲突,但看不到为什么/哪里错了
【问题讨论】:
-
C++ 函数原型必须将 bufSize 声明为指向双字的指针。调用时,使用 &bufSize 引用传递。 *BufSize = 0, 应该是 BufSize = 0;