none
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.

    Sonntag, 25. Januar 2015 07:07

Alle Antworten

  • Sonntag, 25. Januar 2015 07:52
  • 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
    Montag, 26. Januar 2015 13:01
  • Hast Du die Klasse mit den Guid + ClassInterface + ProgId + ComVisible Attributen versehen? Sind die gewünschten Methoden/Properties Public?

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 26. Januar 2015 13:10
  • 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

    Montag, 26. Januar 2015 14:25
  • Montag, 26. Januar 2015 15:22
  • 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

    Montag, 26. Januar 2015 17:43
  • 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.

    Montag, 26. Januar 2015 21:43
  • 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

    Dienstag, 27. Januar 2015 06:00
  • 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

    Dienstag, 27. Januar 2015 07:48
  • 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.

    Mittwoch, 28. Januar 2015 12:22
  • 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 Statement


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 28. Januar 2015 13:03