[ kopca @ 10.03.2008. 09:11 ] @
Imam sledeci c++ evet sink za out-of-process COM server aplikaciju pisanu u c#: Code: _ATL_FUNC_INFO OnTheEventInfo = {CC_STDCALL, VT_EMPTY, 2, {VT_UNKNOWN, VT_UNKNOWN}}; class CNormalizerEventSink : public IDispEventSimpleImpl<1, CNormalizerEventSink, &DIID_IManualNormalizerEvent> { public: BEGIN_SINK_MAP(CNormalizerEventSink) SINK_ENTRY_INFO(1, DIID_IManualNormalizerEvent, 1, OnJobDone, &OnTheEventInfo) END_SINK_MAP() void __stdcall OnJobDone(IManualNormalizerPtr sender, IManualJobDoneEventArgsPtr eventArgs) { m_info = eventArgs; m_signal = true; } // Set up advisory connection... CNormalizerEventSink(IManualNormalizerPtr normalizer) :m_normalizer(NULL), m_signal(false), m_info(NULL) { m_normalizer = normalizer; m_normalizer->AddRef(); DispEventAdvise((IUnknown*)m_normalizer); } // Detatch from event source. ~CNormalizerEventSink() { m_normalizer->Release(); m_info = NULL; DispEventUnadvise((IUnknown*)m_normalizer); } public: BOOL m_signal; IManualJobDoneEventArgsPtr m_info; private: IManualNormalizerPtr m_normalizer; }; ---------------------------------------------- Ovako instanciram out-of-process COM server i event sink za njega: Code: hr = CoCreateInstance(CLSID_GmgManualNormalizer, NULL, [red]CLSCTX_LOCAL_SERVER[/red], DIID_IManualNormalizer, (void**)&normPtr); CNormalizerEventSink theSink((IManualNormalizerPtr)normPtr); --------------------------------------------- Kad pokusavam da iscitam informacije iz event sink instance: Code: BSTR outputPath = theSink.m_info->GetOutputFileName(); ovo je iz call stack-a (generisani .tli file): Code: inline _bstr_t IManualJobDoneEventArgs::GetOutputFileName ( ) { BSTR _result = 0; HRESULT _hr = get_OutputFileName(&_result); //THIS IS LINE OF CODE THAT FAILS. if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return _bstr_t(_result, false); } aplikacija puca, access violation - error reading location... Kod greske 0x0000005. Ovo moze biti od koristi: 1. Kada se COM application startuje kao in-process instanca sa CLSCTX_ALL (ne ono CLSCTX_LOCAL_SERVER), sve radi kako treba. 2. Out-of-process COM C# aplikacija koristi kao projekat referenciran assembly od kog se generise pomenuti .tli. 3. Mislim da je problem u security-ju ili marshalingu vrednosti izmedju klijentskog proxy-ja i serverskog-stub-a out-of-process COM aplikacije. Hvala unapred na pomoci, ako vam treba jos informacija, rado cu ih iskucati. |