fehlerhaftes Verhalten von Objekten

  • Guten Abend,
    ich würde gerne mit AutoIt die Attribute und Methoden von COM Objekten auslesen.

    In Powershell funktioniert das so:

    Code
    $o = new-object -comobject "System.Object"
    $o.GetType().GetMembers() | foreach-object {write-host $_.Name}
    Code
    ToString
    Equals
    Equals
    ReferenceEquals
    GetHashCode
    GetType
    .ctor

    In AutoIt habe ich dann allerdings das Problem, dass GetMembers() kein Array mit Objekten zurückgibt:

    [autoit]

    $o = ObjCreate("System.Object")
    For $_ In $o.GetType().GetMembers()
    ConsoleWrite($_.Name & " (" & $_.MemberType & ")" & @CRLF)
    Next
    $o = 0

    [/autoit]
    Code
    "C:\AutoIt3\Scripts\test.au3" (2) : ==> Variable must be of type "Object".:
    For $_ In $o.GetType().GetMembers()
    For $_ In $o.GetType().GetMembers()^ ERROR

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (16. August 2013 um 16:32)

  • Mal so versucht?

    [autoit]


    $o = ObjCreate("System.Object")
    $oData = $o.GetType().GetMembers()
    if IsObj($oData) then
    For $_ In $oData
    ConsoleWrite($_.Name & " (" & $_.MemberType & ")" & @CRLF)
    Next
    else
    consolewrite("Kein Objekt!" & @crlf)
    endif
    $o = 0

    [/autoit]
  • Ja, natürlich hatte ich schon nach jeder Zeile Fehlerüberprüfungen eingebaut.

    In AutoIt habe ich dann allerdings das Problem, dass GetMembers() kein Array mit Objekten zurückgibt.


    Meine Frage ist eigentlich, an welcher Stelle AutoIt einen Fehler macht (durch welchen dieses Problem erschaffen wird) und wie man das beheben kann (falls möglich).

  • Aber sind das nicht alles COM Objekte (also im Prinzip alle gleich)? :huh:
    Naja gut, dann ist das mit AutoIt wohl nicht (so einfach) möglich, danke.

    Falls jemandem noch etwas einfällt, ich bin offen für gute Ideen.

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (11. August 2013 um 10:56)

  • Ich habe das Ganze gerade mal mit VBScript versucht und da geht es auch nicht. Dabei dachte ich immer, dass VBS "höherwertiger" als Powershell ist.
    Scheint, als würde BugFix Recht behalten. :S

  • Andere Situation, ähnliches Problem (das Nichtfunktionieren von AutoIt Funktionen beim Arbeiten mit Objekten):

    ObjGet sollte doch eigentlich, wenn ich den Eintrag in der Hilfe richtig verstehe, ein Objekt aus z.B. einer Dll erzeugen können, ohne das diese vorher registriert werden muss, oder? Das hat bei mir irgendwie noch nie funktioniert (= Funktion setzt @error). Ich habe es mit DLLs (ich gehe davon aus, dass ein einfaches C# Programm dafür ausreichen sollte) und mit WSC Dateien (welche funktioniert haben, wenn sie registriert und mit ObjCreate benutzt wurden) versucht.

    Verstehe ich die Funktion falsch oder tut sie nicht das, was in der Hilfe angegeben ist?

    MfG James

    • Offizieller Beitrag
    Zitat

    ObjGet sollte doch eigentlich, wenn ich den Eintrag in der Hilfe richtig verstehe, ein Objekt aus z.B. einer Dll erzeugen können


    Verstehst du falsch. Da steht doch ganz klar, dass eine Referenz erzeugt wird. Referenz bedeutet - Verweis. Somit muss das Objekt bereits existieren. Und das wiederum funktioniert, wie bereits angeführt, nicht bei allen, sondern eher einigen wenigen Objekten.

    • Offizieller Beitrag

    Das Beispiel in der Hilfe sagt für mich etwas anderes aus

    Ja, hier wurde ein Excel-Bsp. gewählt, bei diesem kannst du das auch so machen. Soweit ich weiß, geht diese Variante auch mit allen Objekten des M$-Office. Ich halte es aber für wenig hilfreich, würde selbst niemals auf eine Objektdatei derart referenzieren. Ist wie mit FileRead/Write: Der "saubere" Weg ist immer das Erstellen eines Handles. ;)

  • Das heißt, dass es beim M$-Office möglich ist, die Referenz auf ein Objekt (wie das von Excel) nur durch die Datei zu erhalten, du aber dazu rätst, ObjCreate zu nutzen und dann die Datei in dem Objekt zu öffnen, da das "sauberer" ist?

    Und, um nochmal auf deinen Beitrag von vorhin zurückzukommen: Da die Dll (bzw. das Objekt darin) nicht im System registriert ist kann ich ObjGet nicht anwenden? Wenn das stimmt habe ich es jetzt verstanden.

    • Offizieller Beitrag

    Und, um nochmal auf deinen Beitrag von vorhin zurückzukommen: Da die Dll (bzw. das Objekt darin) nicht im System registriert ist kann ich ObjGet nicht anwenden? Wenn das stimmt habe ich es jetzt verstanden.


    Wenn das System mit der Datei die Anwendung (Office od. sofern von AutoIt akzeptiert was Anderes) verknüpfen kann, ist das Erstellen des Objektes und referenzieren darauf auch möglich. Mit einer nichtregistrierten Anwendung weiss das System natürlich nichts anzufangen. Wobei mir nicht ganz klar ist, wie du das überhaupt in Zusammenhang mit einer Dll anwenden willst.

  • Wobei mir nicht ganz klar ist, wie du das überhaupt in Zusammenhang mit einer Dll anwenden willst.


    Diesen Link hatte ich ja vorher schon mal gepostet. Wenn ich dieses Beispiel kompiliere, dann erhalte ich eine DLL, welche eine Klasse enthält. Folgendes sollte also meiner Logik nach funktionieren (dachte ich zumindest zu Beginn des Threads):

    [autoit]

    $oHello = ObjGet("Hello1.dll", "Hello1") ; oder ohne den 2. Parameter
    $oHello.Main() ; sollte etwas in die Konsole ausgeben

    [/autoit]


    Das ganze macht bei einem so einfachen Beispiel natürlich wenig Sinn, verdeutlicht aber hoffentlich was ich vorhatte.

  • Das kann nicht gehen -- mit NET-Objekten kann AutoIt nichts anfangen.
    Ausnahme: Du löst es so: http://www.autoitscript.com/forum/topic/12…pt/#entry896797


    Danke, den Thread hatte ich vorhin auch schon gefunden. Da es anscheinend wirklich keine Möglichkeit gibt das ohne das Registrieren der DLL zu lösen können wir das Thema ja begraben.
    Danke, dass du dir die Zeit genommen hast mir mit meiner Unwissenheit zu helfen. :D