2 Stimmen

DLL-Funktion nicht exportiert: Es konnte kein Einstiegspunkt namens TestFunc gefunden werden

Ich bin damit beschäftigt, mich ein wenig in C/C++ einzuarbeiten und mit C# zu interagieren. Ich habe mehrere Beispiele für die Erstellung einer einfachen Win32-DLL und die Verwendung dieser von C# überprüft, aber wenn ich versuche, und rufen Sie in meine DLL, erhalte ich den Laufzeitfehler: "Es konnte kein Einstiegspunkt namens TestFunc gefunden werden". Meine DLL sieht so aus, und ich habe sie aus einem Win32-DLL-Projekt erstellt, mit der Option "leeres Projekt":

Überschrift:

__declspec(dllexport) int TestFunc(char *, char *, char *);

Code-Datei:

#include "stdafx.h"
#include "TestLib.h"

__declspec(dllexport) int TestFunc(char *arg1, char *arg2, char *arg3) 
{
  char str1[] = "Brady Kelly";
  char str2[] = "Hello World";
  char str3[] = "1234567890";

  strcpy(arg1, str1);

  return 128;   
}

Was mache ich falsch?

6voto

1800 INFORMATION Punkte 125009

Ist Ihre Funktion mit C- oder C++-Bindungen kompiliert? Sie geben es nicht an, aber es sieht für mich so aus, als ob die Möglichkeit besteht, dass Sie den C++-Compiler verwenden - der Compiler verwendet eine ganz andere Namensmanipulation als der C-Compiler, und Sie werden den Namen "TestFunc" nicht so einfach finden können, als wenn Sie den C-Compiler oder die C-Namensmanipulationsregeln verwenden würden.

Um dem C++-Compiler einfach mitzuteilen, dass er die C-Namen-Mangling-Regeln verwenden soll, verwenden Sie dies in der Header-Datei:

extern "C"
{
  __declspec(dllexport) int TestFunc(char *, char *, char *);
}

2voto

Außerdem brauchen Sie das declspec nur vor der Funktionsdeklaration (in der Header-Datei), nicht vor der Definition. Ein nützliches Werkzeug, um zu untersuchen, was von der DLL exportiert wird und wovon die DLL abhängt, ist Abhängigkeits-Walker .

2voto

dirkgently Punkte 104289

Da Sie diese Frage als C gekennzeichnet haben, würde ich eine kleine Änderung der Lösung von 1800 INFORMATIONEN vorschlagen:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef EXPORT_MODE
#define METHODTYPE __declspec(dllexport)
#else 
#define METHODTYPE __declspec(dllimport)
#endif

#ifdef __cplusplus
}
#endif

/*! _The_ method */
METHODTYPE int TestFunc(char *, char *, char *);

Auf diese Weise können Sie denselben Header sowohl im Code der Kunden als auch in Ihrem Code verwenden.

NB: Dependency Walker ist nicht mehr mit VS2008 gebündelt. Sie müssen ihn herunterladen, wenn Sie VS2008 verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X