c - Hvordan kan jeg få den IUnknown * -peger (hvis nogen) til noget Visual Basic 6-kontrol?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne ringe nogle C-funktioner fra et Visual Basic 6-program, som tager en IUnknown*. Forudsat at jeg ved, at en vis kontrol i min VB6-applikation er en ActiveX-kontrol, kan jeg få den underliggende IUnknown* ud af det (måske ved at caste?) for at videregive den til C-funktionen?

Bedste reference


Alle COM-grænseflader stammer fra IUnknown, du kan bare bruge IUnknown -metoderne på en hvilken som helst gyldig grænsefladepeger.


Hvis du har brug for en ekstra reference til den samme komponent, men pas på hvilken grænseflade der skal bruges QueryInterface metoden til IUknown.

Andre referencer 1


En interessant ting jeg fandt ud af i mellemtiden (bare nævner det, hvis nogen finder dette spørgsmål): for mange kontroller, jeg har testet, returnerer værdien GWL\_USERDATA returneret af GetWindowLong adressen til nogle struct, som har IUnknown pointerværdi ved forskydning 12. Så følgende kan virke for dig:


IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL\_USERDATA ) + 12);


Det ser ud til, at mange kontroller har samme struktur gemt på adressen givet af GWL\_USERDATA. Måske er det sandt for alle Visual Basic-kontroller eller så?