Fragensteller
DLL-Funktion aufrufen funktioniert nicht ...

Frage
-
Ich versuche in Access Funktionen einer selbsgeschriebenen DLL aufzurufen.
Die DLL ist unter VS2012 in VB.net entstanden und funktioniert als solche. Ich kann von einem Testprogramm aus den Code aufrufen.
MÖglicherweise ist irgendwas mit der Konfiguration faul.
1. Beim Kompilieren wird NUR "AnyCPU" angeboten, nicht aber 32 oder 64Bit
2. Ich habe das Häkchen bei "für COM-Interop registrieren" gesetzt, daraufhin wird zusätzlich eine .tlb-Datei erstellt.
3. Nur mit dieser .tlb liess sich der Verweis in VBA hinzufügen, .dll wurde icht akzeptiert.
4. regsvr32 bringt mir die Meldung das der DLLregisterserver-Eingangspunkt nicht gefunden wurde
Der Aufruf der DLL-Funktion in VBA führt zu einem Laufzeitfehler 453 "DLL-Einsprungspunkt <funktion> in <dll> nicht gefunden
Kleines Update:
Mit DependyWalker habe ich mal die eigene DLL aufgemacht.
Zuoberst im Baum steht meine DLL. wenn ich da drauf klicke finde ich rechst keinerlei EInträge - ich hätte meine Funktionen erwartet.
Dann kommen noch unzählige andere DLLs - dort findet man sehr wohl Funktionen aufgelistet.
Alle Antworten
-
Kleiner Fortschritt:
Nach dem Regasm kann ich problemlos durch Ankreuzen einen verweis auf die DLL setzen.
Leider bleibt es dabei: Laufzeitfehler 453 Einsprungspunkt nicht gefunden.
Die Meldung bleibt übrigens die gleiche, auch wenn ich bewusst den Namen der Funktion falsch schreibe.
ich schätze, ich maches was falsch bei der Kompilierung der DLL, dort sind anscheinend nicht die Namen der Funktionen drin. Kann das ein ?- Bearbeitet NicoNi Montag, 26. Januar 2015 13:07
-
Die Funktionen sind definitiv public
Diese Attribut-geschichte höre ich das erste mal. Wie geht das ?
Bei meiner Klasse sind auf jeden Fall die Häkchen "Assembly COM-sichtbar machen" und "für COM-Interop registrieren"
Ich habe bisher die Geschichte mit Declare Function Lib gemacht.
Mit " Dim xx as new <NameDLL>.<Classname> kann ich zwar die Variable belegen. Dll und Klasse werden mir auch angeboten wie aus der Verweisliste.
Wenn ich dann aber xx. eingebe sollte doch meine Funktion angeboten werden , oder ? Es wird aber gar nix gelistet.
Für mich ein weiteres Indiz, daß die DLL schlicht falsch erstellt wurde
-
Diese Attribut-geschichte höre ich das erste mal. Wie geht das ?
Siehe in Deinem anderen Post https://social.msdn.microsoft.com/Forums/de-DE/7efb4c70-e68d-4976-b877-bb7ba86b2a5b/dll-aus-vbnet-enthlt-anscheinend-keine-funktionsnameeinsprungpunkte?forum=visual_studiodeOlaf Helper
[ Blog] [ Xing] [ MVP] -
Am 25.01.2015 schrieb NicoNi:
Ich versuche in Access Funktionen einer selbsgeschriebenen DLL aufzurufen.
Ich hatte das auch schon gemacht. Schau dir doch diesen Thread an,
evtl. hilft es dir weiter:
https://social.msdn.microsoft.com/Forums/de-DE/2bca8a20-d551-45fb-925e-f7bacb356f7b/mail-ber-smtp-server-verschicken?forum=accessde
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren -
Da sieht kompliziert aus. Aber ich werde es umsetzen.
Meine DLL hat ähnliches im Sinn: Es geht darum, Termine in einen öffentlichen Kalender einzutragen, zu löschen oder zu verschieben.
Ich benutze dazu EWS, was meines Wissens nicht direkt über VBA geht. Momentan wird ein Kommandozeilentool aufgerufen.
-
Am 26.01.2015 schrieb NicoNi:
Da sieht kompliziert aus. Aber ich werde es umsetzen.
Wichtig ist die Funktion in der DLL. Wenn dort alles korrekt ist, ist
es IMHO nur noch eine Frage des Registrieren und des Aufrufes.Ich benutze dazu EWS, was meines Wissens nicht direkt über VBA geht. Momentan wird ein Kommandozeilentool aufgerufen.
Jepp, auf EWS greife ich auch über eine .Net Anwendung zu.
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren -
So sieht der Aufruf für das Registrieren der DLL/TLB bei mir aus:
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe" C:\Programme\Trinkwassermodul\Access2SMTP.dll /codebase /tlb:C:\Programme\Trinkwassermodul\Access2SMTP.tlb
Meine DLL wurde noch mit VS2005 erstellt, deshalb der Aufruf über die Version 2 vom .Net Framework.
Anschließend kann ich in Access im VBA-Editor über die Verweise einen Verweis auf die TLB setzen. Und das ist der Aufruf im VBA-Code:
Dim ComObject As Object 'Late Binding Set ComObject = CreateObject("Access2SMTP.SendMail") Call ComObject.NachrichtVersenden(strAbsendername & " " & strAbsendermail, strMailEmpfaenger, strBetreff, strText, strSMTPServer, strPort, "", strAnhang, True) Set ComObject = Nothing
Vielleicht hilft es dir ja weiter. ;)
BTW: Danke für das Posten des Codes im anderen Thread, momentan ist leider keine Zeit das im Detail zu prüfen, kommt aber sicher noch. ;)
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren -
Leider bin icht wirklich weiter.
Ich habe die vorhergehenden Tips versucht umzusetzen, das ERgebnis ist nachfolgender Mischmasch aus verschiedenen Postings zum Thema:
Hier der Beginn des KLassencodes:
Public Interface iExAppt Function xPublicTerminAnlegen(username As String, passwd As String, ExchangeServer As String, PublicFoldername As String, _ TerminZeitpunkt As Date, Dauer As Integer, _ Subject As String, bodytext As String, Ort As String) As String Sub xPublicTerminDELETE(uniqueID As String, username As String, passwd As String, ExchangeServer As String) Sub xPublicTerminUpdate(uniqueID As String, username As String, passwd As String, ExchangeServer As String, PublicFoldername As String, _ TerminZeitpunkt As Date, Dauer As UInt16, _ Subject As String, bodytext As String, Ort As String) End Interface <ComVisible(True)> <ClassInterface(ClassInterfaceType.None)> Public Class ExAppt ''' <summary> ''' Verweis auf den Web-Service ''' </summary> ''' <remarks></remarks> Dim ss As New Microsoft.Exchange.WebServices.Data.ExchangeService(ExchangeVersion.Exchange2007_SP1)
Den Rest habe ich mal grosszügig unterschlagen.
Auf einem anderen Rechner habe ich die DLL mit Regasm.exe registriert.
Als Konsequenz kann ich jetzt in Acces-VBA (Objektexplorer)
ExAppt und iExAppt sehen (also die Klasse selbst un ihr interface.
Überraschend enthält aber der Eintrag ExAppt keine Funktionen (nur z.B. ToString )
Hingegen sehe ich unter iExAppt die gwünschten Funktionen.
Unterden verweise finde ich jetzt den Namen der Assembly/stammnamespace (sind identisch), nicht aber ExAppt oder iExAppt
Ausserdem gibt es immer noch fehlermeldungen über nicht gefundene Objekte beim AUfruf, egal ob ich die Variable mit <namespace>.ExAppt oder .iExpAppt belege.
Da scheint immer noch irgendwas zu fehlen.
-
Deine Klasse ExAppt enthält ja auch keine Methoden. Und ein Interface legt man an, um es anschließend auch zu verwenden = implementiert:
Imports System.Runtime.InteropServices Public Interface iExAppt Function xPublicTerminAnlegen(username As String, passwd As String, ExchangeServer As String, PublicFoldername As String, _ TerminZeitpunkt As Date, Dauer As Integer, _ Subject As String, bodytext As String, Ort As String) As String Sub xPublicTerminDELETE(uniqueID As String, username As String, passwd As String, ExchangeServer As String) Sub xPublicTerminUpdate(uniqueID As String, username As String, passwd As String, ExchangeServer As String, PublicFoldername As String, _ TerminZeitpunkt As Date, Dauer As UInt16, _ Subject As String, bodytext As String, Ort As String) End Interface <ComVisible(True)> _ <ClassInterface(ClassInterfaceType.None)> _ Public Class ExAppt Implements iExAppt Function xPublicTerminAnlegen(username As String, passwd As String, ExchangeServer As String, PublicFoldername As String, _ TerminZeitpunkt As Date, Dauer As Integer, _ Subject As String, bodytext As String, Ort As String) As String _ Implements iExAppt.xPublicTerminAnlegen End Function Sub xPublicTerminDELETE(uniqueID As String, username As String, passwd As String, ExchangeServer As String) _ Implements iExAppt.xPublicTerminDELETE End Sub Sub xPublicTerminUpdate(uniqueID As String, username As String, passwd As String, ExchangeServer As String, PublicFoldername As String, _ TerminZeitpunkt As Date, Dauer As UInt16, _ Subject As String, bodytext As String, Ort As String) _ Implements iExAppt.xPublicTerminUpdate End Sub End Class
Siehe Implements Keyword and Implements StatementOlaf Helper
[ Blog] [ Xing] [ MVP]