【问题标题】:Import Delphi DLL function into C++ Builder , transfer PAnsiChar将 Delphi DLL 函数导入 C++ Builder , 调用 PAnsiChar
【发布时间】: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;

标签: c++ delphi dll


【解决方案1】:

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

函数真的应该这样声明:

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++ 字符串对象而不是原始内存。循环看起来错过了最后一次迭代,应该是&lt;= count - 1&lt; count。您的类型名称IntCharIntIn_VoidOut 无法识别其中两个参数是指针。我用的是char*而不是PAnsiChar,但我猜后者只是前者的别名。

以上这些我都交给你处理了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多