Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Andere";
Aktuelles Archiv: 2017.07.09;
Herunterladen: [xml.tar.bz2];

Nach unten

IActiveScript in Delphi (Erstellen von Msxml2.DOMDocument in vbs = AV) Finden Sie ähnliche Zweige


Кто б сомневался ©   (2016-05-20 16:21) [0]

Es gibt ein x32-Programm, das vbs-Skripte über COM ausführen kann - d. H. IActiveScript, IActiveScriptParse und IActiveScriptSite werden verwendet (nicht mehr).

Hat sich ungefähr so ​​verhalten wie hier beschrieben:
http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/helloworld/activescript.htm
Nur ohne IActiveScriptSiteWindow.

Das heißt Nehmen Sie den Text des Skripts und werfen Sie ihn in IActiveScriptParse.ParseScriptText.

VBS-Skripte arbeiten mit einem Knall, aber es gab ein problem.

Wenn das VBS-Skript eine Zeile enthält
set xmlDoc = CreateObject ("MSXML2.DOMDocument")
oder
set xmlDoc = createobject ("Microsoft.XMLDOM")

Es ist ein Ziel xml-Dateien zu analysieren -
dann zerstört ein solches Skript in IActiveScriptParse.ParseScriptText das gesamte Programm über AV. Auch wenn die VBS-Datei nur eine Zeile enthält.
Es gibt keinen Fehlertext. Blöd bei AV.
Win XP und Win 10 sind ein und dasselbe.
Ereignisanzeige - leer.

ABER, wenn Sie dasselbe vbs-Skript unter Windows ausführen (z. B. über cmd.exe), funktioniert alles einwandfrei - keine Fehler - das Objekt wird erstellt und sendet Daten an die XML-Datei. Aus irgendeinem Grund liegt das Problem nur bei COM.

Wenn jemand IActiveScriptParse.ParseScriptText verwendet, können Sie nicht selbst überprüfen, ob vbs mit der Zeile set xmlDoc = CreateObject ("MSXML2.DOMDocument") funktioniert.

Ich habe Msxml2.DOMDocument.6.0 und Msxml2.DOMDocument.3.0 ausprobiert - das Gleiche.

Hier ist ein Beispiel eines vollständigen Skripts zum Überprüfen von vbs:

Set objDoc = CreateObject ("MSXML.DOMDocument") objDoc.Load "d: \ Test.xml" Setzen Sie objRoot = objDoc.documentElement s = "" t = "" Für jedes Kind in objRoot.childNodes s = s & child.getAttribute ("name") & "" Weiter "wScript.echo (s)" Zeigt "alpha beta gamma" an

xml:
<? xml version = "1.0"?> <root> <property name = "alpha" value = "1" /> <property name = "beta" value = "2" /> <property name = "gamma" value = "3" /> </ root>

Danke, Ches. Ich sage, ich weiß gar nicht, was ich tun soll ...



iop ©   (2016-05-20 16:36) [1]

Wenn es unter cmd nicht funktioniert,
Das Ding ist die Bissigkeit des Streifers, der Achse und der Wirkstoffe selbst

c: \ windows \ SysWOW64 \ WScript.exe your.vbs



Кто б сомневался ©   (2016-05-20 16:51) [2]

iop © (20.05.16 16: 36) [1]

Es funktioniert ... :(

Aber vbs Index, bestehend aus einer einzigen Zeile:
set xmlDoc = CreateObject ("MSXML2.DOMDocument")
oder
set xmlDoc = createobject ("Microsoft.XMLDOM")

wenn es reinsteckt
IActiveScriptParse.ParseScriptText
gibt Zugriffsverletzung.

außerdem, dass auf Win XP x64, dass auf Win 10 x64 - das gleiche.



iop ©   (2016-05-20 17:09) [3]

Aber was ist die allgemeine Notwendigkeit, VBS unter dem Wrapper und nicht durch CreateProcess auszuführen?

oder sogar tun vbs nur oder nur delphi?



Кто б сомневался ©   (2016-05-20 17:09) [4]

Im Step2-Beispiel funktioniert dieser Code.

http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/helloworld/activescript.htm

Also irgendwo habe ich mich eingestellt.

Was könnte das Problem sein, es scheint, dass noch alles erstellt wird .. und andere VBS-Code funktioniert ..



Кто б сомневался ©   (2016-05-20 17:13) [5]

Ja, noch etwas, dieser IActiveScriptParse-Code funktioniert in einer DLL, die keine Formulare verwendet. Kann dies das Problem sein?



iop ©   (2016-05-20 17:14) [6]

Set objDoc = CreateObject ("MSXML.DOMDocument")
objDoc.Load "d: \ Test.xml"


set objDoc = CreateObject ("MSXML.DOMDocument")
objDoc.async = falsch

if objDoc.Load "d: \ Test.xml" dann
....
sonst
MsgBox ( "kyky!")
end if



iop ©   (2016-05-20 17:17) [7]

Ich würde auch die Kodierung der Skriptdatei selbst überprüfen



Кто б сомневался ©   (2016-05-20 18:43) [8]

Gefunden, was war das Problem.
Bitte erklären Sie, warum dies passiert ... Ich habe nicht verstanden ..

TScriptEngine = Klasse (TInterfacedObject, IActiveScriptSite) Funktion _AddRef: Integer; stdcall; Funktion _Release: Integer; stdcall; Funktion TScriptEngine._AddRef: Integer; beginne Ergebnis: = -1; Ende; Funktion TScriptEngine._Release: Integer; beginne Ergebnis: = -1; Ende;

Beim Aufruf von fEngine.SetScriptSite (Self);
Führen Sie AddRef aus.

Beim Aufruf von ParseText wird ein anderes _AddRef ausgeführt
OnEnterScript kommt weiter vom Skript entfernt

Und dann wird sofort der TScriptEngine-Destruktor aufgerufen

Keine Freigabe kam.

Deshalb ist es verbunden, ich habe es nicht verstanden.
AddRef Addrealese wurde entfernt und es funktionierte. Der Destruktor wird nicht aufgerufen.

Außerdem funktionierte bei anderen vbs-Skripten alles mit deaktiviertem Link-Zählmechanismus (ich müsste darauf verzichten ..)



Кто б сомневался ©   (2016-05-20 19:21) [9]

Im Allgemeinen können Sie dies nicht tun. Es ist sinnvoll, von TInterfacedObject zu erben und eine eigene Funktion zu schreiben _AddRef: Integer; stdcall; Funktion _Release: Integer; stdcall;

Wenn Sie den Referenzzähler deaktivieren müssen, müssen Sie von TObject erben und dort bereits Ihre eigenen implementieren
Funktion QueryInterface (const IID: TGUID; out Obj): HResult; stdcall;
Funktion _AddRef: Integer; stdcall;
function _Release: Ganzzahl; stdcall;

Was ich jetzt tat.

Es stellt sich jedoch heraus, dass QueryInterface von TObject und dort GetInterface aufruft unter bestimmten Bedingungen Das gleiche IInterface (Obj) ._ AddRef tritt auf (in meinem Fall wird TInrefacedObject.addRef aufgerufen und nicht mein addRef). In anderen Methoden wird _Release von TinterfacedObject ebenfalls ausgeführt, und es ist bereits ein Destruktor vorhanden.

Solche Dinge ..



iop ©   (2016-05-20 19:43) [10]

warum nicht etwas?

Wenn der intfobj-Nachfolger im Stil eines regulären Objekts verwendet werden soll (mit der Absicht, es später explizit zu löschen), können Sie mit _addRef keine Angst vor dem Referenzzähler haben.
bis er stirbt



Кто б сомневался ©   (2016-05-20 23:08) [11]


> op © (20.05.16 19: 43) [10]
>
> warum ist das unmöglich?
>
> ob der intfobj-erbe den stil verwenden soll
> gewöhnliches Objekt (mit der Absicht, es später explizit zu löschen), dann
> Mit _addRef haben Sie keine Angst vor dem Referenzzähler.
> er wird nicht sterben, bis er kneift


Na dann wirst du bald die gleichen Fragen haben wie ich - zufällig bekommst du die verdammte AV.
Das habe ich mir auch gedacht und es auch im TObject-Stil verwendet - und alles hat gut funktioniert, bis dieser Fall eintrat. Ich habe jetzt keine Zeit für eine detaillierte Analyse. Die Fristen sind abgelaufen:
Wenn es von TInterfacedObject geerbt wird, wird RefCount unter bestimmten Bedingungen (ich weiß nicht, wie diese Bedingungen laut Experten aussehen werden) durch TObject - IInterface (Obj) ._ AddRef;

Funktion TObject.GetInterface (const IID: TGUID; out Obj): Boolean; var InterfaceEntry: PInterfaceEntry; beginne Zeiger (Obj): = Null; InterfaceEntry: = GetInterfaceEntry (IID); if InterfaceEntry <> nil then beginne if InterfaceEntry ^ .IOffset <> 0 then beginne Zeiger (Obj): = Zeiger (PByte (Self) + InterfaceEntry ^ .IOffset); if Zeiger (Obj) <> nil then IInterface (Obj) ._ AddRef; <<<<<<<<<< ende sonst IInterface (Obj): = InvokeImplGetter (Self, InterfaceEntry ^ .ImplGetter); end else wenn ObjCastGUID = IID dann Zeiger (Obj): = Zeiger (Selbst); Ergebnis: = Zeiger (Obj) <> nil; Ende;

Das heißt end else wenn objCastGUID = IID dann wird normalerweise ausgeführt. In einigen seltenen Fällen wird der durch den Pfeil angezeigte ausgeführt.

Dadurch wird die Methode aufgerufen TInterfacedObject.addref - erhöht den Zähler von Null auf Eins. Dann wird auf der COM-Seite Code von Drittanbietern ausgeführt, und der Debugger zeigt bereits einen Haltepunkt in _Release TInterfacedObject an. Das heißt nicht _Freigabe meine Klasse, die von TInterfacedObject erbt, nämlich TInterfacedObject.
Nun, dann wird der Destruktor von dort aufgerufen.
In anderen Fällen (in den meisten Fällen) wird der Code in meinem Addref und Release ausgeführt.



iop ©   (2016-05-20 23:27) [12]

Das habe ich auch gedacht und im TObject-Stil verwendet - und alles hat gut funktioniert

dort ist alles in ordnung mit der adresse.
Es gibt jedoch nur Merkmale der Implementierung bestimmter Klassen.

z. B. TXMLDocument.

Wenn ein lebender Benutzer an den Konstruktor übergeben wird (z. B. wird er im Designer auf das Formular zurückgesetzt), ist das Verhalten ein Objekt.

Wenn Neil als Beobachter zum Konstruktor kam, wird es ein Interface-Verhalten geben.
und hier schon den links folgen und nicht kostenlos anrufen



Seiten: 1 ganze Branche

Forum: "Andere";
Aktuelles Archiv: 2017.07.09;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.62 MB
Zeit: 0.017 c
4-1282815533
RG
2010-08-26 13:38
2017.07.09
IsWindowVisible funktioniert nicht unter Windows7


2-1445034926
shkolnik
2015-10-17 01:35
2017.07.09
Programmieraufgabe


2-1444440112
E95
2015-10-10 04:21
2017.07.09
Wie kann ich eine Funktion über EntryPoint (ordinal) exportieren?


2-1444423211
Mihapych
2015-10-09 23:40
2017.07.09
Kompilierungsfehler


15-1463750462
Wer würde zweifeln?
2016-05-20 16:21
2017.07.09
IActiveScript in Delphi (Erstellen von Msxml2.DOMDocument in vbs = AV)





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch