1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. SallY72

Beiträge von SallY72

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

    • SallY72
    • 13. April 2014 um 00:49

    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

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

    • SallY72
    • 12. April 2014 um 00:28

    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
    Code
    ' für eine schärfere Prüfung
    Option Explicit On
    Option Strict On
    
    
    'VB.Net: damit die COM-DLL in VBA benutz werden kann
    'in C# reicht/geht das nicht, es muss in der AssemblyInfo.cs umgestellt werden!
    <System.Runtime.InteropServices.ComVisible(True)> _
    Public Class Test
    
    
    	''' <summary>
    	''' DLL-Vorlage für Tests in VBA
    	''' </summary>
    
    	#Region "Public Sub New()"
    	''' <summary>
    	''' Standard Sub für die Erzeugung dieser Klasse
    	''' </summary>
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>clsInfo</returns>
    
    	Public Sub New()
    		MyBase.New		
    		MsgBox( "Klasse ON",,"COMTestOhneReg01")
    	End Sub
    
        #end region
    
    	#Region "Public Property clsInfo()"
    	''' <summary>
    	''' diese Property in VBA mit "Debug.Print objTest.clsInfo" abholen
    	''' clsInfo soll die DLL beschreiben, alle Propertys, Methoden usw. aufzeigen
    	''' </summary>4EA43AC8-3359-4E59-A302-E428E6644309
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>clsInfo</returns>
    
        Public Shared ReadOnly Property clsInfo() As String
            Get
            	Dim vInfo As String
    			vInfo = "Rafael, 20140410" & VbCrLf & _
    					"DateiName: COMTestOhneReg01" & VbCrLf & _
    					"KlassenName: Test" & VbCrLf & _
    					"" & VbCrLf & _
    					"Propertys:" & VbCrLf & _
    					" clsInfo: Info über diese DLL (string)" & VbCrLf & _
    					" Merker1: freier Speicher (string)" & VbCrLf & _
    					"" & VbCrLf & _
    					"Function:" & VbCrLf & _
    					" SetMyProperty/GetMyProperty (string)" & VbCrLf & _
    					" MB2(str) = str: MsgboxTest: " & VbCrLf & _
    					"" & VbCrLf & _
    					"Sub:" & VbCrLf & _
    					" Add: addiert 2 Zahlen (integer), MessageBox " & VbCrLf & _
    					" MB(str): MsgboxTest: " & VbCrLf & _
    					"" & VbCrLf & _
    					"|"    	
                Return vInfo
            End Get
        End Property
    
        #end region
    
    	#Region "Public Function Set/GetMyProperty()"
    	''' <summary>
    	''' Einfacher Aufruf von Funktionen geht von VBA aus
    	''' Call MsgBox(objTest.SetMyProperty("hhhh"), , "Test Set")
    	''' Call MsgBox(objTest.GetMyProperty, , "Test Get")
    	''' </summary>
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>k.a.</returns>
    
    
    	Dim MyProperty As String
    
    	Public Function SetMyProperty(x As String) As String
    		MyProperty = x
    		SetMyProperty = "ok" ' einfache Statusmeldung dass gearbeitet wurde
    	End Function
    
    	Public Function GetMyProperty() As String
    		GetMyProperty = MyProperty
    	End Function
    
    	#End Region
    
    
    	#Region "Public Sub Add()"
    	''' <summary>
    	''' einfacher Aufruf einer SUB aus VBA geht 
    	''' Call objTest.Add(14, 6) ''' objTest = Klasse 
    	''' </summary>
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>k.a.</returns>
    
    	Public Sub Add(ByVal a As Integer, ByVal b As Integer)
    		MsgBox(a + b)
    	End Sub
    
    	#End Region
    
    	#Region "Public Property Merker1()"
    	''' <summary>
    	''' in VBA einfach direkt zuweisen oder abfregen:
    	''' objTest.Marke = vDummy2
    	''' vAusgabe2 = objTest.Marke 
    	''' </summary>
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>k.a.</returns>
    
    	Private _Merker1 As String
    
        Public Property Merker1() As String
            Get
                Return _Merker1
            End Get
            Set(ByVal value As String)
                _Merker1 = value
            End Set
        End Property
    
    
        #end region
    
    
    ' 2 Tests für AutoIt
    
    
    	#Region "Public Sub MB()"
    	''' <summary>
    	''' einfacher Aufruf einer SUB aus VBA geht 
    	''' Call objTest.Add(14, 6) ''' objTest = Klasse 
    	''' </summary>
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>k.a.</returns>
    
    	Public Shared Sub MB(ByVal value As String)
    		MsgBox(value)
    	End Sub
    
    	#End Region
    
    		#Region "Public Sub MB()"
    	''' <summary>
    	''' einfacher Aufruf einer SUB aus VBA geht 
    	''' Call objTest.Add(14, 6) ''' objTest = Klasse 
    	''' </summary>
    	''' <param name="Text">Angezeigter Text</param>
        ''' <remarks></remarks>
    	''' <returns>k.a.</returns>
    
    	Public Shared Function MB2(ByVal value As String) As String
    		MsgBox(value)
    		Return "OK" 
    	End Function
    
    	#End Region
    
    End Class
    
    
    '	#Region "Public Function Addiere()"
    '	''' <summary>
    '	''' Beschreibung
    '	''' </summary>
    '	''' <param name="Text">Angezeigter Text</param>
    '    ''' <remarks></remarks>
    '	''' <returns>k.a.</returns>
    '	
    '	#end region
    Alles 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

    Dateien

    COMTestOhneReg01.zip 3,63 kB – 162 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™