[MSVC] Probleem met ActiveX Event

Pagina: 1
Acties:

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb in C++Builder een ActiveX component geschreven met een eigen geschreven event. Als ik mijn ActiveX component in een nieuw project importeer en zodra ik bijvoorbeeld een messagebox achter het event knoop, wordt deze keurig geshowed zodra ik het event afvuur.

Nu heb ik het component ook in Microsoft Visual C++ 6.0 geimporteerd en hier ook een messagebox achter het event geknoopt. Zodra ik nu het event afvuur, gebeurd er helemaal niets. Als ik een ander event pak, bijvoorbeeld OnClick, dan werkt deze wel (de rest van het ActiveX component werkt ook prima). Waarom werkt mijn event in MSVC niet goed?

Als ik het component in de ActiveX Control Test Container draai, dan zie je dat het event wel wordt uitgevoerd:
ActiveWebServer Control: OnPaint
ActiveWebServer Control: FileAndParamsEvent {FilenameOut=-1}{ParamsOut=-1}{FilenameIn=}{ParamsIn=}
En als ik met de OLE/COM ITypelib vieuwer kijk naar mijn geregistreerde componenten ziet alles er ook correct uit, namelijk:
[id(0x0000000a)]
void FileAndParamsEvent(
[out] VARIANT* FilenameOut,
[out] VARIANT* ParamsOut,
[in] VARIANT FilenameIn,
[in] VARIANT ParamsIn);
Want in C++Builder is de volgende IDL gegenereerd voor mij gegenereert:
[
id(0x0000000A)
]
void FileAndParamsEvent([out] VARIANT * FilenameOut, [out] VARIANT * ParamsOut, [in] VARIANT FilenameIn, [in] VARIANT ParamsIn );
De code van MSVC is de volgende:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
    // Generated message map functions
    //{{AFX_MSG(CV2Dlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnOnClickActivewebserver1();
    afx_msg void OnFileAndParamsEventActivewebserver1(VARIANT FAR* FilenameOut,
VARIANT FAR* ParamsOut, const VARIANT FAR& FilenameIn, const VARIANT FAR& ParamsIn);
    DECLARE_EVENTSINK_MAP()
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BEGIN_EVENTSINK_MAP(CV2Dlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CV2Dlg)
    ON_EVENT(CV2Dlg, IDC_ACTIVEWEBSERVER1, 2 /* OnClick */,
     OnOnClickActivewebserver1, VTS_NONE)
    ON_EVENT(CV2Dlg, IDC_ACTIVEWEBSERVER1, 10 /* FileAndParamsEvent */,
     OnFileAndParamsEventActivewebserver1, VTS_PVARIANT VTS_PVARIANT VTS_VARIANT VTS_VARIANT)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CV2Dlg::OnOnClickActivewebserver1() 
{   MessageBox("BLA","Bla",MB_OK);  
}
void CV2Dlg::OnFileAndParamsEventActivewebserver1(VARIANT FAR* FilenameOut,
   VARIANT FAR* ParamsOut, const VARIANT FAR& FilenameIn, const VARIANT FAR& ParamsIn) 
{   MessageBox("BLA","Bla",MB_OK);  
}



Heeft iemand enig idee waarom het ene event en de rest van het component prima werkt, terwijl de andere event het niet doet? En daarnaast, waarom hij het wel in de testcontainer en in op C++Builder from ook?

Alvast bedankt!!!

[edit: layout aangepast]

[ Voor 5% gewijzigd door PKP B-Man op 06-06-2003 14:24 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Kun je even je layout aanpassen en een paar enters plaatsen zodat mensen met 1024x768 browsers het ook kunnen lezen?

Professionele website nodig?


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Hoe kan het dat zodra ik een VARIANT meegeef als als input, deze een waarde meegeef, en vervolgens dit probeer in MSVC het WEL lukt. En zodra ik er ook een output parameter aan toe voeg, VARIANT *, het ineens niet meer lukt?

Het lijkt dus dat het door de output parameter fout gaat :?

Verwijderd

Initaliseer je je parameters wel voor je ze meegeeft?

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb een manier gevonden om het event toch weer te laten uitvoeren.
De VTS_PVARIANT was gedefineerd als
C++:
1
#define VTS_PVARIANT        "\x4C"      // a 'VARIANT*'

wat me in orde leek, echter is de VTS_VARIANT gedefineerd als
C++:
1
#define VTS_VARIANT         "\x0C"      // a 'const VARIANT&' or 'VARIANT*'

Dus deze kan ook van het type pointer zijn... Hierom heb ik VTS_PVARIANT veranderd in VTS_VARIANT. Nu voert hij de code wel uit, en de eerste paramter werkt perfect.

Bij de tweede parameter heb ik nu het probleem dat deze niet meer terug te krijgen is in BCB :'( . Ik weet niet of dat komt doordat ik de variabele op de verkeerde manier meegeef naar MSVC, of dat het komt doordat ik de variabele heb veranderd in VTS_VARIANT, en dat hij daarom niet "gelijk" is. :?

De BCB code:
C++:
1
2
3
4
5
Variant test, test2;
test="Hallo";
ActiveWebServerImpl->Fire_FileAndParamsEvent((VARIANT)test, (VARIANT*)&test2);
AnsiString result = test2;
MessageBox(NULL,result.c_str(),"C++Builder",MB_OK);

en de MSVC code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CV2Dlg::OnFileAndParamsEventActivewebserver1
        (const VARIANT FAR& VariantTest, VARIANT FAR* VariantTest2) 
{   // Handling different types is easy if we use variant_t.
    variant_t vtData = VariantTest;
    bstr_t btData = vtData;
    char * pszData = btData;
    ::MessageBox(NULL, pszData, "Data passed:", MB_OK | MB_ICONINFORMATION);
    // ^^^ Hier wordt correct Hallo weergegeven ^^^

    // Pass something back.
    ::VariantClear(VariantTest2);
    bstr_t bstrData = "This string was generated in VC++";
    VariantTest2->vt = VT_BSTR;
    VariantTest2->bstrVal = bstrData.copy();
    // ^^^ Deze string komt NIET terug ^^^
}


Hoe krijg ik nu de bovenstaande string wel terug? 8)7

Elke tip is welkom!! _/-\o_

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Heeft niemand een tip die me helpen kan? Ik ben inmiddels al 10 dagen aan het prutsen om de juiste data van C++Builder naar MSVC en vooral weer terug te krijgen, maar dat wil niet echt lukken. Een schop in de juiste richting zal me ook zeer helpen denk ik. So come on and kick me! ;)

Het is toch wel mogelijk om via C++Builder een geheugen adres door te geven aan MSVC, en vervolgens deze te bewerken met MSVC? Ik zelf blijf van mening dat het toch mogelijk moet zijn om net als in een 'normale' functie in je programma je gewoon een geheugen adres kunt doorgeven? Zodra ik dezelde methode namelijk intern gebruik werkt het prima...

Ik geef het geheugenadres toch correct door in het bovenstaande programma? En ik bewerk deze toch ook juist in MSVC?

Alvast bedankt voor jullie hulp!

P.S. Of misschien is er een andere betere methode?
Pagina: 1