Autor Beitrag
error
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: So 22.02.09 19:59 
Ich möchte aus einer in Delphi geschriebenen Windows-Shell Extension (sprich DLL ohne vernünftige Debugmöglichkeiten) ein XML-Dokument laden. Dafür benutze ich die Zeile

ausblenden Delphi-Quelltext
1:
XMLDocument := TXMLDocument.Create(XMLFile);					

wobei XMLDocument ein TXMLDocument und XMLFile ein WideString mit dem Dateinamen ist. Ich habe es auch schon mit IXMLDocument und LoadXMLFile() versucht.

An dieser Stelle scheint die DLL aber auf einigen Systemen abzustürzen. Es wird aber keine Extension geraist oder sowas, sondern der Code wird einfach nicht weiter ausgeführt.

Ich bin da so langsam etwas ratlos... hat jemand von euch vielleicht eine Idee, was da schief gehen könnte? Ist die Delphi XML-Lib einfach nicht zu gebrauchen?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 23.02.09 12:41 
Zeig mal die relevanten Teile deines Quelltextes und die XML Datei.

Wichtig bei der Verwendung der XML funktionalität ist die Intialisierung der zur Verfügung stehenden Anbieter (Vendors). Das läuft eigentlich vollständig automatisch. Aber gerade dort habe ich selber immer malwieder Probleme.

Da es nur auf einigen Rechnern klemmt vermute ich aber das es entweder mit der lokalen Implementierung des MSXML zu tun hat auf die die XML Schnittstelle zugreift oder mit der Konfiguration des Rechners zusammenhängt.

Was du noch versuchen könntest, wäre einmal direkt auf die Implementierung von MSXML zuzugreifen.
Dazu brauchst du auf deinem Rechnern nur die Datei "..\WINDOWS\system32\msxml6.dll" zu suchen und als TypeLib in Delphi zu importieren.
Die resultierende Unit und die Units ActiveX und ComObj bindest du ein.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Foo;
var
  XMLDoc: IXMLDOMDocument;
  state: string;

begin
  // nötig um Com-Objekte verwenden zu können
  CoInitialize(nil);
  XMLDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;
  XMLDoc.LoadXML(aXMLString);

  // Zugriffe erfolgen wie bei der Delphi eigenen Implementierung über die Namen der Knoten.
  // nur das hier grundsätzlich die X-Path Notation verwendet wird,
  // was es erlaubt auch auf tieferliegende Knoten zuzugreifen als im Beispiel.
  state := XMLDoc.documentElement.selectSingleNode('./Ack').text;

  // eine manuelle Freigabe des XMLDoc ist nicht nötig da es sich um ein Interface handelt.

  // CoInit zurücknehmen
  CoUninitialize;
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?