Dynamicly Linking DLL's(argument crash) - C++

Status
Niet open voor verdere reacties.

Neo Angelus

Gebruiker
Lid geworden
27 mei 2007
Berichten
27
Hallo iedereen,

Ik heb weer een probleem. ik probeer een programma te maken, waarin ik functionaliteit toe wil voegen door een soort plugins in de vorm van *.dll's in een map te zetten, waarbij het program telkens de desbetreffende map scant voor nieuwe plugins.(beetje ala Winamp)

Probleem is, ik wil de *.dll de mogelijkheid geven om he hoofdprogramma aan te roepen. Dit heb ik met classes opgelost door de classes een pointer te geven naar een functie in het hoofdprogramma.

Dit zelfde principe wou ik gebruiken voor de *.dll's, maar ik loop ergens vast. Elke keer wanneer ik een functie, die een argument neemt aanroep in de dll crashed het programma.(vaak met een soort 0-pointer)...

Ik heb twee projecten, beide in Visual Studio 2005, beide C++.

Een leeg project(nu niet meer obviously) wat door middel van LoadLibrary en GetProcAddress functies in de dll `linked`.

Ik neem voor het gemak even een functie met een int.
In het hoofdprogramma staat dan:
Code:
typedef void (__stdcall *setIDLL)(int);

//some stuff

setIDLL SETINT;

//yet another piece of code

			setIDLL tmp4;
			tmp4 = (setIDLL)GetProcAddress(LoadMe,"setInt");
			if(tmp!=NULL){
				SETINT = tmp4;
			}else{
				//std::cout << "no valid address" << std::endl;
				return -4;
			}

En in de dll(empty, Win32 DLL) zelf staat:
Code:
//*.h file
int tmpValue;

extern "C"{
__declspec(dllexport) void setInt(int);
}

//*.cpp file
__declspec(dllexport) void setInt(int x){
	tmpValue = x;
}

Alles lijkt perfect te werken. En functies in de DLL die alleen een waarde teruggeven werken ook perfect. Het probleem doet zich alleen elke keer voor als ik bijvoorbeeld:
Code:
SETINT(5);
Uitvoer in het hoofdprogramma. Op dat moment lijkt er ergens een 0-pointer(ofzo) het programma te laten crashen. Ik heb zo veel mogelijk proberen te elimineren, door de functie in de DLL niets te laten doen. En door te echt te checken of SETINT niet NULL is. maar het lijkt echt alsof het op de regel van
Code:
SETINT(5);
crashed.

Nu is het vermoedelijk iets in de richting van de conventies van het aanroepen. of iets wat ik fout doe met de DLL(ik heb niet zo veel ervaring met DLL's en al helemaal niet in C++)

Ik hoop echt dat iemand mij hiermee kan helpen. Ik heb trouwens alleen de snippets gegeven, die mij belangrijk leken, omdat in de echte code een boel overbodige dingen staan. Als er te weinig code is gegeven moet iemand het maar laten weten. Ik wil alleen nog benadrukken, dat beide projecten empty begonnen zijn en dat ik behalve <windows.h> niets include.

Alvast bedankt!


Al weer gevonden...oplossing was:
Code:
typedef void (__stdcall *setIDLL)(int);
vervangen met
Code:
typedef void (*setIDLL)(int);

Kan iemand mij misschien uitleggen wat __stdcall doet? Ik snap het namelijk niet helemaal...
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan