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 nurbool __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?