Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

VB + COM   Найти похожие ветки 

 
clickmaker ©   (2004-10-01 11:02) [0]

Вопрос не по дельфи, но может кто сталкивался.
Есть COM-объект, написанный на Visual C++ 6 (DLL). Объявление метода - стандартное
STDMETHODIMP MyClass::MyMethod()
Если все хорошо, возвращает S_OK (0), иначе S_FALSE (1)

Возникла нужда вызывать этот метод из проги, написанной на VB 6. Пишу так:
Dim MyObj As Object
Dim RetVal As Long
Set MyObj = CreateObject("MyObjClassName")
RetVal = MyObj.MyMethod

Так вот, независимо от того, что вернет MyMethod, RetVal всегда = 0. Почему?


 
DiamondShark ©   (2004-10-01 11:12) [1]

Потому что в VB этому методу соответствует
Sub MyMethod


 
DiamondShark ©   (2004-10-01 11:13) [2]

Т.е. не функция, а процедура.


 
clickmaker ©   (2004-10-01 11:14) [3]


> [2] DiamondShark ©   (01.10.04 11:13)
> Т.е. не функция, а процедура.

Эээ... И что же делать?


 
DiamondShark ©   (2004-10-01 11:36) [4]


> Эээ... И что же делать?

Вариант 1.
Возвращать не S_FALSE, а какой-либо HResult с битом Severity(31) = 1.
Тогда программа на VB словит ексепшн, который можно перехватить и обработать (оператор On Error)

Вариант 2.
Определить возвращаемый параметр (синтаксис IDL):
HRESULT _stdcall MyMethod([out, retval] long * Result );

Тогда с точки зрения VB это будет функция:
Function MyMethod As Long


 
clickmaker ©   (2004-10-01 12:06) [5]


> [4] DiamondShark ©   (01.10.04 11:36)

Спасибо!
Но появился еще вопросик. Есть такой код (VB 6)

Const BIF_BROWSEFORCOMPUTER = &H1000
Const CSIDL_NETWORK = &H12

Type BrowseInfo
  hwndOwner      As Long
  pIDLRoot       As Long
  pszDisplayName As String
  lpszTitle      As String
  ulFlags        As Long
  lpfnCallback   As Long
  lParam         As Long
  iImage         As Long
End Type

Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
    (ByVal hwndOwner As Long, _
    ByVal nFolder As Long, ppidl As Long) As Long

Declare Function SHBrowseForFolder Lib "shell32" _
                                   (lpbi As BrowseInfo) As Long

Dim Res As Long
Dim RootItemIDList As Long
Dim lpIDList As Long
Dim tBrowseInfo As BrowseInfo
 
Res = SHGetSpecialFolderLocation(Me.hWnd, CSIDL_NETWORK, tBrowseInfo.pIDLRoot)
 
With tBrowseInfo
 .hwndOwner = Me.hWnd
 .lpszTitle = "Выберите компьютер"
 .ulFlags = BIF_BROWSEFORCOMPUTER
 .pszDisplayName = Space(16)
 .lpfnCallback = 0
 .lParam = 0
End With

lpIDList = SHBrowseForFolder(tBrowseInfo)


Хотя указано CSIDL_NETWORK, диалог открывается все равно в корне, т.е. Рабочий стол


 
DiamondShark ©   (2004-10-01 12:24) [6]

Ну, видимо,
Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
   (ByVal hwndOwner As Long, _
   ByVal nFolder As Long, ByRef ppidl As Long) As Long

(или оно по умолчанию байреф?)

У меня просто нет сейчас VB 6, но в VBA (Excel) после copy/paste всё сработало, открылось "Сетевое окружение".

А что-нибудь в pIDLRoot возвращается?


 
clickmaker ©   (2004-10-01 12:37) [7]


> [6] DiamondShark ©   (01.10.04 12:24)

в pIDLRoot возвращается число, результат функции = 0, т.е. типа все ОК. Насколько я знаю, бай реф - по умолчанию, впрочем, явное указание не помогло.



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
14-1096792176
gn
2004-10-03 12:29
2004.10.24
^-)


1-1097547225
Marat
2004-10-12 06:13
2004.10.24
TStringGrid


1-1097356874
fmaker
2004-10-10 01:21
2004.10.24
Как сделать форму которая икогда бы не смогла бы быть активной,


14-1096545934
pasha_golub
2004-09-30 16:05
2004.10.24
TheBat3.0


14-1097047755
RDen
2004-10-06 11:29
2004.10.24
Иероглифы при копировании через буфер