Fehler im DLL-Tutorial?
-
kann es sein das bei eurem tutorial auf http://bcb-tutorial.c-plusplus.net/DLL_Tutorial/artikel5.html ein fehler drin is?
der fehler steckt in der funktion AddVals...
int AddVals(int x, int y) { TAddVals* AddVals; //Variable des Zeigertyps. int Erg; HINSTANCE h = LoadLibrary("Project2.dll"); //DLL wird bei Bedarf geladen. if (h != 0) AddVals = (TAddVals*)GetProcAddress(h, "_AddVals"); if (AddVals != NULL) Erg = AddVals(x, y); //Aufruf der DLL-Funktion, hier also kein rekursiver Aufruf. else Erg = 0; FreeLibrary(h); //..und nach Gebrauch entladen. return Erg; }wenn dort LoadLibrary fehl schlägt könnte es sein das die variable AddVals ungleich NULL ist weil diese nie mit NULL initialisiert wurde oder den wert NULL (z.B. von GetProcAddress) zugewiesen bekommen hat. das hätte zur folge das AddVals aufgerufen wird obwohl es kein gültigen zeiger auf eine funktion beinhaltet.
(falls ich mich irre schneidet mir bitte nich die eier ab
)
-
MSDN sagt dazu:
If the function succeeds, the return value is a handle to the module. If the function fails, the return value is NULL. To get extended error information, call GetLastError.Sollte also ganz klar NULL sein, wenn der Aufruf nicht erfolgreich war.
Gruß Nighthero
-
das problem ist aber das GetProcAddress nicht aufgerufen wird wenn LoadLibrary nicht erfolgreich war ... aber AddVals trotzdem benutzt wird auch wenn GetProcAddress nie aufgerufen wurde und damit AddVals nie einen gültigen wert erhalten hat...
-
Du hast recht. Da muss man den Zeiger entweder mit NULL initialisieren oder einen else-Zweig in die obere Abfrage einführen.
-
Wieder mal nicht aufgepasst, ich hatte nur nach LoadLibrary gesehen.
Ich würde es so machen:
int AddVals(int x, int y) { TAddVals* AddVals; //Variable des Zeigertyps. int Erg; HINSTANCE h = LoadLibrary("Project2.dll"); //DLL wird bei Bedarf geladen. if (!h) return 0; ...Gruß Nighthero