Funktion mit Feld auf dll
-
Hi,
ich habe eine h datei in der funktionen für eine dll enthalten sind. Da die lib datei nicht zu borland kompatible ist, habe ich die funktionen dirket aus der dll gezogen.
in der h datei stand folgende Funktion:
void BPM_Register(int code[10]);zum Auslesen aus der dll hab ich daraus folgendes gemacht:
void BPM_Register(int code[10]) { HINSTANCE hInstance; typedef void (DLLFUNCTION1)(int); DLLFUNCTION1 *pDllFunction1; hInstance = ::LoadLibrary("bpmDetect.dll"); pDllFunction1 = (DLLFUNCTION1*)::GetProcAddress((HMODULE)hInstance, "BPM_Register"); // Aufruf aus .def Datei if(pDllFunction1) (*pDllFunction1)(code[10]); }wenn ich die funktion jetzt aufrufe bekomm ich einen EAccessViolation Fehler.
sieht einer von euch wo der fehler sein könnte??
Ach, der Aufruf sieht so aus:
int code[10]={10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; BPM_Register(code);
-
Prüf als erstes nach, ob GetProcAddress einen Nullzeiger zurückliefert. In diesen Fall konnte die funktion in der DLL nicht gefunden werden.
Ev. hilft auch:
extern "C" { typedef void (DLLFUNCTION1)(int); }
-
JBOpael schrieb:
Da die lib datei nicht zu borland kompatible ist
-> coff2omf oder implib verwenden
-
Hallo
Unabhängig davon ob die Funktion in der DLL richtig exportiert wurde und vom Programm richtig importiert werden konnte, wundere ich mich das der gezeigte Code überhaupt kompiliert. Denn spätestens in der letzten Zeile kommt ein Konvertierungsfehler, weil das syntaktisch schon falsch ist.
Hier eine syntaktisch korrigierte VersionHINSTANCE hInstance; typedef void (*DLLFUNCTION1)(int); // Richtige Definition eines Funktionspointertypes DLLFUNCTION1 pDllFunction1; // Kein Sternchen notwendig hInstance = ::LoadLibrary("bpmDetect.dll"); pDllFunction1 = (DLLFUNCTION1)::GetProcAddress((HMODULE)hInstance, "BPM_Register"); // Kein Sternchen notwendig if(pDllFunction1) pDllFunction1(code); // Richtiger Aufruf mit richtigem Argumentbis bald
akari
-
Welche Signatur hat die Funktion in der dll überhaupt?
void BPM_Register(int code[10]);
oder
void BPM_Register(int code);
Weiterhin hattest du hierif(pDllFunction1) (*pDllFunction1)(code[10]);neben dem von akari schon erwähnten Fehler noch das Problem, dass du auf ein ungültiges Arrayelement zugreifen wolltest. code ist ein int[10], kann also 10 ints enthalten. Mit code[10] willst du aber auf das 11te Element zugreifen.