Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Dienst / Service und CreateOleObject('Microsoft.XMLDOM') (https://www.delphipraxis.net/81796-dienst-service-und-createoleobject-microsoft-xmldom.html)

lorrey 4. Dez 2006 09:40


Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Hallo zusammen,

ich würde gerne über einen Windows System Dienst ein XML File erstellen - leider bleibt er schon beim CreateOleObject hängen:

Delphi-Quellcode:
doc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;

Ich hatte die Tage schon mal ein ähnliches Problem (http://www.delphipraxis.net/internal...ct.php?t=97478)
Leider helfen die Lösungen von dort hier nicht weiter...

Delphi-Quellcode:
  OleInitialize(nil);
  Application.Initialize;
In einer normalen Application funzt der Code einwandfrei - was muss man für einen Dienst ergänzen damit man das OLEObject erzeugen kann?!?

Bin für jeden Tipp dankbar!!!

mkinzler 4. Dez 2006 09:57

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
-Welchen Fehler meldet er?
-Schon mit einem anderern XML-Parser versucht?

Neuromancer 4. Dez 2006 09:58

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Hallo lorrey,

Zitat:

Delphi-Quellcode:
  OleInitialize(nil);
  Application.Initialize;

Hast du es schon mal mit CoInitialize statt mit OLEInitialize probiert?

Gruß

lorrey 4. Dez 2006 10:33

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Zitat:

Zitat von Neuromancer
Hallo lorrey,

Zitat:

Delphi-Quellcode:
  OleInitialize(nil);
  Application.Initialize;

Hast du es schon mal mit CoInitialize statt mit OLEInitialize probiert?

Gruß

ja hab ich - leider ohne erfolg!
muss man vielleicht eine bestimmte reihenfolge einhalten?

Neuromancer 4. Dez 2006 10:44

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Zitat:

Zitat von lorrey
muss man vielleicht eine bestimmte reihenfolge einhalten?

Nicht dass ich wüsste. Normalerweise müsste auch der Aufruf von CoInitialize(Ex) ohne OLEInitialize reichen.

Andere Frage: Warum late binding? Hast du schon mal versucht, die Typbibliothek zu importieren und das Objekt anschließend über die ClassFactory zu erstellen?
Und eine ganz dumme Frage: Auf der Maschine, auf welcher der Parser laufen soll, sind aber schon die MS XML Core Services installiert, oder? ;-)
Noch eine Möglichkeit: Probier mal mit "msxml" statt mit "Microsoft.XMLDOM" zu erzeugen.

Mehr Ideen habe ich im moment nicht.

Gruß

generic 4. Dez 2006 10:45

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
du must das com in den workerthread initalisieren.

dienste sind threads!

lorrey 4. Dez 2006 11:32

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
hmmm

also mit es klappt mit beiden bei meine ADO DB Connection - nur beim XML net?
Delphi-Quellcode:
CoInitialize(nil);

ODER

CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
Ist doch vom Prinzip her ähnlich oder bin ich jetzt ganz verpeilt?!?

Auch der Einsatz von 'msxml' ändert leider nichts.

Ich mach die Initialisierung in der 'ServiceExecute' - wie gesagt dem ADO reicht das, ohne geht auch er nicht... nur die XML Sache will nicht...

Mache ich irgendwas Grundlegend falsch?!?

mkinzler 4. Dez 2006 11:40

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Bist du unbedingt auf diesen XML-Parser angewiesen oder tuts auch eine anderer?

lorrey 4. Dez 2006 11:50

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Das ist mir völlig egal welcher - bin auf diesen über das Tutorial hier gekommen:
http://delphi.about.com/library/bluc/text/uc050601a.htm

Der funtz auch super, nur in meinem Dienst bekomme ich ihn nicht zu laufen!
Aber das muss doch irgendwie gehen, oder?

Falls es Alternativen gibt, die in Diensten laufen - als her damit ;-)
Mein Ziel ist es eine DB Tabelle in ein XML File zu exportieren...

lorrey 4. Dez 2006 14:37

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Falls es igrendwie hilft -> die Ausgabe von
Delphi-Quellcode:
 except
   on e:Exception do
     Showmessage(e.message);
bringt mir eine Zugriffverletzung... !?!
Wo kommt die denn her?

lorrey 4. Dez 2006 15:03

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Sorry will hier echt nich rum spammen ;-)

Hab gerade noch was getestet:

Delphi-Quellcode:
    WordApp:=CreateOleObject('Word.Application');
GEHT!

Delphi-Quellcode:
 doc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;
Geht NICHT !

Igrendwo fehlen doch da die "Basics", oder?!?

Neuromancer 4. Dez 2006 15:09

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Zitat:

Zitat von lorrey
Delphi-Quellcode:
 doc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;

Probier mal folgendes:

Delphi-Quellcode:
var
  vDoc: OLEVariant;
begin
  vDoc := CreateOleObject('Microsoft.xmldom');

  if not vDoc.loadXML('<root />') then
    raise Exception.Create('war wohl nix');
end;
Geht das?

Gruß

lorrey 4. Dez 2006 15:43

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Das ist ja der Hammer - es GEHT !!!!!

Delphi-Quellcode:
    doc                : IXMLDOMDocument;
    root, child, child1 : IXMLDomElement;
    text1, text2        : IXMLDOMText;
    nlist              : IXMLDOMNodelist
damit ging es nicht!

ABER mit Coding von Neuromancer und neuer Variablen Dekleration ging es dann!

Delphi-Quellcode:
    doc,
    root, child, child1,
    text1, text2,
    nlist :  OLEVariant;
Ich versteh zwar jetzt die Welt nicht mehr - aber egal hauptsache es geht erst mal ;-)
Kann mir einer Erklären warum die anderen Typen in einer "normalen" Anwendung gehen aber in einem Dienst nicht ?!?


VIELEN DANK an ALLE für eure Hilfe!!!

Neuromancer 4. Dez 2006 15:54

Re: Dienst / Service und CreateOleObject('Microsoft.XMLDOM')
 
Zitat:

Zitat von lorrey
Kann mir einer Erklären warum die anderen Typen in einer "normalen" Anwendung gehen aber in einem Dienst nicht ?!?

Ich bin nicht der COM-Experte, deswegen kann ich nur spekulieren...

Mein Verdacht war, dass die Variable tatsächlich vom Typ IXMLDOMDocument war. Wenn du aber late Binding benutzt (d.h. wenn du nicht auf die registrierte Typbibliothek zurückgreifst), dann muss das Interface IXMLDOMDocument ein duales Interface sein. Und höchstwahrscheinlich ist es das eben nicht.
Deswegen ist es bei late binding immer geschickter, einen OLEVariant als Variable zu nehmen, weil dieser kann - soviel ich weiß - jeden beliebigen IUnknown aufnehmen.
Der Cast auf IXMLDOMDocument kann aber gewaltig in die Hose gehen, wenn eben das Interface kein duales ist.
Und bevor ich mich jetzt um Kopf und Kragen rede, höre ich besser auf....;)
Sorry, aber es ist einfach schon zu lange her, dass ich damit zu tun hatte...

Gruß

PS: Wegen dem dualen Interface schaue ich mal kurz nach...nein...IXMLDOMDocument ist ein duales Interface....*hmmmm*....naja...vielleicht kann der eine oder andere COM-Hase noch etwas dazu sagen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz