Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Bitte hilf mir mal beefy

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]
020
28.05.2003, 11:00 Uhr
~0xdeadbeef
Gast


Du musst dir ein Range-Objekt im Speicher vorhalten, dann ein IRange-Interface darauf anfordern, wieder über QueryInterface und dass dann in einen Variant packen. Übrigens solltest du nicht den Typ _variant_t benutzen, Dinger mit _ am Anfang sind nicht Teil des APIs. Benutz stattdessen VARIANT oder besser noch COleVariant.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
28.05.2003, 15:10 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Man sind das wieder viele Fremdwörter in einem Satz

Deine sophisticated Lösung mit dem QueryInterface habe ich leider nicht zum laufen gebracht und das jetzt halt anders gelöst. Dafür brauch ich aber diesen dummen _variant_t Datentypen. (farben im chart ändern und ähnliches klappt auch schon)

Wie halte ich mir den ein Range-Objekt im Speicher vor? Wie genau meinst du das? (Was ich will ist z.B. dem Member Values den Wert der Zellen a3:a8 zuzuweisen, wie bau ich mir ein solches Rangeobject und wie pack ich das dann in den Speicher?)

Den COleVariant werd ich mir mal genauer angucken. Mal schaun ob der mir weiterhilft
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
28.05.2003, 15:41 Uhr
~0xdeadbeef
Gast


Ein Range-Objekt musst du dir von Excel über OLE geben lassen. Wie das genau geht, da bin ich aber auch überfragt - ich übergebe bei sowas normalerweise ein Range-Objekt aus Excel an meine DLL, und das kannst du dann wahlweise in ein IDispatch oder ein IRange-Interface packen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
30.05.2003, 16:45 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi beefy,
hab das jetzt irgendwie so hinbekommen, allerdings habe ich nicht ganz verstanden wie das genau funktioniert und dass bringt mich dann zu folgender Frage.

ich habe noch tagelangen rumprobieren das problem mit dem SeriesCollection so gelöst:


C++:
MySeriesCollection mySeriesCollectionObj;
IDispatchPtr seriesCollectionDispatchPtr = pXL->ActiveChart->SeriesCollection();
seriesCollectionDispatchPtr.AddRef();
mySeriesCollectionObj.AttachDispatch(seriesCollectionDispatchPtr); //hierzu kommt die Frage


MySeriesCollection ist ein klasse die mir der Klassenassi automatisch erstellt hat. (Ich musst da nur das interface angeben und der hat mir das dann gebastelt sehr praktisch sowas)

Zugriff habe ich dann zb. so

C++:

SeriesPtr mySeriesPtr;
mySeriesPtr= mySeriesCollectionObj.Item(_variant_t((long)1));



Nun zu meiner Frage
Muss ich das nach dem Verwenden wieder "Detachen" oder ähnliches. Bleibt da noch speicher unbenutzt rumliegen oder löscht sich das alles von selbst wenn der Destruktor von dem MySeriesCollection-Object aufgerufen wird

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
30.05.2003, 22:48 Uhr
~0xdeadbeef
Gast


Jepp, du musst die Referenzen von Hand zählen. Das ist übrigens wieder was, was ziemlich nervt - wenn ich das Speicherhandling nicht API-intern machen kann, kann ich auch gleich C programmieren, aber das nur am Rande.

Was COM macht ist folgendes: Du hast ein Objekt im Speicher liegen, dass über einen CORBA-artigen Orb Interfaces verteilt, also Objekte, die einen Pointer auf das eigentliche Objekt beinhalten. Idealerweise sollte das so laufen, dass in dem Moment, in dem die letzte Referenz auf das Objekt gelöscht wirdm auch das Objekt aus dem Speicher gehauen wird. Das musst du beim MS-API von Hand machen, mit AddRef und der entsprechenden anderen Methode - DelRef oder so, das weiß ich grad nicht auswendig. Frag mich nicht, warum sie das nicht über Kon- und Destruktoren gemacht haben, wie es OO-technisch sinnvoll gewesen wäre, aber so läuft das halt.
Verdammt, jetzt könnte ich das 'Ich kotze'-Emoticon gebrauchen. Naja, vielleicht wird ja irgendwann der Shortcut, den ich vorgeschlagen habe, übernommen, also:

:O=
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
31.05.2003, 16:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi beefy,
ich glaub ich habe diesmal immerhin 80% deiner antwort verstanden

Also angenommen ich habe dies so gemacht:

C++:
MySeriesCollection mySeriesCollectionObj;
IDispatchPtr seriesCollectionDispatchPtr = pXL->ActiveChart->SeriesCollection();
seriesCollectionDispatchPtr.AddRef();
mySeriesCollectionObj.AttachDispatch(seriesCollectionDispatchPtr);



wie muss ich den speicher jetzt wieder freigeben?
So?

C++:
mySeriesCollectionObj.DetachDispatch();
seriesCollectionDispatchPtr.Release();



was ist dann der Unterschied zwischen:

C++:
mySeriesCollectionObj.DetachDispatch();
//und
mySeriesCollectionObj.ReleaseDispatch();



was ist wenn ich meinem mySeriesCollectionObj einen neuen Dipatch attache wird dann der "alte" automatisch gekillt oder muss ich den vorher detachen oder reicht das dann wenn ich nur so mache(toller deutsch)?


C++:
seriesCollectionDispatchPtr.Release();




Danke Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 31.05.2003 um 16:21 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
01.06.2003, 20:10 Uhr
~0xdeadbeef
Gast


Ich kenne diese AttachDispatch-Geschichte grad nicht, frag mal die MSDN danach. Was ich kenne, ist die AddRef/Release-Geschichte. Wenn du dir einen Pointer auf ein IDispatch merkst, musst du mir AddRef den Referenzzähler hochzählen, wenn du ihn freigibst, mit Release runterzählen. Wenn der Referenzzähler 0 erreicht, wird das Objekt aus dem Speicher geholt. Zum Beispiel:

C++:
class DispatchWrapper {
protected:
    IDispatch *cnt;

public:
    DispatchWrapper(IDispatch *dsp) : cnt(dsp) { cnt->AddRef(); }
    ~DispatchWrapper() { cnt->Release(); }
}:

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
01.06.2003, 20:11 Uhr
~0xdeadbeef
Gast


Wenn mich nicht alles täuscht, ist diese AddRef/Release-Maschinerie für alle Interfaces gleich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
01.06.2003, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ok danke beefy


Ich betrachte diesen Thread dann mal als abgeschlossen.
Hoffe das ich keine weiteren Fragen mehr zu diesem Thema habe.
Vielen Dank noch mal

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
02.06.2003, 15:20 Uhr
~ai-tee
Gast


Omg ... ich krieg echt bammel, wenn ich mir vorstelle dass ich das mal alles verstehen soll *g*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: