Текущий архив: 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.46 MB
Время: 0.038 c