powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / передача строк в/из AutomationObject
9 сообщений из 9, страница 1 из 1
передача строк в/из AutomationObject
    #39706971
неZнайка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, как методу AutomationObject-а передать строку и вернуть строковый результат? Пытаюсь сделать через BSTR или VARIANT (в реализации, естественно, OleVariant) - ругается на EVariantBadVarTypeError (Invalid Variant Type):

Объявление метода (BSTR):


Реализация метода: (BSTR):
Код: sql
1.
2.
3.
4.
function TTestAutomationCoClass.Method1(const param1: WideString): WideString;
begin
  Result := 'Method1 param1 value = "' + param1 + '"';
end;



Тест-проект:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TfrmOleTest.btnTestClick(Sender: TObject);
var
  S: WideString;
  V: OleVariant;
begin
 V := CreateOleObject('TestAuto.TestAutomationCoClass');
 S := 'working';
 S := V.Method1(S);
 ShowMessage(S);
end;



C вариантом аналогично
Объявление метода (VARIANT):


Реализация метода: (VARIANT):
Код: sql
1.
2.
3.
4.
function TTestAutomationCoClassTestAutomationCoClass.Method1(param1: OleVariant): OleVariant;
begin
  Result := 'Method1 param1 value = "' + param1 + '"';
end;



Тест-проект:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TfrmOleTest.btnTestClick(Sender: TObject);
var
  S: String;
  V: OleVariant;
begin
 V := CreateOleObject('TestAuto.TestAutomationCoClass');
 S := 'working';
 S := VarToStr(V.Method1(S));
 ShowMessage(S);
end;

...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39706981
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неZнайка,

по ссылке (VARIANT*) пробовали?
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39706985
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выходной параметр должен также работать с BSTR*
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39706990
неZнайка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VARIANT* в виде входного параметра работает так же, как и в случае с VARIANT. В виде результата его выбрать нельзя.
Да, в случае с вариантами EVariantBadVarTypeError не возвращается, просто пустая строка приходит. Даже если в методе AutomationObject вернуть что-то типа "Result := 'ok';"
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39707040
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неZнайка,
Никогда не возвращайте в результате функции строки или variant. Если хотите возвратить то используйте safecall. Тогда данные будут передаваться через стек, а результат функции будет HRESULT.
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39707048
неZнайка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе BSTR* и VARIANT* создаются, если их таковыми объявить на выход. Другая проблема: как в тестовом приложении прочесть их результат? Я не знаю, как преобразовать OleVariant, который является результатом выполнения функции, в указатель на нужный тип (к примеру PWideString1 = ^WideString), на обычный тайпкаст компилятор ругается.
Вообще в идеале хотелось бы обойтись без указателей, потому что OLE объект вызывается с со скрипта, а он с поинтерами, увы, не дружит, зато умеет работать с вариантами, в т.ч. и OleVariant.
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39707065
неZнайка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014, да я бы не против, это должно выглядеть как in/out параметр или в виде чисто out параметра, верно? вопрос тот же: как это сделать, чтобы оно заработало? Сейчас получился такой код:

Код: sql
1.
2.
3.
4.
procedure TTestAutomationCoClass.Method1(var param1: WideString);
begin
  param1 := 'Method1 param1 value = "' + param1 + '"';
end;



Тест-пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TfrmOleTest.btnTestClick(Sender: TObject);
var
  S: WideString;
  V: OleVariant;
begin
 V := CreateOleObject('TestAuto.TestAutomationCoClass');
 S := 'test';
 V.Method1(S);
 ShowMessage(S);
end;



Результат: EOleSysError with message 'The parameter is incorrect'.
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39707111
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неZнайка,
Покажите код интерфейса?
...
Рейтинг: 0 / 0
передача строк в/из AutomationObject
    #39707190
неZнайка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014, спасибо за помощь :) Где-то был косяк, но мне удалось разобраться. Сделал в двух вариантах:

param1 | BSTR* | [in, out]

и

param1 | BSTR* | [in]
param2 | BSTR* | [out, retval]

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


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