c++ - 如何在函数返回之前将新大小的数组从 C++ DLL 发送到 Delphi

标签 c++ delphi

如果 C++ DLL 函数复制更长的数组,我想在 Delphi 程序中更改缓冲区数组的大小。 德尔福代码:

function sendUserAllocatedArray(AllocatedArrayPtr: PAnsiChar; Length: Integer): Integer; cdecl;
external 'DLLlibrary.dll';

var
  myCharPtr : PAnsiChar;
  size : integer;  
  UserAllocatedArray: array[0..10] of AnsiChar;
  arrayPtr: PAnsiChar;
begin
    UserAllocatedArray :=  'test123';
    arrayPtr := UserAllocatedArray;
    size := sendUserAllocatedArray(arrayPtr, Length(UserAllocatedArray));   
end

C++ 动态链接库:

extern "C" __declspec(dllexport) int sendUserAllocatedArray(char* data, int length);

int sendUserAllocatedArray(char* data, int length)
{
    char char_array[] = "this array length is more than 10";
    datLength = sizeof(char_array);
    if(datLength < length)
        strcpy_s(data, length, char_array);
    else
        ....;   

    return length;
}

因此,如果在 DLL 函数将数据复制到数组之前需要更大的缓冲区,我需要分配更多空间。 我需要处理程序吗?怎么办。

最佳答案

鉴于您显示的代码,唯一的方法来做你想做的事情(不改变 DLL 函数的签名)是如果 DLL 函数返回如果输入缓冲区太长则所需的缓冲区长度小,例如:

extern "C" __declspec(dllexport) int sendUserAllocatedArray(char* data, int length);

int sendUserAllocatedArray(char* data, int length)
{
    char char_array[] = "this array length is more than 10";
    int datLength = sizeof(char_array);
    if ((data) && (datLength <= length))
        memcpy(data, char_array, length);
    return datLength;
}

然后Delphi代码可以这样做:

function sendUserAllocatedArray(AllocatedArrayPtr: PAnsiChar; Length: Integer): Integer; cdecl; external 'DLLlibrary.dll';

var
  myCharPtr : array of AnsiChar;
  size : integer;  
  UserAllocatedArray: array[0..10] of AnsiChar;
  arrayPtr: PAnsiChar;
begin
  UserAllocatedArray := 'test123';
  size := sendUserAllocatedArray(UserAllocatedArray, Length(UserAllocatedArray));
  if size <= Length(UserAllocatedArray) then
  begin
    arrayPtr := UserAllocatedArray;
  end else
  begin
    SetLength(myCharPtr, size);
    arrayPtr := PAnsiChar(myCharPtr);
    StrLCopy(arrayPtr, UserAllocatedArray, size-1);
    size := sendUserAllocatedArray(arrayPtr, size);
  end;
  // use arrayPtr up to size chars as needed...
end;

可以简化为:

function sendUserAllocatedArray(AllocatedArrayPtr: PAnsiChar; Length: Integer): Integer; cdecl; external 'DLLlibrary.dll';

var
  size : integer;  
  UserAllocatedArray: array of AnsiChar;
begin
  SetLength(UserAllocatedArray, 10);
  StrLCopy(PAnsiChar(UserAllocatedArray), 'test123', Length(UserAllocatedArray)-1);
  repeat
    size := sendUserAllocatedArray(PAnsiChar(UserAllocatedArray), Length(UserAllocatedArray));
    if size <= Length(UserAllocatedArray) then Break;
    SetLength(UserAllocatedArray, size);
  until False;
  // use UserAllocatedArray up to size chars as needed...
end;

或者这个:

function sendUserAllocatedArray(AllocatedArrayPtr: PAnsiChar; Length: Integer): Integer; cdecl; external 'DLLlibrary.dll';

var
  size : integer;  
  UserAllocatedArray: array of AnsiChar;
begin
  size := sendUserAllocatedArray(nil, 0);
  SetLength(UserAllocatedArray, size);
  StrLCopy(PAnsiChar(UserAllocatedArray), 'test123', size-1);
  size := sendUserAllocatedArray(PAnsiChar(UserAllocatedArray), size);
  // use UserAllocatedArray up to size chars as needed...
end;

关于c++ - 如何在函数返回之前将新大小的数组从 C++ DLL 发送到 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63018391/

相关文章:

c++ - 如何找到大数乘法模 100000007

delphi - 如何在 TAdvStringGrid 中进行反向选择?

delphi - 如何清除鼠标点击缓冲区

delphi - TImageList.ShareImages-如何准确使用而不必复制内容?

c++ - QWidget "access violation"异常

c++ - 编写一个循环以更改具有不同名称的 int 数组中的值

delphi - 在Delphi 2007中哪里可以找到字符串常量srStandard?

delphi - Delphi 中的自定义控件创建

c++ - 类析构函数导致重载+运算符的问题

c++ - 将类作为参数传递c++