Problem bei Nutzung von MSXML
-
Hallo,
ich möchte aus meiner MFC-Anwendung heraus XML-Dokumente erstellen und speichern. Dazu habe ich folgenden MSDN-Beispielcode in meinen Code eingebunden:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms757870(v=vs.85).aspx
Beim erstellen kommt allerdings der Fehler:
error C3861: "IID_PPV_ARGS": Bezeichner wurde nicht gefunden.
ich habe die msxml2.h und die ObjBase.h eingebunden und die findet er beim Kompilieren ja auch. Was mich allerdings schon mal stutzig macht ist die Tatsache, dass er in der ObjBase.h nix von "IID_PPV_ARGS" stehen hat, dass müsste laut Microsoft eigentlich da drin stehen.
Weiß jemand Rat?
-
Du brauchst ein halbwegs aktuellen SDK damit es das
IID_PPV_ARGS
Makro gibt (Windows 7).Wobei das Makro nicht notwendig ist, es kapselt bloss den Cast nach
void**
, verbunden mit einem Type-Check, so dass man nicht so leicht Fehler bei der Übergabe machen kann.Die "bessere" Variante ist mMn. allerdings so:
HRESULT CreateAndInitDOM(IXMLDOMDocument **ppDoc) { void* pvDoc = 0; HRESULT hr = CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, &pvDoc); // Look ma', no cast :-) *ppDoc = static_cast<IXMLDOMDocument*>(pvDoc); // Und hier reicht ein static_cast, kein pöser reinterpret_cast nötig if (SUCCEEDED(hr)) { ...
Hat neben dem "weniger bösen" Cast auch den Vorteil die Strict-Aliasing Regel nicht zu verletzen.
-
Ah also doch ein SDK-Problem. Hatte ich schon befürchtet. Arbeite hier allerdings mit Windows XP. Aktuelle Platform SDKs finden sich aber nur für Vista oder jünger. Oder ist das egal?
-
Das sollte egal sein, so lange du
_WIN32_WINNT
entsprechend Windows XP definierst.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspxdas
// vor allen includes: #define WINVER 0x501 #define _WIN32_WINNT 0x501
müsste hinhauen
Du kannst aber auch die betroffenen Stellen einfach umschreiben. Entweder wie von mir gezeigt, oder aus dem
IID_PPV_ARGS
einfach nen Cast machen.IID_PPV_ARGS(x)
->reinterpret_cast<void**>(x)
müsste passen (nicht ausprobiert)Oder du definierst selbst eine passende Helper Funktion...
template <class T> void** COM_PPI_TO_PPV(T** ppi) { static_cast<IUnknown*>(*ppi); // just checking if the type of ppi is what we expected return reinterpret_cast<void**>(ppi); }
...und verwendest diese an Stelle von
IID_PPV_ARGS
.
-
Ah ok, das hätte bestimmt geklappt,
ich habe dann zufällig noch ein anderes Tutorial gefunden, unter diesem Link hier:
http://www.codeproject.com/Articles/43309/How-to-create-a-simple-XML-file-using-MSXML-in-CDa nutzt er bei CoCreateInstance nur ein Argument aber es funktioniert.
Was ich aber jetzt noch nicht weiß, ist:
Ich habe den Code aus dem Codeproject-Tutorial in eine eigene Klasse gepackt und führe ihn über eine Memberfunktion in der Klasse aus. So erzeuge ich eine statische XML-Datei. Ich will aber immer wieder neue Knoten und Attribute hinzufügen. Dazu müsste ich aber auf Eigenschaften von Methoden innerhalb dieser Klasse zugreifen. Aber wie komme ich da ran? (Hab noch gelegentlich Hänger bei der OOP)
-
Hi, mit der Erstellung der XML-Datei klappt es jetzt soweit aber ein Punkt ist noch buggy. Ich möchte eine Reihe von Kindknoten erstellen und als TagName den Schleifenindex eintragen. Dazu wandle ich mein Index-Int über .Format in einen CSTring um, MSXML braucht aber BSTR. Ich habe es schon mit verschiedenen Converter-Funktionen versucht, aber immer wieder ist die Variable "m_str" NULL, die Variable "m_wstr" enthält dagegen den von mir gewünschten String, was mache ich falsch?
Hier noch ein Screenshot:
http://www.bilder-upload.eu/show.php?file=095360-1344331505.jpg
-
CString::AllocSysString
Aber bite auch wiederfreigeben!
-
Hi Martin, danke für die schnelle Antwort
AllocSysString hatte ich auch schon probiert, wie man an einer der auskommentierten Codezeilen sieht. Leider ergab sich das Problem da trotzdem. Er scheint es ja korrekt in bstr zu konvertieren, aber der Wert wird intern immer als wstring(unicode) anstatt als string(ascii) gespeichert.
Ich sehe leider nicht mehr durch.
-
Ein BSTR ist ein Unicode String!
Das ist nun mal so.
-
Mh na dann werde ich meine xml-Datei wohl so nicht erstellen können
Eine Möglichkeit den Inhalt von m_wstr in m_str zu schieben besteht mit Sicherheit nicht?