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 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
;~ IID´s
$IID_TYPEINFO="{00020401-0000-0000-C000-000000000046}"
$IID_TYPELIB="{00020402-0000-0000-C000-000000000046}"
;~ 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);"
;~ 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)
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))
;~ try 2
;~ $tp = ""
;~ $result=DllCall($oleAutDll, "ulong", "LoadTypeLib", "wstr", $szFile, "ptr", $tp)
consolewrite("LoadTypeLib result: "& $result & " error: " & @Error & @crlf)
[/autoit] [autoit][/autoit] [autoit];~ Try to get the object interface
$oTypelib=objcreateinterface($tp, $IID_TYPELIB, $tagITypeLib)
if isobj($oTypelib) Then
consolewrite("We have the typelib object")
EndIf
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
' 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