Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++ event sink za out-of-process COM server

[es] :: C/C++ programiranje :: C++ event sink za out-of-process COM server

[ Pregleda: 1361 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kopca

Član broj: 14307
Poruke: 118
...vl-edge-dnevnik.neobee.net.



Profil

icon C++ event sink za out-of-process COM server10.03.2008. u 09:11 - pre 196 meseci
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.
kopca
 
Odgovor na temu

[es] :: C/C++ programiranje :: C++ event sink za out-of-process COM server

[ Pregleda: 1361 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.