SAFEARRAY * aus structur
-
Heiho,
Wir haben hier zZt ein Problem an den wir bereits meherer Stunden zu dritt grübeln.
Und zwar haben wir eine struktur die so ähnlich aufgebaut ist:
struct sStr { DateTime dt; BSTR str; int ID; };Diese struktur müssen wir in einem SAFEARRAY * bekommen, und da liegt unser Problem.
Wir haben schon einige funktionen probiert, z.B.:
CComSafeArray<sStr> arr(1); // wirft "Out of Memory"
oder auch
CComSafeArray<sStr> arr;
HRESULT res = arr.add(sstr); // sstr ist eine augefüllte struktur, HRESULT ist E_OUTOFMEMORYauch mit
Create() funktioniert es nicht.
und mit SafeArrayCreate und diverse andere haben wir keine brauchbaren Ergebnisse erhalten.
Ich vermute das wir es irgendwie mit eigen VAL (weiss grad nicht wie die heißen) erstellen müssen.Mein Kolege und ich, haben beide noch nie mit diesen SAFEARRAY gearbeitet.
Mein Chef hatte damit zwar schonmal zu tun, aber nie in verbindung mit einer struktur, er kommt auch nicht weiter.Ich hoffe ihr könnt mir helfen. Vielen Dank
Gruß
Da Evil
-
Habe den Fehler jetzt auch noch nie gehabt, aber ich denke es liegt daran, daß der Typ der Struktur ein COM-Typ sein sollte ( VT_ - Konstanten. ). In der Headerdatei atlsafe.h sind im Template CComSafeArray nur die Typen für COM definiert. ( Ich glaube das meinst du auch mit den "eigenen VAL" - Typen )

Vorschlag:
Implementiere doch ein IUnknown - Interface in deiner Struktur, dann sollte es gehen. Bei mir tut es das dann auch.
Grüße
tvdog
-
in der struktur selber kann ich nichts aendern, diese ist vorgegeben
haben es aber mitlerweile geloest:CComSafeArray<sStr> pTranslationContainer(_ArrCreator<sStr>::CreateArrayFor(sizeof(sstr))); pTranslationContainer.SetAt(0, sstr);
-
Nur rein Interessehalber ( und ganz uneigennützig
):Wie erzeugt die Methode des Templates _ArrCreator<sStr>::CreateArrayFor() ... das SAFEARRAY ? Vielleicht würde das etwas an meinem Code vereinfachen
.Danke.
Gruß
tvdog
-
Das problem ist nicht die zuweisung sondern woanders
die CComSafeArray klasse braucht eine information wie gross die struktur sein wird.
mit _ArrCreator<sStr>::CreateArrayFor(sizeof(sstr)) reserviert die CComSafeArray klasse genug speicher fuer die struktur welche man dann mit "SetAt" zuweisen kann.
spaeter wenn man den pointer zu einer SAFEARRAY braucht kann man sich diesen von der klasse holen
bla.GetSafeArrayPtr();
wie du evtl weisst ist CComSafeArray ja eine klasse welche das erstellen und verwalten eines SAFEARRAY vereinfacht/verwalted