AuoIt-Code wie VBA-Vorlage (DotNet DLL in VBA nutzen)

  • Hallo,

    ich habe nun die letzten Tage nach einem Kode gesucht, der die Funktion dieses VBA-Kodes in AutoIt nachstellt.
    Ich nutze Ihn in Excel und Access erfolgreich. Dabei muss ich bei der Erstellung nur "ComVisible(True)" eintragen
    (VB: vor dem Klassennamen wie im Link. / bei C# in der AssemblyInfo.cs ),
    und schon kann über die "Common Language Runtime Execution Engine" die NetDLL gestartet werden.
    (Kein Public Shared, Kein RegAsm, kein "Für Com Interop registrieren" oder Bearbeiten von ILs :D o.ä. wie an vielen stellen steht.)

    Ich habe schon mit diesem Kode rumgebastelt, aber irgendwie habe ich Probleme mit der Verbindung zur MsCoree.tlb,
    Das Objekt kann nicht erzeugt werden (Test auf "Ist Objekt" schlägt immer fehl).

    Auch habe ich hiermit (auch hier ein Thread) getestet ("Try 2")- geht auch nicht.

    Spoiler anzeigen
    [autoit]


    ;~ IID´s
    $IID_TYPEINFO="{00020401-0000-0000-C000-000000000046}"
    $IID_TYPELIB="{00020402-0000-0000-C000-000000000046}"

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Methods of interface ITypelib
    $tagITypeLib = "GetTypeInfoCount long();" & _
    "GetTypeInfo long(uint;ptr);" & _
    "GetTypeInfoType long(uint;ptr);" & _
    "GetTypeInfoOfGuid long(ptr;ptr);" & _
    "GetLibAttr long(ptr);" & _
    "GetTypeComp long(ptr);" & _
    "GetDocumentation long(int;ptr;ptr;ptr;ptr);" & _
    "IsName long(ptr;ulong;ptr);" & _
    "FindName long(ptr;ulong;ptr;ptr;ptr);" & _
    "ReleaseTLibAttr long(ptr);"

    [/autoit] [autoit][/autoit] [autoit]

    ;~ The file where the type library has to be analysed
    $szFile="C:\Windows\System32\UIAutomationCore.dll"
    ;~ $szFile = FileOpenDialog("Open Type Library", "", "TypeLib Files (*.tlb;*.olb;*.dll;*.ocx;*.exe)|All Files (*.*)", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $oleAutDll = DllOpen("oleaut32.dll")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Just load the typelibrary
    ;~ try 1
    $tp = DllStructCreate("ptr")
    $result=DllCall($oleAutDll, "ulong", "LoadTypeLib", "wstr", $szFile, "ptr", DllStructGetPtr($tp, 1))

    [/autoit] [autoit][/autoit] [autoit]

    ;~ try 2
    ;~ $tp = ""
    ;~ $result=DllCall($oleAutDll, "ulong", "LoadTypeLib", "wstr", $szFile, "ptr", $tp)

    [/autoit] [autoit][/autoit] [autoit]

    consolewrite("LoadTypeLib result: "& $result & " error: " & @Error & @crlf)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Try to get the object interface
    $oTypelib=objcreateinterface($tp, $IID_TYPELIB, $tagITypeLib)

    [/autoit] [autoit][/autoit] [autoit]

    if isobj($oTypelib) Then
    consolewrite("We have the typelib object")
    EndIf

    [/autoit]

    Irgendwie kann ich nicht glauben dass AutoIt den RuntimeHost der MsCoree nicht zum laufen bringen könnte um die DLL zu nutzen wie mit VBA!?
    Habe die Test-DLL angehangen und hier ist auch der Kode:

    Spoiler anzeigen


    Also nochmal zusammengefasst: ;)

    ich bin auf der Suche nach einem Ersatz für das "Verweise setzen(auf TLBs)" in VBA
    und dann eine möglichkeit diese Objekte anzusprechen, um
    (wie im Beispiel nach 7 Zeilen VBA-Kode)
    ein Objekt zu haben dass auf die .NetKlasse der DLL verweist.

    Danke für eure Hilfe.

    Rafael

    • Offizieller Beitrag

    Meines Wissens kann AutoIt nur sehr begrenzt mit Objekten arbeiten. NET-Objekte gehören nicht dazu. Somit bringt es auch nichts, diese über die ansprechbaren VBA-Objekte einzuschleusen. Der Zugriff wird nicht gelingen.
    Du kannst eigene Klassen über einen kleinen Kunstgriff erstellen und nutzen, siehe hier.
    Einschränkend muß ich darauf verweisen, dass dies zumindest bis Stable 3.3.8.1 der Fall war. Ob sich in der aktuellen Version da was getan hat, weiß ich nicht, ich nutze diese nicht.

  • Hallo BugFix,
    danke für die Antwort. Ist leider nicht das was ich hören wollte :S . Ich wollte ein registrieren der DLL vermeiden. Denn die RegAsm.exe ist laut M$ entweder beim Visual Studio oder der Windows SDK dabei. Also muss ich mir ein RegFile erstellen lassen(siehe Link) mit den Registrierungseinträgen. Dann stoße ich aber ggf. auf das Problem, dass ich diese nicht bei jedem möglichen User ausführen(lassen) kann - wenn die Rechte nicht passen.

    (...Stunden später :D ... )... Naja, habe mich zwischenzeitlich durch verschiedene Artikel bei M$ gewühlt. AutoIt wird da meinen Ansprüchen ggf. nicht gerecht (od ich habe da was nicht kapiert :?: )

    Ich schaue nochmal nach ob die RegAsm nicht in einem .Net Framework enthalten ist....dachte sie dort gesehen zu haben.

    Rafael