Страница 1 из 2

Передача параметров в OLE посредством BIND

Добавлено: 20 Октябрь 2009, 5:44
vassilio
Раньше никогда не сталкивался, поскольку использовал передачу параметров по значению и обходился обычным связыванием их в строку:
?Ole{'Command(' & X & ',' & Y & ',' & Z & ')'}
Однако, потребовалось мне тут загонять их по ссылке. Воспользовался предварительным BINDом, как это описано в хэлпе "Parameter Passing to OLE/OCX Methods"- ничего не получилось.
Для теста попробовал испытать этот самый bind-метод и при передаче по значению - опять-таки, не работает :(
Никто не подскажет, чей это глюк - clarion, ole или мой? И как его можно перебороть.
(использую С 6.3)

Re: Передача параметров в OLE посредством BIND

Добавлено: 20 Октябрь 2009, 10:08
Yufil
По-моему, речь не идёт о передаче по ссылке. В ряде случаев просто невозможно подставить значение (например, если оно содержит запятую, пробел или кавычки), поэтому и приходится использовать такой механизм.

Re: Передача параметров в OLE посредством BIND

Добавлено: 20 Октябрь 2009, 16:58
vassilio
Необходимость (как единственная возможность сделать это языковыми средствами Clarion) возникает, всё ж, именно при передаче параметра в OLE по ссылке.
Но это не суть важно: факт, что этот bind-механизм у меня почему-то не пашет -- "разименовывания" забинденных переменных в ?Ole{ } не происходит
:(.

Re: Передача параметров в OLE посредством BIND

Добавлено: 20 Октябрь 2009, 18:14
Дед Пахом
а код привести Заратустра не позволяет?

Re: Передача параметров в OLE посредством BIND

Добавлено: 20 Октябрь 2009, 23:14
vassilio
Дед Пахом писал(а):а код привести Заратустра не позволяет?
Код - ничем не отличается от того, что приведён в документации, типа

Код: Выделить всё

data
Buffer         string(4096)
BufferSize   long(size(Buffer))
code
  ...
  ...
  bind('Buffer', Buffer)
  bind('BufferSize', BufferSize)
  ReadingByts# = ?OLE{ 'Read(&Buffer, BufferSize)' }

Re: Передача параметров в OLE посредством BIND

Добавлено: 21 Октябрь 2009, 2:38
WadimZapara
Может, нужно проверить:
1) порядок параметров метода,
2) нужное их количество,
3) возможность передачи по значению второго параметра,
4) а тот ли метод.

Re: Передача параметров в OLE посредством BIND

Добавлено: 24 Октябрь 2009, 19:21
vassilio
Спасибо, но Вы забыли указать ещё один важный пункт:
"5. Проверьте, а не затесалась ли у вас где русская буковка "с" вместо латинской "c" ;)))

Re: Передача параметров в OLE посредством BIND

Добавлено: 26 Октябрь 2009, 15:12
WadimZapara
Так помогло? Рад. :D

Re: Передача параметров в OLE посредством BIND

Добавлено: 28 Октябрь 2009, 21:12
vassilio
К сожалению, не помогло (это я так, злобствую: ну, там же крайне сложно запутаться, когда передаётся всего один параметр).
На самом деле, натыкался где-то здесь, в форуме, что кто-то уже сталкивался с подобной проблемой. Видимо, дело, всё ж, в Clarion (что довольно странно, поскольку SV сейчас усиленно рекламирует свой продукт именно как хорошую "связку" для всяких там ActiveX-Ole.)

Re: Передача параметров в OLE посредством BIND

Добавлено: 29 Октябрь 2009, 9:08
Игорь Столяров
vassilio писал(а):(что довольно странно, поскольку SV сейчас усиленно рекламирует свой продукт именно как хорошую "связку" для всяких там ActiveX-Ole.)
Привет !

Как говорится: есть ложь, есть наглая ложь и есть заявления SoftVelocity (особенно по C7) ... :wink:

Но если честно - я такого заявления никогда не слышал. Интерфейс Clarion по работе с OLE & ActiveX изначально был "притянут за уши" в синтаксис языка и сделано это было, пардон, но через жо ... у. Базовые проблемы и их "решения" описаны в справке по Clarion. Сталкивался с этим неодноднократно - например так и не удалось сделать прямое взаимодействие через ActivX с библиотекой шифрования MS Capicom - хотя времени и сил было потрачено значительно больше чем нужно ... :( (пришлось сделать через генерацию VBS скрипта и его выполнения в фоновом режиме - не дай бог заказчик узнает) и т.д. и т.п. Поэтому если, что-то не получается - не грусти, это тот случай когда дело именно в бобине, а не в том, кто сидит в кабине ... ;)

Re: Передача параметров в OLE посредством BIND

Добавлено: 03 Ноябрь 2009, 11:04
WadimZapara
vassilio писал(а):К сожалению, не помогло (это я так, злобствую: ну, там же крайне сложно запутаться, когда передаётся всего один параметр).
Извини всё же: в твоём примере выше указано:
ReadingByts# = ?OLE{ 'Read(&Buffer, BufferSize)' }
Как бы, очень кажется, что второй параметр тоже должен быть по ссылке - размер записанного в буфер!
Может попробовал-бы...

Re: Передача параметров в OLE посредством BIND

Добавлено: 03 Ноябрь 2009, 12:21
Дед Пахом
Размер входного буфера никогда по ссылке не передаётся. В крайнем случае (при изменении размера буфера внутри метода) метод возвращает новый размер через return или через другой аргумент.

Re: Передача параметров в OLE посредством BIND

Добавлено: 03 Ноябрь 2009, 16:49
Yufil
Кстати, а почему не 'Read(&Buffer,&Buffersize)' ?

Re: Передача параметров в OLE посредством BIND

Добавлено: 05 Ноябрь 2009, 2:20
WadimZapara
Дед Пахом писал(а):Размер входного буфера никогда по ссылке не передаётся.
Вернее было бы сказать "обычно по ссылке не передаётся". Ведь нам неизвестно какой OLE использован. По-моему, в каком-то методе Active Directory присутствует именно такой вариант, что в параметр, передаваемый по ссылке, в метод - передаётся размер буфера, и в него же - методом возвращается - число записанных байт. Сейчас не уточню, какой именно... :wink:
Может предложим автору раскрыть тайну, что именно за OLE ?

Re: Передача параметров в OLE посредством BIND

Добавлено: 05 Февраль 2010, 2:05
WadimZapara
Дед Пахом писал(а):Размер входного буфера никогда по ссылке не передаётся. В крайнем случае (при изменении размера буфера внутри метода) метод возвращает новый размер через return или через другой аргумент.
Вот и попалось опровержение:

BOOL WINAPI LookupAccountName(
__in_opt LPCTSTR lpSystemName,
__in LPCTSTR lpAccountName,
__out_opt PSID Sid,
__inout LPDWORD cbSid,
__out_opt LPTSTR ReferencedDomainName,
__inout LPDWORD cchReferencedDomainName,
__out PSID_NAME_USE peUse
);

cbSid [in, out] - A pointer to a variable. On input, this value specifies the size, in bytes, of the Sid buffer. If the function fails because the buffer is too small or if cbSid is zero, this variable receives the required buffer size.

cchReferencedDomainName [in, out] - A pointer to a variable. On input, this value specifies the size, in TCHARs, of the ReferencedDomainName buffer. If the function fails because the buffer is too small, this variable receives the required buffer size, including the terminating null character. If the ReferencedDomainName parameter is NULL, this parameter must be zero.