powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблема вызова метода COM объекта из VB
5 сообщений из 5, страница 1 из 1
Проблема вызова метода COM объекта из VB
    #32544080
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите решить проблему. Я написал на С++ COM объект и при попытке вызвать его метод из VB, возникает ошибка. Выдается сообщение о том что несответсвуют типы танных.

На С++ метод объявлен так:
STDMETHOD(RunService)(BSTR ServiceName, int* ErrorCode);

Из VB вызываю так
Dim ObjServCtrl As Object
Dim Err As Integer

Set ObjServCtrl = CreateObject("Servctrl.ServController")
ObjServCtrl.RunService TextNameSrv.Text, Err

Проблема возникает со вторым параметром (Err).
Что здесь не так?
...
Рейтинг: 0 / 0
Проблема вызова метода COM объекта из VB
    #32544146
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагаю, что программированием COM-объектов вы занялись недавно.
1. Для точной диагностики проблемы было бы замечательно, если бы Вы представили также и описание интерфейса, реализуещего метод RunService, из соответствующего файла IDL. Можно было бы понять, что Вы хотели.
2. В отсутствие IDL могу лишь предположить, что ошибка по делу: аргумент метода *ErrorCode имеет тип int (размерность 4 байта), а клиент подсовывает ему тип Integer (размерность 2 байта). Попробуйте поменять тип переменной Err в коде клиента VB на тип Long
...
Рейтинг: 0 / 0
Проблема вызова метода COM объекта из VB
    #32544816
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предполагаю, что программированием COM-объектов вы занялись недавно.
1. Для точной диагностики проблемы было бы замечательно, если бы Вы представили также и описание интерфейса, реализуещего метод RunService, из соответствующего файла IDL. Можно было бы понять, что Вы хотели.
2. В отсутствие IDL могу лишь предположить, что ошибка по делу: аргумент метода *ErrorCode имеет тип int (размерность 4 байта), а клиент подсовывает ему тип Integer (размерность 2 байта). Попробуйте поменять тип переменной Err в коде клиента VB на тип Long

to Dominic
Программированием COM-объектов занимаюсь примерно 1,5года, использую
С++, Delphi
А на VB впервые в жизни пытаюсь написать программу.

Вам спасибо. Ваш совет помог. Поменял в VB тип на Long и все заработало.

А вот IDL
interface IServController : IDispatch
{
[id(1), helpstring("method RunService")] HRESULT RunService(BSTR ServiceName, [out] int* ErrorCode);
[id(2), helpstring("method StopService")] HRESULT StopService(BSTR ServiceName, [out] int* ErrorCode);
};
...
Рейтинг: 0 / 0
Проблема вызова метода COM объекта из VB
    #32545788
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего личного. Просто имя переменной ErrorCode напомнило мне мои собственные попытки освоить передачу ошибок из компонентов в клиентскую программу. Если Вы действительно таким способом извещаете клиента об ошибке - не сочтите за оскорбление совет потратить время на изучение поддержки компонентом интерфейса ISupportErrorInfo и передачей кода ошибки через возвращаемое методом компонента значение HRESULT. Поверьте, сэкономите уйму времени, а если Ваш компонент будет использовать другой программист из VB - то еще и уйму нервов. Взгляните, например, на мой код метода компонента, поддерживающего ISupportErrorInfo:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
STDMETHODIMP CTelephones::Remove(VARIANT Index)
{
	TelephonesColl::ContainerType::iterator it;
	switch (Index.vt)
	{
	case VT_I2:
	case VT_I4:
		if (Index.lVal <  1  || Index.lVal > m_nCount)
			return Error(L"Индекс вне допустимого диапазона",GUID_NULL,
				MAKE_HRESULT( 1 ,FACILITY_ITF,KEY_INVALID));
		it = m_coll.begin();
		std::advance(it, Index.lVal -  1 );
		break;
	case VT_BSTR:
		it = m_coll.find(_bstr_t(Index.bstrVal));
		if (it == m_coll.end())
			return Error(L"Указанный элемент не найден",GUID_NULL,
				MAKE_HRESULT( 1 ,FACILITY_ITF,UNKNOWN_PHONE));
		break;
	case VT_BYREF | VT_DISPATCH:
		Index.vt = VT_DISPATCH;
		Index.pdispVal = *Index.ppdispVal;
	case VT_DISPATCH:
		for (it = m_coll.begin(); it != m_coll.end(); it++)
			if (Index.pdispVal == it->second.pdispVal)
				break;
		if (it == m_coll.end())
			return Error(L"Указанный элемент не найден",GUID_NULL,
				MAKE_HRESULT( 1 ,FACILITY_ITF,UNKNOWN_PHONE));
		break;
	default:
		return Error(L"Неверный тип индекса/ключа",GUID_NULL,
			MAKE_HRESULT( 1 ,FACILITY_ITF,LOST_INDEX));
	}

	((it->second).pdispVal)->Release();
	m_coll.erase(it);
	m_nCount --;
 

	return S_OK;
}

При поддержке ISupportErrorInfo в компоненте становится доступен вызов его функции Error, возвращающей HRESULT, который Вы лично собираете с помощью макроса MAKE_HRESULT. Третий аргумент этого макроса может быть объявлен где-нибудь в MyError.h:

Код: plaintext
1.
2.
3.
4.
5.
6.
//ошибки всех коллекций:		 1 - 255 
#define COMMON_OFFSET			0x000000FF
#define KEY_INVALID				0x00000001	//неуникальный, неверный ключ
#define UNKNOWN_PARENT			0x00000002	//недопустимый родительский объект
#define LOST_INDEX				0x00000003	//неверный тип индекса/ключа
#define NOT_ELEMENTS			0x00000004	//коллекция не содержит элементов

А код клиента на VB может использовать стандартный обработчик ошибок, например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Dim MyPhone As Telephone
    Dim MyPhonesCollection As Telephones
    
    Set MyPhone = New Telephone
    MyPhone.Number = "322-223-323"
    
    Set MyPhonesCollection = New Telephones
    
    MyPhonesCollection.Add MyPhone
    
    On Error GoTo ErrHandler
    MyPhonesCollection.Remove  777 
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbCritical, "Ошибка компонента " & Err.Number

Обратите внимание, что в обработчике ошибок VB доступны и код ошибки, который Вы собираете при помощи MAKE_HRESULT, и символьная строка описания ошибки, которую Вы задаете в качестве первого аргумента метода Error в компоненте. При этом способ обработки ошибок в VB становится стандартным

С наилучшими пожеланиями.
...
Рейтинг: 0 / 0
Проблема вызова метода COM объекта из VB
    #32546130
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Dominic
Большое спасибо за хороший совет. Согласен, что Вы посоветовали более лучший (правильный) способ обработки ошибок. Для меня есть смысл разобраться с таким методом, и в дальнейшем применять его.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблема вызова метода COM объекта из VB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]