Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Для спецов вопрос по COM / 5 сообщений из 5, страница 1 из 1
13.04.2007, 17:11
    #34460104
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для спецов вопрос по COM
Есть такой IDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[
	object,
	uuid(230CB043-8F90-48C4-82A4-72ED27165217),
	dual,
	nonextensible,
	helpstring("ICoClass Interface"),
	pointer_default(unique),
	oleautomation
]
interface ICoCopyFiles : IDispatch{
	[id( 1 ), helpstring("method MyMethod")] HRESULT MyMethod([in] BSTR bStr1 [in] BSTR bStr2, [in] SHORT Index, [out,retval] LONG* Result);
};

Я патаюсь его вызвать так:
Код: 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.
if SUCCEEDED(ppv->GetIDsOfNames(IID_NULL, &bStr,  1 , GetUserDefaultLCID(), &dispid))
			{
				VARIANTARG vVar[ 3 ];
				//DISPID __dispid[1];
				//__dispid[0] = DISPID_PROPERTYPUT;

				VariantInit(&vVar[ 0 ]);
				vVar[ 0 ].vt = VT_BSTR;
				vVar[ 0 ].bstrVal = bstrPathSc;

				VariantInit(&vVar[ 1 ]);
				vVar[ 1 ].vt = VT_BSTR;
				vVar[ 1 ].bstrVal = bstrPathDs;

				VariantInit(&vVar[ 2 ]);
				vVar[ 2 ].vt = VT_I2;
				vVar[ 2 ].iVal = - 1 ;

				VariantInit(&vResult);
				DISPPARAMS dParams = {&vVar[ 0 ], NULL,  3 ,  0 };

				EXCEPINFO excepInfo;
				memset(&excepInfo,  0 , sizeof excepInfo);
				UINT nArgErr = (UINT)- 1 ;

				SetLastError( 0 );
				hr = ppv->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dParams, &vResult, &excepInfo, &nArgErr);
				DWORD Err = GetLastError();
				if FAILED(hr)
				{	char msg[ 200 ];
					sprintf(msg, "Неудачный вызов метода.\nErrorCode = %d, HRESULT = %d", Err, long(hr));
					MessageBox(GetActiveWindow(), msg, "Ошибка", MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
				}
			}

Всегда Е_OUTOFMEMORY почему ?
...
Рейтинг: 0 / 0
13.04.2007, 18:17
    #34460310
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для спецов вопрос по COM
Ошибка при выполнении
Код: plaintext
hr = ppv->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dParams, &vResult, &excepInfo, &nArgErr);
...
Рейтинг: 0 / 0
16.04.2007, 12:09
    #34463049
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для спецов вопрос по COM
Что спецов нема...?
Кстати обычным методом(через директиву #import), все работает:

Код: plaintext
1.
2.
3.
4.
#import "здесь путь" no_namespace, named_guids
... 
ppv->MyMethod(bStr1, bStr2,  0 );
...

Но клиент должен быть, через механизм позднего связывания IDispatch::Invoke()
Как быть?
...
Рейтинг: 0 / 0
16.04.2007, 14:34
    #34463625
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для спецов вопрос по COM
но ты вызвал не (str1, str2, 0), а (str1, str2, -1), нет?
...
Рейтинг: 0 / 0
16.04.2007, 16:34
    #34464035
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для спецов вопрос по COM
maXmoно ты вызвал не (str1, str2, 0), а (str1, str2, -1), нет?
спасибо, что откликнулся.
Указанный тобой парметр значения не имеет вообще..
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Для спецов вопрос по COM / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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