DLL-Return als Objekt - wie?

  • In VB(A) geht das so:

    Mit den AutoIt-DLL-Funktionen DLLCall, DLLOpen habe ich das nicht adaptiert bekommen.
    Wie im VBA-Code zu sehen ist, wird mit dem Aufruf der IMSIGX.dll ein Objekt zurückgegeben, was wohl mit den AutoIt-DLL-Funktionen nicht geht.

    Wie könnte man das realisieren?

    Mit der AutoIt-COM-Funktionalität (GetObject usw.) kann ich erfolgreich direkt auf das Programm (exe) zugreifen, aber es ist dann recht langsam. Der Zugriff über die COM-Schnittstellen-DLL wäre als "InProg-Server" viel schneller.

    Hier noch ein paar Screenshots von der VB-IDE, wenn man im Schrittbetrieb die komplizierte Struktur des referenzierten Objekts der COM-Schnittstellen-DLL "aufblättert":

    Grüsse aus Berlin

    PSblnkd

  • Hi

    Mit ObjCreateInterface kannst du aus einem DLL-Return Pointer ein COM Object machen.

    Ist schon ein Weilchen her, aber in Direct2D und DirectSound hab ich das so verwendet damals.

    In den Include files von VB, oder auch andernen Sprachen findest du vielleicht das passende.

    Du benötigst die IIDs, die etwa folgende Struktur haben: "{00000000-0000-0000-0000-000000000000}" und die Interface Description, die etwa so aufgebaut ist, wie DLL Structs.

  • @eukalyptus

    Danke für Deinen Hinweis.
    Diese Funktion von AutoIt kenne ich noch nicht - vielleicht, weil ich nicht die neueste Version benutze.
    Leider kann ich mir Deine UDFs nicht anschauen - die Links sind nicht mehr aktuell.
    In der AutoIt-OnlineHilfe -> https://autoit.de/onlinehilfe/on…teInterface.htm wird ObjCreateInterface als "experimentell" angegeben und ist nach kurzem Drüberschauen mindestens genauso kompliziert wie DllCall -> https://autoit.de/onlinehilfe/on…ons/DllCall.htm. Da muß man eine Menge Verständnis mitbringen, Geduld und eigene Erfahrungen ...

    Mit ObjCreateInterface werde ich mich aber noch eingehender beschäftigen. Momentan muß es eben mit ObjCreate und ObjGet gehen. Leider funktioniert eine Referenzierung der COM-Dll mit ObjGet nicht, sondern nur mit dem exe-Hauptprogramm ...

    Grüsse aus Berlin

    PSblnkd

  • Wie versprochen habe ich mich, oder besser gesagt, wollte ich mich eingehender mit der Funktion ObjCreateInterface beschäftigen.

    Entsprechend der Hilfe-Ergänzung hat die Funktion 2 wesentliche Parameter: CLSID, IID und 2 optionale. Im Beispiel werden für die Parameter kryptische Werte verwendet, deren Herkunft nicht erklärt wird. Die Suchfunktion im deutschen Forum funktioniert bei mir leider nicht, aber im englischen ...
    Dort fand ich einen Hinweis auf das Tool "TLB-Viewer" - und tatsächlich, wenn man die betreffende COM-Schnittstellen-DLL läd, wird u.a. auch die dazu gehörenden CLSID und IID angezeigt.

    So weit so gut - nun wollte ich einen praktischen Versuch machen, aber meine derzeitige AutoIt-Version "versteht" diese Funktion noch nicht. Das wiederum nahm ich nun zum Anlaß mal die neueste Version 3.3.16 zu installieren. Nach der leider nur in Englich vorhandenen Hilfe sollte diese unter Win-XP bis Win10 lauffähig sein. Die Installation verlief auch ohne Probleme. Leider ließ sich SciTE nicht starten, d.h. sprang kurz an, um dann in's Nirwana zu verschwinden ...

    Woran kann das liegen, bzw. was kann ich tun?

    Einen weiteren Hinweis habe ich im Quellcode des TLB-Viewers gefunden. Dort ist es auch möglich ohne ObjCreateInterface auf die Funktionalität einer COM-Schnittstellen-DLL zuzugreifen. Wie das funktionieren soll, muß ich erst noch versuchen aus dem komplizierten Quellcode vom TLB-Viewer herauszubekommen ...

    Grüsse aus Berlin

    PSblnkd

  • Leider hat sich ja niemand bemüssigt gefühlt sich ebenfalls zu diesem Problem zu äußern.

    Wie versprochen, habe ich weitere Untersuchungen angestellt.
    Zunächst habe ich mir eine nicht ganz so aktuelle AutoIt-Version, die 3.3.10 versuchsweise installiert. Kurioserweise wurde dabei ohne zu fragen die modernste 3.3.16 einfach überschrieben.

    In der 3.3.10 wird die ObjCreateInterface-Funktion auch nicht mehr als "unbekannt" bemeckert und das dort integrierte SciTE läuft bei mir auch noch. Das ist jetzt zwar sehr erfreulich, aber eben nur in englisch ...
    Nun habe ich den Versuch wie oben beschrieben mit den Werten aus dem TLB-Viewer und o.g. Funktion wiederholt, aber leider wird kein Objekt erzeugt, wie dann mit nachfolgender Abfrage ausgewiesen wird.

    Code
    $CLSID = {6A481000-E531-11CF-A115-00A024158DAF}
    $IID = {6A481100-E531-11CF-A115-00A024158DAF}
    $TCapp = ObjCreateInterface($CLSID, $IID)
    ;
    If IsObj($TCapp) Then
    	MsgBox(0, "Variablen-Abfrage", "Die Variable ist ein Objekt.")
    Else
    	MsgBox(0, "Variablen-Abfrage", "Die Variable ist kein Objekt.")
    EndIf

    Beim Versuch der weiteren Verwendung der "Objektvariablen" $TCapp wird auch sofort wieder der Fehler ausgewiesen, daß das keine Objektvariable ist.

    Zur Untersuchung des Quellcodes vom TLB-Viewer bin ich noch nicht gekommen ... ist für mich sehr kompliziert das zu verstehen ...

    Grüsse aus Berlin

    PSblnkd

  • Leider kann ich mir Deine UDFs nicht anschauen - die Links sind nicht mehr aktuell.

    Da hilft Dir vielleicht dieser Link ins engl. Forum.

  • Leider hat sich ja niemand bemüssigt gefühlt sich ebenfalls zu diesem Problem zu äußern.

    Bringt ja nix sich dazu zu äußern wenn man davon keine Ahnung hat... Solche Anmerkungen empfinde ich immer als sehr schwierig, denn das fördert auch nicht gerade DAS jemand hilft.

  • water
    Die Links im engl. Forum gehen auch auf die ungültigen im deutschen Forum zurück.

    Moombas
    Mir liegt es fern irgend jemanden zu verärgern - hatte halt gehofft, daß "Wissende" wie z.B. eukalyptus die in seinem Beitrag vom 16.08.2024 geposteten Hinweise noch näher erläutern.

    Zwischenzeitlich ist mir der Download von Direct2D-UDF und DirectSound-UDF gelungen, da aber die Quellcodes unkommentiert sind, ist ein Verständnis für die Funktionalität nur sehr schwer zu erreichen.
    Nach dem bisherigen Erkenntnisstand sind zur Verwendung der ObjCreateInterface-Funktion folgende Verfahrensschritte notwendig (adaptiert aus der UDF DirectSound-UDF:(

    1) Referenzierung der DLL mit $DLL-Ref = DLLOpen ("Imsigx10.dll")

    2) Pointer zur DLL mit $dllPointer = DLLCall ( $DLL-Ref, - diverse weitere Parameter - )

    3) Objektbildung mit $TCapp = ObjCreateInterface ($dllPointer, - 2 weitere Parameter - )

    Warum die Referenzierung mit den Parametern $CLSID und $IID - wie im Funktions-Beispiel angegeben - nicht funktioniert, ist damit noch nicht erklärt.

    Es wäre sehr hilfreich, wenn jemand wie z.B. eukalyptus noch tiefgreifendere Erklärungen parat hat ...

    Grüsse aus Berlin

    PSblnkd

  • Hi,

    also erstmal Respekt, du hast wirklich sehr viel selber erarbeitet und gelernt!

    Leider besitze ich kein TurboCAD (bzw. diese DLL), somit ist die Fehlersuche etwas schwierig.

    Du hast nach deinem 2 Schritt (DllCall) tatsächlich einen Pointer?

    Danach kommt dann ObjCreateInterface:

    Der erste Parameter ist der Pointer aus Schritt 2.

    Der zweite Parameter ist die IID. (überprüfe, ob du {6A481100-E531-11CF-A115-00A024158DAF} auch irgendwo in VBA oder sonstigen Includefiles findest, dann hast du Gewissheit, dass er das stimmt)

    Der dritte Parameter ist nun das Interface - lass das vorerst mal weg und schau, ob ein Obj erstellt wird.


    Wenn das dann mal soweit funktioniert, dann kümmern wir uns um das Interface.

    lgE

  • @eukalyptus

    Danke für die Blumen - wie ich zu AutoIt gekommen bin, kannst du hier -> http://www.ps-blnkd.de/AutoIt.htm nachlesen ...
    Hier im AutoIt-Forum gibt's u.a. eine langen Thread "Wir bauen uns ein CAD" (der Link auf meiner HP ist leider nicht mehr richtig - muß ich mal korrigieren) ...

    Es erfreut mich außerordenlich einen Spezialisten für mein Problem zu interessieren.
    Wenn Du mich via eMail (-> Impressum meiner HP) kontaktierst, dann kann ich Dir auch die DLL schicken.

    Leider bin ich noch nicht dazu gekommen, die weiteren Schritte auch praktisch zu erproben ... aber es wird schon werden.
    Wenn es Neuigkeiten gibt, stehe ich hier wieder auf der Matte ...


    Grüsse aus Berlin

    PSblnkd
    Homepage von PS

  • Haha, ein Spezialist bin ich wohl eher nicht!

    Ich hab mir das aus verschiedenen Sourcecodes zusammengesucht.

    Das wirst do auch machen müssen. Einen funktionstüchtigen Code einer anderen Sprache durchgehen und versuchen das nachzubasteln.


    Hier mal eine kleine Starthilfe:

    lgE

  • eukalyptus

    Da bist Du mir zuvor gekommen ... ich wollte auch gerade heute von meinen Versuchen berichten.

    Vielen Dank für das Skript! - Das werde ich versuchen, wobei es schon jetzt auf den ersten Blick Unklarheiten gibt:

    Zeile 5: Der DLL-Name ist korrekt "Imsigx10.dll", die "Imsigx.dll" gibt's zwar auch, ist aber eine sehr alte Version ...

    Zeile 10/11: Die Umwandlung der String-Werte mit der WinAPI-Funktion muß ich mal testen - ebenso den Rest ...


    Meine Versuche zur Referenzierung der DLL mit

    $DLL_Ref = DLLOpen("Imsigx10.dll")

    und nachfolgendem Abfrage-Komplex

    ergaben kein Objekt, kein Array, sondern den numerischer Wert: 0 - entgegen der Angaben in der Hilfe, wo -1 bei Fehler angegeben ist.

    Im Quellcode vom TLB-Viewer wird die DLLOpen-Funktion nur bei Windows-eigenen DLLs benutzt, ansonsten auch so wie Du die DLLCall-Funktion. Diese ist aber in ihrer Handhabung extrem kompliziert!
    Mir liegt jetzt die "DLL_HowTo.au3" vor, wo ggf. "schlaue Antworten" zu finden sind ...

    Wir werden sehen ...

    Wolltest Du mich nicht mal anmailen, wegen der Imsigx10.dll?


    Grüsse aus Berlin

    PSblnkd

  • Heute nun weiter ...

    eukalyptus

    Ich habe Dein Skript - zunächst die Variante (1), etwas angepasst - getestet.
    Die Consolen-Ausgaben sind für mich ungewöhnlich, aber hier:

    nach DLLOpen

    ! 0 0

    nach DLLCall

    > DLL: -1
    ! 1 0
    $aResult = 0

    d.h. es wird kein Array o.ä. erzeugt und die nachfolgende Anweisung ist demzufolge fehlerhaft:

    ConsoleWrite("! Error: " & $aResult[0] & @CRLF)
    ConsoleWrite("! Error: " & $aResult^ ERROR

    Die #include <WinAPIConv.au3> mußte ich deaktivieren, weil nicht vorhanden ...

    Von BugFix liegt mir nun auch das "DLL-Tutorial für AutoIt" vor ... mal sehen, ob es damit zu neuen Erkenntnissen kommt.

    Wenn ich die UDF DirectSound teste, kommen keine Fehlermeldungen, obwohl bei Abfragung, wie o.g. nach DLLOpen auch nur der numerische Wert 1 erzeugt wird.
    Man könnte nun vermuten, daß die DLL-Funktionen in AutoIt nur mit Windows-DLLs funktionieren, oder?

    Grüsse aus Berlin

    PSblnkd

  • OK

    Schritt 1: DllOpen:

    Erste Ausgabe sollte sein: "! 0 0" <- d.h. kein Error (sowohl normal Error, als auch Extended Error) ((Diese Ausgabe kannst du in diesem Fall ignoerieren, weil @error und @extended anscheinden hier nicht verwendet werden..., aber zur Fehlersuche solltest du dir diese 2 Variablen immer ausgeben lassen))

    Zweitew Ausgabe sollte sein: "> DLL: 1" <- Der Wert der geladenen DLL; Alles größer als 0 ist super. "-1" bedeutet, dass die DLL nicht geladen wurde.

    In deinem Fall: "> DLL: -1" wurde die DLL nicht geladen! evtl falscher Pfad. Kopier dein Test.au3 Script mal direkt in das Verzeichnis, wo die DLL liegt und probiere es von dort aus...

    lgE


    ps.: ich benutze AutoIt Version 3.3.16.1

  • eukalyptus #15

    Danke für Deine Hinweise.

    Daran habe ich auch schon gedacht, daß die DLL möglicherweise nicht gefunden wird - wie auch, macht das AutoIt oder Windows?
    Müßte das nicht irgendwie angezeigt werden?
    Deshalb habe ich nochmal die Variante mit der ObjCreateInterface-Funktion versucht, aber mit Deinen Definitionen zu $CLSID / $IID.

    Dann ergibt sich in meiner MsgBox: @error = 3, Return = 1.
    Auch diesmal ist es wieder kein Objekt!
    Die endgültige Bestätigung durch Funktionsaufrufe der DLL stehen noch aus ...

    Deinen Vorschlag die Test.au3 in den Ordner zu kopieren, wo die DLL liegt und von dort zu starten, muß ich noch testen.
    Das "DLL-Tutorial für AutoIt" von BugFix habe ich mir zwischenzeitlich auch angeschaut, aber so richtig neue Erkenntnisse dort auch nicht gefunden.

    Ich werde wieder berichten ...

    Bei mir läuft AutoIt 3.3.10 mit SciTE 3.3.6


    Grüsse aus Berlin

    PSblnkd

  • Evtl. habe ich viel zu kompliziert gedacht!


    Probier mal folgendes:


    Edit, das hier:

  • @eukalyptus #17

    Vielen Dank für Deine Bemühungen. Endlich komme ich dazu weiter an diesem Thema zu arbeiten.

    Deine letzten Skript-Beispiele verwenden die ObjCreate-Funktion - damit geht es natürlich, hatte ich doch im TO-Text geschrieben. Dieses Verfahren hat aber den Nachteil, daß der Start des AutoIt-Skripts durch das Laden des gesamten TC-Programms recht lange dauert. Mit dem Zugang über die COM-Schnittstelle als "InProgServer" soll dieser Vorgang wesentlich schneller erfolgen.

    In umfangreichen Untersuchungen habe ich versucht mit den AutoIt-Mitteln die DLL der COM-Schnittstelle Imsigx10.dll zu referenzieren - so, wie es unter VB(A) sehr einfach geht, aber leider bisher erfolglos. Wie in der PDF anbei (Auszug aus der Entwicklungsbeschreibung) nachgelesen werden kann, sind zwar viele neue Erkenntnisse gewonnen worden, aber letztendlich blieb der Erfolg dann doch aus - leider!

    Die Weiterführung des eigentlichen Themas - ein Daten-Konverter für TC - wird nun doch auf der Basis "ObjCreate" erfolgen müssen ...

    Grüsse aus Berlin

    PSblnkd