DLL для VBA - возврат большого String

HOME_X
Дата: 27.09.2019 21:52:30
Доброго дня господа !

Необходимо из VBA вызвать функцию DLL (Delphi) и вернуть переменную типа String

Имею
Library Example;
uses SysUtils;

procedure GetStr(A: PChar; B: PChar); stdcall;
var tmpStr: string;
begin
   tmpStr:=A;
   tmpStr:=tmpStr + 'Change value';   
   StrPLCopy(B,tmpStr, Length(tmpStr)); 
end;

exports
   GetStr name 'GetStr';

begin

end


Имею код иници.- й вызов
Public Declare Sub GetStr Lib "Example.dll" (ByVal A As String, ByVal B As String)
---------------------------------------------------------------------------------------------
Public Sub Test_GetStr()
  Dim A As String
  Dim B As String

  A="This is a test..."
  B = String(100, vbNullChar) 'reserve size B'
  Сall GetStr (A,B)
  MsgBox "!" & B & "!"
End Sub


Проблема !!
Переменная B - может быть достаточна велика. а резервировать много памяти не очень хочется
B = String(10000, vbNullChar) 'reserve size B'

Передать PChar по ссылке не имею возможности, декларирование VBA увы не позволяет
Public Declare Sub GetStr Lib "Example.dll" (ByVal A As String, ByRef B As String)

Подскажите можно ли динамически увеличить размерность PChar
begin
tmpStr:=A;
tmpStr:=tmpStr + 'Change value';
Resize(B,Length(tmpStr)+1) ????????????????
StrPLCopy(B,tmpStr, Length(tmpStr));
end;

Или Ваш вариант решение изначальной задачи
Заранее благодарен !
rashid.abzalov
Дата: 28.09.2019 00:54:19
HOME_X,

Использовать WideString вместо String?

function GetStr(A: WideString): WideString; stdcall;
HOME_X
Дата: 28.09.2019 01:26:37
rashid.abzalov,

Испробую, но если нужно вернуть НЕСКОЛЬКО показателей ?

function GetStr(A: WideString; С: PChar; D: PChar): WideString; stdcall;

C и D возвращаются в основное тело
ziv-2014
Дата: 28.09.2019 12:08:51
HOME_X,
Строки в VBA ansi, что соотвестует PAnsiChar - нужно использовать данный тип, вместо PChar.
ziv-2014
Дата: 28.09.2019 12:11:11
HOME_X,
Нужно также использовать AnsiString вместо String. Это работает для unicode версий делфи.
HOME_X
Дата: 28.09.2019 12:46:20
ziv-2014,

не совсем понял - как динамически изменить длину массива
т.е PChar или PAnsiChar

или при использовании PAnsiChar возможно использовать ByRef

Public Declare Sub GetStr Lib "Example.dll" (ByVal A As String, ByRef B As String)

уточните пожалуйста
ziv-2014
Дата: 28.09.2019 13:25:40
HOME_X, Использование ByRef чем-то ограниченно?
Напиши функцию возврата длинны строки, как делается в виндовом api.
ziv-2014
Дата: 28.09.2019 13:32:23
HOME_X,
Тебе нужно знать, как память выделяется в String в vba. Если используется глобальный менеджер памяти, то GlobalRealloc
HOME_X
Дата: 28.09.2019 14:41:58
ziv-2014,

Задача решена

Delphi
(var S: OleVariant)
begin
P:='Big Hello';
S:=OleVariant(P);
end


VBA
declare F1 ................(ByRef V as Variant)
Dim V as Variant,S as String
V=Null
F1(..V...)
S=P

Спасибо