Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.043 c
1-1097000507
RedDragon
2004-10-05 22:21
2004.10.24
как мне сохранить переменные, не используя базы данных...


1-1097139583
Andrey_
2004-10-07 12:59
2004.10.24
очистка image.picture


4-1095366786
Alehandro
2004-09-17 00:33
2004.10.24
стандартное диалоговое окно для поиска открываемого/сохраняемого


6-1092730970
Дмитрий(Оренбург)
2004-08-17 12:22
2004.10.24
NSMTP


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский