for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

вызов метода ActiveX-контрола с параметром по ссылке
andrewk

Сообщений: 82
Дата: 26.12.17 22:49:42ОтветитьЦитировать
Поиск здесь показал, что проблема возникала в разное время. Только выход из ситуации так и не ясен. Упоминалась статья kb177575, но сейчас msdn её не показывает.
Собственно проблема. Есть ActiveX-контрол. У него некоторые методы вызываются с передачей параметров по ссылке. Вернее, результат возвращается в параметре, переданном по ссылке. Пример из документации в ситаксисе Visual Basic:
  
  fpSpread.GetText(ByVal Col As Long,   ByVal Row As Long,   Var As Variant) As Boolean  
  Col - Column number of cell  
  Row - Row number of cell  
  Var - Text in cell
То есть, в третьем параметре он должен вернуть строку. Там не мегабайты, несколько символов.
Однако при вызове метода возникает ошибка. На любой из вариантов:
  
  qq = Space(4096)  
  qq = Replicate(Chr(0), 4096)  
  qq = ""  
  qq = 0  
  qq = 0.0  
  qq = .null.  
  Dimension qq(1)  
  qq[1] = ''  
  Dimension qq(100)  
  qq = Space(100)
потом .GetText(2,4,@qq) выдаёт "OLE error 0x80020005: type mismatch".
Причём, на такое:
  
  Dimension aa(1) as Byte  
  aa[1] = ''  
  ? .GetText(2,4,@aa)
вылазит уже не OLE-error, а фоксовый "Function argument value, type, or count is invalid". Разные варианты ComArray() никак не влияют.
Как бы это побороть?



Исправлено: andrewk, 26.12.17 22:52
Ratings: 0 negative/0 positive

Re: вызов метода ActiveX-контрола с параметром по ссылке
Igor Korolyov
Автор

Сообщений: 32161
Дата: 27.12.17 12:21:48ОтветитьЦитировать
Если в декларации функции НЕ указано явно ByRef, то параметры передаются по значению вообще то.
Нужно через OleView посмотреть как на самом деле декларирована данная функция, какой там тип параметра. Если это таки "ссылка на Variant" (передаваемый по ссылке, либо являющийся out параметром), то без создания вспомогательной dll/fll скорее всего не обойтись будет.
Статью MSKB, хотя она и относится формально к фоксу 5/6 версии, можно почитать вот тут


------------------
WBR, Igor
Ratings: 0 negative/1 positive

Re: вызов метода ActiveX-контрола с параметром по ссылке
andrewk

Сообщений: 82
Дата: 28.12.17 01:47:03ОтветитьЦитировать
Вот что показывает OleView:
[id(0x000000fc), helpstring("Returns the text of the specified cell."), helpcontext(0x0000178c)]  
  VARIANT_BOOL GetText(  
                  long Col,   
                  long Row,   
                  VARIANT* Var);
Или я не там смотрю?
Ratings: 0 negative/0 positive

Re: вызов метода ActiveX-контрола с параметром по ссылке
Igor Korolyov
Автор

Сообщений: 32161
Дата: 28.12.17 11:40:56ОтветитьЦитировать
Там. Это именно та самая "плохая" ссылка на Variant. Чисто силами фокса это победить нельзя, насколько я понимаю. Возможно, используя АПИ и ассемблерные вставки (т.к. ком-контроллер фокса не сможет передать параметром "адрес Variant-а", даже если через АПИ функции и создать нужный объект/структуру Variant)...
Но проще таки на другом языке сделать обёртку. На каком именно - зависит от имеющихся навыков. Полагаю что на C это было бы оптимально (в виде того же fll - для вообще "прозрачной" интеграции с фоксом), но можно и на C# и даже на "классическом" VB...


------------------
WBR, Igor
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 37 AndyNigmatec ry Simple777  and Guests: 34


© 2000-2018 Fox Club 
Яндекс.Метрика