Aufruf einer DLL(C++) in VBA bringt Probleme



  • Hi,

    hier der Code in VBA:

    'global Deklariert
    Private Declare Function USEDLL_SEARCHENGINE Lib "C:\Perspektiv GmbH\Searchengine.dll" (ByVal t As String, ByVal a As String) As Boolean
    
    ' eigentliche Suchfunktion
    Public Function Search(table As OrgDbServer31.table, field As String, pattern As String)
        On Error GoTo errhandler
    
    '    Search = InStr(1, table.Fields(field).Value, pattern, 1)
    
        Search = USEDLL_SEARCHENGINE(table.Fields(field).Value, pattern)
    
        Exit Function
    errhandler:
        gErrors.DisplayError csErrSource & ".Search"
    End Function
    

    und hier der C++ Code:
    Header

    #include "windows.h"
    
    #define export __declspec (dllexport) export bool __stdcall USEDLL_SEARCHENGINE (char *str1,char `*str2);
    

    eigentlicher Code:

    #define   STRICT
    
    #include "stdafx.h"
    #include "searchengine.h"
    #include "string.h"  
    
    // Funktionsnamenexport
    #pragma comment(linker, "/DEF:Searchengine.def")
    
    bool __stdcall USEDLL_SEARCHENGINE (char *str1,char *str2)
    {
    	if ((strstr(str1, str2)) == NULL) 
    	{
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    

    und die Def:

    EXPORTS
    	USEDLL_SEARCHENGINE
    

    Fehler, wenn ich die Funktion aufrufe:
    "DLL-Einsprungspunkt in USEDLL_SEARCHENGINE >Programmverzeichniss< nicht gefunden"

    Kann mir jemand weiterhelfen??



  • Ich würde tippen dass DLLMain fehlt, ist aber zugegeben sehr lange her dass ich sowas zuletzt gemacht habe.

    EDIT:
    In einem älteren Projekt fand sich das (Ausschnitt):

    extern "C" BOOL APIENTRY DllMain(HINSTANCE, DWORD dwReason, LPVOID) {
        return TRUE;
    }
    

    EDIT2:
    Das Forum ist aber sowas von falsch gewählt 😉



  • ich benutze keine winapi....



  • was hätte ich sonst nehmen sollen?? VBA gibts hier nich... da es aber ein fehler in c++ is, hab ich gedacht ich poste es mal hier... falls es wo anders hingehört, können dies ja die Admins hier tun..



  • Eigentlich seh ich da ein C-Programm und kein C++. Und mit windows.h benutzt Du auch die WinAPI (jedenfalls bindest Du sie ein).

    Was mir noch auffällt, was soll die #define Zeile machen?? Ein Makro namens export definieren, welches selbst das Makro export benutzt?

    Wenn dann eher die Richtung:

    bool __declspec (dllexport) __stdcall USEDLL_SEARCHENGINE (char *str1,char *str2);
    

    Vermutlich hat Deine Funktion einfach nirgendwo ein dllexport abbekommen.



  • windows.h war von MS IDE

    jetzt hab ich es so und bringt immer noch den selben fehler

    #ifdef __cplusplus
    extern "C" {  // C-Deklarationen für C++
    #endif
    
    #define export __declspec (dllexport) bool __stdcall USEDLL_SEARCHENGINE (char *str1,char `*str2);
    
    #ifdef  __cplusplus
    }
    #endif
    


  • Wer von VB(A) aus C-DLLs aufruft hat auch nichst besseres verdient. 😃

    Warum nicht ActiveX(COM), wenns stattdessen auch kompliziert(er) und
    fehlerträchtig geht.



  • @AberHallo

    siehe hier



  • Lass mal das #define export vor der Funktionsdeklaration weg.



  • jetzt hab ich

    #ifdef __cplusplus
    extern "C" {  // C-Deklarationen für C++
    #endif
    
    __declspec (dllexport) bool __stdcall USEDLL_SEARCHENGINE (char *str1,char `*str2);
    
    #ifdef  __cplusplus
    }
    #endif
    

    und beim compen sagt der "c:\<...>\searchengine.h(16) : error C2018: Unbekanntes Zeichen '0x60'"



  • b43r_3o=o3 schrieb:

    @AberHallo

    siehe hier

    Was hat das eine mit dem andern zu tun ? Mein Vorschlag war, von C/C++ her eine
    COM-Schnittstelle zu verwenden weil sich dadurch die Parameterübergabe wesentlich
    vereinfachen würde.

    Die Umstellung von char* nach BSTR wäre ganz sicherlich nicht problematisch, da
    die Funktion doch scheinbar genau einmal für Suche aufgerufen wird da es sich ja
    nicht um die Vergleichsfunktion handelt oder ?



  • Wofür ist dieser Strich vor dem zweiten Stern in der Parameterliste?



  • loooooool - danke compt fertig.. aber geht immer noch nich - selbe fehlermeldung



  • Das declspec kann weg:

    Da du die DLL in VB brauchst, musst du stdcall nehmen.
    Also braucht du als Funktiondsdeklaration nur

    bool __stdcall USEDLL_SEARCHENGINE (char *str1,char `*str2);
    

    Dafür ist dann halt der Eintrag in der DEF-Datei nötig, den du ja schon gemacht hast.



  • mal noch ne Frage in die Runde:

    Das "__declspec (dllexport)" zunm automatischen Exportieren von Funktionsnamen, klappt das nur mit cdecl oder auch mit stdcall oder anderen Konventionen?


Log in to reply