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:
En in de dll(empty, Win32 DLL) zelf staat:
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:
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
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:
vervangen met
Kan iemand mij misschien uitleggen wat __stdcall doet? Ik snap het namelijk niet helemaal...
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);
Code:
SETINT(5);
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);
Code:
typedef void (*setIDLL)(int);
Kan iemand mij misschien uitleggen wat __stdcall doet? Ik snap het namelijk niet helemaal...
Laatst bewerkt: