|
|
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста, как методу AutomationObject-а передать строку и вернуть строковый результат? Пытаюсь сделать через BSTR или VARIANT (в реализации, естественно, OleVariant) - ругается на EVariantBadVarTypeError (Invalid Variant Type): Объявление метода (BSTR): Реализация метода: (BSTR): Код: sql 1. 2. 3. 4. Тест-проект: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. C вариантом аналогично Объявление метода (VARIANT): Реализация метода: (VARIANT): Код: sql 1. 2. 3. 4. Тест-проект: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 13:37 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
неZнайка, по ссылке (VARIANT*) пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 13:45 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
выходной параметр должен также работать с BSTR* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 13:49 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
VARIANT* в виде входного параметра работает так же, как и в случае с VARIANT. В виде результата его выбрать нельзя. Да, в случае с вариантами EVariantBadVarTypeError не возвращается, просто пустая строка приходит. Даже если в методе AutomationObject вернуть что-то типа "Result := 'ok';" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 13:53 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
неZнайка, Никогда не возвращайте в результате функции строки или variant. Если хотите возвратить то используйте safecall. Тогда данные будут передаваться через стек, а результат функции будет HRESULT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 14:23 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
В принципе BSTR* и VARIANT* создаются, если их таковыми объявить на выход. Другая проблема: как в тестовом приложении прочесть их результат? Я не знаю, как преобразовать OleVariant, который является результатом выполнения функции, в указатель на нужный тип (к примеру PWideString1 = ^WideString), на обычный тайпкаст компилятор ругается. Вообще в идеале хотелось бы обойтись без указателей, потому что OLE объект вызывается с со скрипта, а он с поинтерами, увы, не дружит, зато умеет работать с вариантами, в т.ч. и OleVariant. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 14:30 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
ziv-2014, да я бы не против, это должно выглядеть как in/out параметр или в виде чисто out параметра, верно? вопрос тот же: как это сделать, чтобы оно заработало? Сейчас получился такой код: Код: sql 1. 2. 3. 4. Тест-пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Результат: EOleSysError with message 'The parameter is incorrect'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 14:43 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
неZнайка, Покажите код интерфейса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 15:16 |
|
||
|
передача строк в/из AutomationObject
|
|||
|---|---|---|---|
|
#18+
ziv-2014, спасибо за помощь :) Где-то был косяк, но мне удалось разобраться. Сделал в двух вариантах: param1 | BSTR* | [in, out] и param1 | BSTR* | [in] param2 | BSTR* | [out, retval] в обоих случаях всё работает отлично: либо строка возвращается в тот же параметр, либо как результат вызова функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 16:40 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=96&tid=2040378]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 311ms |

| 0 / 0 |
