Главная страница
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.032 c
3-1096112736
Алексей
2004-09-25 15:45
2004.10.24
DBGrid и номер записи


1-1097311206
DeathLess
2004-10-09 12:40
2004.10.24
Как сменить иконку у exe файла


4-1095408289
gs
2004-09-17 12:04
2004.10.24
Данные системы


14-1097056418
КаПиБаРа
2004-10-06 13:53
2004.10.24
Помогите составить структуру БД.


1-1097248945
DelphiLexx
2004-10-08 19:22
2004.10.24
TComponentEditor