powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL для VBA - возврат большого String
9 сообщений из 9, страница 1 из 1
DLL для VBA - возврат большого String
    #39868172
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

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

Имею
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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



Имею код иници.- й вызов
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;

Или Ваш вариант решение изначальной задачи
Заранее благодарен !
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868243
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_X,

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

Код: pascal
1.
function GetStr(A: WideString): WideString; stdcall;
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868262
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalov,

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

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

C и D возвращаются в основное тело
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868349
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Строки в VBA ansi, что соотвестует PAnsiChar - нужно использовать данный тип, вместо PChar.
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868350
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Нужно также использовать AnsiString вместо String. Это работает для unicode версий делфи.
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868369
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

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

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

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

уточните пожалуйста
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868379
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X, Использование ByRef чем-то ограниченно?
Напиши функцию возврата длинны строки, как делается в виндовом api.
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868382
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Тебе нужно знать, как память выделяется в String в vba. Если используется глобальный менеджер памяти, то GlobalRealloc
...
Рейтинг: 0 / 0
DLL для VBA - возврат большого String
    #39868403
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Спасибо
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL для VBA - возврат большого String
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]