none
COM: FontPtr, IFontDisp* und IFont* RRS feed

  • Frage


  • ich benutze hier ein activex-control (ocx), bei dem ich eine schriftart setzen will. die entsprechende property dazu aus der idl:
    [id(31)] IFontDisp* GaugeTextFont;

    der durch #import erzeugte wrapper dazu sieht so aus:
    __declspec(property(get=GetGaugeTextFont,put=PutGaugeTextFont))
    FontPtr GaugeTextFont;
    FontPtr GetGaugeTextFont ( );
    void PutGaugeTextFont ( struct Font * _val );

    aus dem IFontDisp* im OCX wird also ein FontPtr für den Client. Soweit, so gut.

    also wie erzeuge ich aus dem client heraus nun so einen FontPtr?
    per OleCreateFontIndirect kann ich einen IFontDisp* oder einen IFont* erzeugen (je nachdem, ob ich OleCreateFontIndirect mit IID_IFontDisp IID_IFont füttere), aber beides ist eben kein FontPtr.

    nun kann ich aus beiden, zumindest technisch, per (static) cast einen FontPtr machen und den auch ans OCX reichen und es scheint dann auch mit beiden Varianten zu funktionieren. Frage also nun: wie macht man es denn _richtig_? IFontDisp* erzeugen und einfach casten? oder funktioniert das nur zufällig?

    2. Frage: Wenn der Client die Methede aufgerufen hat, kann/sollte der dann gleich danach Release auf dem Font aufrufen, oder muß der das Objekt am leben erhalten, so lange auch das Control da ist und erst ganz am Ende Release aufrufen?

    micha
    • Bearbeitet suriel6666 Freitag, 18. Oktober 2013 08:45 typo in betreff
    Freitag, 18. Oktober 2013 07:58

Antworten

  • hm... hatte eigentlich angenommen, daß schonmal jemand das problem hatte bzw. weiß, wie man einen FontPtr an ein OCX übergibt. schade, dann bleibeich wohl bis auf weiteres bei meinem cast :

    IFontDispatch ifd = GetItSomehowViaOleCreateFontIndirect();

    FontPtr fp = static_cast<FontPtr>(ifd);

    control.Font = fp;

    ifd->Release();

    Montag, 21. Oktober 2013 12:31