Тема: COM передать параметр по ссылке
Пишу интеграцию с Компас.11, работаю с ним через его АПИ.
Если функции возвращают LPDISPATCH, то пишу следующим образом:
'LPDISPATCH GetParamStruct (short structType); Set iTextLineParam = iKompasObject.GetParamStruct(29)
Все работает. Но есть функция, возвращающая тот же тип результата, но вызывающая ошибку:
'LPDISPATCH ksGetStampColumnText (long* numb); Set iTextLineDynamicArray = iStamp.GetStampColumnText( numb ) 'ОШИБКА - Объект не поддерживает это свойство или метод iStamp.GetStampColumnText
Есть подозрение, что параметр надо передавать не по значению, а по ссылке.
Как это сделать? Преобразование VarPtr(numb) - не работает
Полный текст:
Sub FormMacro_COMTEST(TCSActiveModule) ' Проверка COM kStarted = 0 'открываемый файл fileName = "C:\Program Files\CSoft\TechnologiCS\TEMP\46.19-1.cdw" 'открыть компас On Error Resume Next Set iKompasObject = GetObject(,"KOMPAS.Application.5") 'это если уже запущен If Err Then Set iKompasObject = CreateObject("KOMPAS.Application.5") kStarted = 1 Err.Clear End If On Error goto 0 iKompasObject.Visible = True ' показать компас 'открыть выгруженный файл Set d2d = iKompasObject.Document2D res = d2d.ksOpenDocument( fileName, False ) Set parStruct = iKompasObject.GetParamStruct(35) 'Получить интерфейс ksStamp основной надписи документа. Set iStamp = d2d.GetStamp() 'Открыть основную надпись. iStamp.ksOpenStamp() numb = 2 'long ksColumnNumber (long numb); //Определить номер ячейки основной надписи iStamp.ksColumnNumber numb 'iTextLineParam:=ksTextLineParam(iKompas.GetParamStruct(ko_TextLineParam)); 'iTextItemParam:=ksTextItemParam(iKompas.GetParamStruct(ko_TextItemParam)); Set iTextLineParam = iKompasObject.GetParamStruct(29) Set iTextItemParam = iKompasObject.GetParamStruct(31) 'LPDISPATCH ksGetStampColumnText (long* numb); 'LPDISPATCH GetParamStruct (short structType); 'iTextLineDynamicArray:=ksDynamicArray(iStamp.ksGetStampColumnText(numb)); 'iTextLineDynamicArray.ksGetArrayItem(0, iTextLineParam); 'iTextItemDynamicArray:=ksDynamicArray(iTextLineParam.GetTextItemArr()); 'iTextItemDynamicArray.ksGetArrayItem(0, iTextItemParam); 'Получить текст ячейки основной надписи. 'LPDISPATCH ksGetStampColumnText (long* numb); Set iTextLineDynamicArray = iStamp.GetStampColumnText( numb ) 'ОШИБКА - Объект не поддерживает это свойство или метод iStamp.GetStampColumnText 'Закрыть основную надпись. Istamp.ksCloseStamp() If kStarted = 1 Then iKompasObject.Quit 'закрытие компаса End Sub