Срочно нужна помощь по COM
1) IDL данные импортированные из *.tlb файла:
[
uuid(9FC7F51A-8AD2-49A5-8040-21B375ABE304),
version(1.0),
helpstring("COMServer Library")
]
library COMServer
{
importlib("stdole2.tlb");
[
uuid(7F40BA29-8BD9-4851-9531-6CD4D02E2A25),
version(1.0),
helpstring("Dispatch interface for CoExternalShipment Object"),
dual,
oleautomation
]
interface ICoExternalShipment: IDispatch
{
[
id(0x00000001)
]
HRESULT _stdcall IsOrderPacked([in] BSTR _ExternalCustAccount, [in] BSTR _ExternalRequestNumber );
};
[
uuid(E4316ABB-32CB-4579-B288-F52D9A57A04A),
version(1.0),
helpstring("CoExternalShipment Object")
]
coclass CoExternalShipment
{
[default] interface ICoExternalShipment;
};
};
2) написан COMServer с использованием tlb файла
3) написан COMClient с использование tlb файла. При этом все замечательно работает т.е. из клиента вызывается удаленный меттод ISOrderPacked().
4) если же я пытаюсь создать приложение COMClient без использования еди файла а получить ссылку на интерфейс напрямую:
GUID vCoExternalShipmentGUID = Comobj::StringToGUID( "{E4316ABB-32CB-4579-B288-F52D9A57A04A}" );
_di_IUnknown vIUnknownPtr = CreateComObject( vCoExternalShipmentGUID );
void** vICoExternalShipmentPtr = NULL;
GUID vICoExternalShipmentGUID = Comobj::StringToGUID( "{7F40BA29-8BD9-4851-9531-6CD4D02E2A25}" );
HRESULT vResult = vIUnknownPtr->QueryInterface( vICoExternalShipmentGUID, vICoExternalShipmentPtr );
if ( vResult == E_INVALIDARG )
{
throw Exception( "Не правильные параметры!" );
}
else
if ( vResult == E_NOINTERFACE )
{
throw Exception( "Нет интерфейса!" );
}
Variant vICoExternalShipment = vICoExternalShipmentPtr;
vICoExternalShipment.Exec( Procedure( "IsOrderPacked" ) << "ParamValue1" << "ParamValue2" );
то срабатывает E_INVALIDARG.
При этом vIUnknownPtr инициализируется (если указать другой GUID то возникает ошибка).
А вот vICoExternalShipmentPtr так и равно NULL и возвращаемое значение HRESULT vResult = E_INVALIDARG.
Вопрос - почему?????
Как ни пытался вникнуть в COM технологию, всегда почему-то сложно, хоть и начинал с азов на ассемблере. Реально придумали хрень какую-то сложную в использовании. Самый нормальный способ - сокеты. Но это я так, извини за бессмысленное сообщение.
{7F40BA29-8BD9-4851-9531-6CD4D02E2A25}
нигде не зарегистрирован и его никто не знает.
{7F40BA29-8BD9-4851-9531-6CD4D02E2A25}
нигде не зарегистрирован и его никто не знает.[/QUOTE]
[QUOTE=TwisterNew]
3) написан COMClient с использование tlb файла. При этом все замечательно работает т.е. из клиента вызывается удаленный меттод ISOrderPacked().
[/QUOTE]
?????