VBA Einbinden einer externen DLL - Zugriff auf Routinen

  • Sonstige

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ykcin.

    VBA Einbinden einer externen DLL - Zugriff auf Routinen

    Hallo miteinander,

    zur Vorgeschichte und zum besseren Verständnis:

    Ein VBA-Script soll (irgendwo in einem Excel-Sheet) automatisch die Nachrichten von verschiedenen E-Mail-Accounts per Pop3 abrufen.

    Dazu habe ich OpenPop organisiert: sourceforge.net/projects/hpop/

    Zunächst hab ich die DLL unter Windows registriert:

    Quellcode

    1. 1. regasm OpenPop.dll /tlb:openpop.tlb
    2. 2. regasm /codebase openpop.dll


    Dabei kam es bereits zu Fehlermeldungen wie dieser - auch wenn beide Kommandos mit "Die Typen wurden registriert." bestätigt wurden.

    zu 1)

    Quellcode

    1. "Der Typbibliothekexporter hat beim Verarbeiten von "OpenPop.Mime.Traverse.Answer
    2. MessageTraverser`1, OpenPop" einen geringf¸gigen Fehler gefunden. Warnung: Der T
    3. ypbibliothekexporter hat einen generischen Typ gefunden. Generische Klassen d¸rf
    4. en nicht COM zug‰nglich gemacht werden."

    zu 2)

    Quellcode

    1. "RegAsm : warning RA0000 : Wenn Sie eine nicht signierte Assembly mit der Option
    2. "/codebase" registrieren, beeintr‰chtigt die Assembly mˆglicherweise andere auf
    3. dem Computer installierte Anwendungen. Die Option "/codebase" sollte nur mit sig
    4. nierten Assemblys verwendet werden. Geben Sie der Assembly einen starken Namen,
    5. und registrieren Sie sie erneut."


    Danach konnte ich dennoch die OpenPop DLL in Excel bzw. im VBA-Fenster unter Verweise aktivieren. Dort habe ich jetzt die "POP3 Mail Library".

    (Die DLL, die erzeugte TLB sowie RegASM liegen im Verzeichnis des XLS-Sheet, falls das von Bedeutung ist.)

    Nun kann ich unter VBA, die Codevervollständigung bietet es jedenfalls an, folgendes machen - irgendwie scheint die Klasse Pop3Client also schon mal da zu sein.

    (ich orientierte mich mal am ersten, einfachen Beispiel: hpop.sourceforge.net/exampleFetchAllMessages.php sowie folgenden Hinweisen zum Einbinden von .NET-DLL in VBA:
    geeksengine.com/article/reference-dll.html


    Visual Basic-Quellcode

    1. Dim blah As New pop3client
    2. blah.client.Connect(pop3.live.com, 995, True) = True


    Da erscheint der Fehler: Objekt erforderlich. Bis zur zweiten Zeile komme ich gar nicht erst.

    (Option Explicit ist erstmal nicht gesetzt, um mich nicht mit Variablen-Deklarationen rumzuplagen - kommt natürlich später. Damit jetzt keine schlauen Hinweise zur Notwendigkeit der Deklaration von Variablen kommen. :D)

    Dann probier ich irgendwie alles mal aus, mal ohne NEW im DIM, dafür SET als Codezeile. Etc.pp. Das jetzt hier alles aufzuführen, sprengt den Rahmen - ich probier meist auch nur ziellos hin und her, da ich nicht ganz begreife, wie ich denn auf Objekte innerhalb dieser DLL zugreifen kann.

    Das Problem ist auch - um gleich auch diesem schlauen Hinweis zu vermeiden - dass es für das Einbinden in VBA und den Zugriff auf externe DLLs keine Codebeispiele gibt. Jedenfalls nicht für meinen Anwendungsfall. Oder ich hab mich echt zu glatt angestellt beim Suchen im WWW. ^^

    Könnte ihr mir helfen? Und wenn ja, was gibt es zu tun?

    ich danke vielemals!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ykcin“ ()

    Visual Basic-Quellcode

    1. Connect("pop3.live.com",...
    Ausserdem erscheint mir das " = True" komisch.
    Ich kenne die Lib nicht, aber ich nehme an, Connect ist eine Sub oder Function und keine Property, die man setzen kann.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Hab mir jetzt mal die Doku für die von dir gewählte Überladung angeschaut.
    1) Connect ist eine Methode des Client. blah ist bereits ein Client.
    2) Connect ist eine Methode und weder Funktion noch Property.

    Visual Basic-Quellcode

    1. blah.Connect("pop3.live.com", 995, True)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ah, jetzt versteh ich deinen vorigen Post erst... da hatte ich was überlesen, sorry.

    Nun, ich glaube wir kommen dem Ziel näher. Jedenfalls versteh ich schon mal, was ich da falsch gemacht hab.

    Jetzt also noch mal zusammengefasst:

    Visual Basic-Quellcode

    1. Sub GetMail() Dim blah As pop3client blah.Connect ("pop3.live.com", 995, 1) End Sub



    Die IDE - also vorm Debuggen oder Kompilieren - gibt mir nun den Fehler "Erwartet =" zurück. (Daher auch das = TRUE, siehe oben, da dachte ich, sei mal schlau ;) )

    Wo hakt es da? Kann es sogar sein, dass ich die DLL nicht einfach in VBA einbinden kann?

    Danke soweit für die Geduld!

    //E
    kann es sein, dass ich beim Registrieren der DLL irgendwas falsch gemacht hab? 64bit vs 32bit? regasm.exe für die falsche .Net-Version?

    //E2
    Ne, ich glaube dann hätte ich das vorher gemerkt:
    If you receive this error "RegAsm : error RA0000 : Failed to load 'c:\winnt\system32\YourDLLFile.dll' because it is not a valid .NET assembly", you are probably trying to use a .Net framework 2 RegAsm.exe to register a DLL that is created by using .Net framework 4.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ykcin“ ()

    Visual Basic-Quellcode

    1. Sub GetIt()
    2. Dim blah As New pop3client
    3. blah.Connect "pop3.live.com", 995, False
    4. End Sub


    Hab ich probiert, klappt leider auch nicht. Auch in allen Varianten (0 statt False, Integer mal als String übergeben... nix. Fehlermeldung:




    ---------------------------
    Microsoft Visual Basic for Applications
    ---------------------------
    Laufzeitfehler '450':

    Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft
    ---------------------------
    OK Hilfe
    ---------------------------



    Edit by LaMa5:
    - VB-Tag korrigiert, siehe auch hier

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „LaMa5“ ()

    ykcin schrieb:

    Falsche Anzahl an Argumenten
    Sieht danach aus, also ob nur der vollständige Aufruf implementiert ist.
    hpop.sourceforge.net/documenta….Pop3Client.Connect3.html
    Versuch mal

    Visual Basic-Quellcode

    1. blah.Connect "pop3.live.com", 995, False, 0, 0, &0
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    jau, hatte ich auch gedacht und hab schon mit den Parametern rumgespielt... bleibt dabei.

    Was auch seltsam ist:
    1. Ich kann mir die Definition zu "Connect" nicht anschauen, die gibt es schlicht nicht (Kontextmenü)

    2. Im Objektkatalog gibt es zwar die Klasse Pop3Client, sie besitzt aber keine Elemente. Müsste hier nicht wenigstens irgendwo "Connect" auftauchen?

    Ich glaube wirklich, ich hab was falsch gemacht beim Einbinden in VBA... hmm


    (Danke schonmal vielmals für deinen Support hier!)

    //E
    Ich glaube, das Problem ist .NET DLL, die sich so wohl nicht in VBA einbinden lässt. Laut Tante Gugel sind dafür nur .COM DLL geeignet. Ich müsste also den OpenPop-Quellcode mit "register for com interop" / Project Properties / Build neu kompilieren. Na mal sehen, ob ich dazu noch die Muse habe...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ykcin“ ()