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;
};
_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);
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();
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);
}
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.
kopca