- //À mettre dans un fichier .h appart qui sera à include
- //Mettre les définitions d'API ici
-
- //Comment on défénit le type d'une API? Regardez :
-
- //typedef %type de ce que retourne l'API% (%Convention d'appel%)* %le nom de ce nouveau type%) (%les paramètres de l'API%);
-
- //%le nom du type de l'API% %le nom de la variable qui contiendra l'API%;
-
- //En général, __stdcall sera la convention d'appel requise mais il ce peut que ce soit __cdecl
-
- typedef int (__stdcall* apiMsgBox) (HWND Handle, LPCSTR Texte, LPCSTR Titre, UINT Flags);
- apiMsgBox MonMsgBox;
-
-
- typedef int (__stdcall* apiGetTickCount) (void);
- apiGetTickCount MonGetTickCount;
-
-
- typedef void (__cdecl* apitest) (LPCSTR a, int b);
- //LA CONVENTION D'APPEL PAR DÉFAULT EN C++ EST __cdecl donc il ne faut pas __stdcall mais rien ou __cdecl
- apitest Montest;
-
- //}
-
-
- HMODULE hmodDlls[1];//Dans ce tableau, on stock les modules
- int Count=1;//On Commence à 1
-
- void InitializeAPIs()//Cette fonction initialize les APIs
- {
-
-
- hmodDlls[Count]=LoadLibrary(TEXT("User32.dll"));//On load la DLL User32.dll
- if (!hmodDlls[Count]==0){cout << "Chargement du module #" << Count << " : " << hmodDlls[Count] << "\n";}else{cout << "Impossible de charger le module #" << Count << "!\n";}
-
- MonMsgBox=(apiMsgBox)GetProcAddress(hmodDlls[Count],TEXT("MessageBoxA"));
- //La variable MonMsgBox (qui est du type apiMsgBox) reçcit comme valeur un pointeur vers la fonction MessageBoxA de User32.dll
-
- //Si on voudrait déclarer une nouvelle API qui est dans User32.dll, on le ferait ICI
-
- Count++;//Quand on a fini avec un module, on incrémente Count pour faire de la place pour un nouveau module si on en a besoins
-
- //Nouveau module : Kernel32.dll
-
- hmodDlls[Count]=LoadLibrary(TEXT("Kernel32.dll"));//On load la DLL User32.dll
- if (!hmodDlls[Count]==0){cout << "Chargement du module #" << Count << " : " << hmodDlls[Count] << "\n";}else{cout << "Impossible de charger le module #" << Count << "!\n";}
-
- MonGetTickCount=(apiGetTickCount)GetProcAddress(hmodDlls[Count],TEXT("GetTickCount"));//...
-
- Count++;
-
- hmodDlls[Count]=LoadLibrary(TEXT("Ma dll.dll"));//On load la DLL Drole.dll (que j'ai fait en C++)
- if (!hmodDlls[Count]==0){cout << "Chargement du module #" << Count << " : " << hmodDlls[Count] << "\n";}else{cout << "Impossible de charger le module #" << Count << "!\n";}
-
- Montest=(apitest)GetProcAddress(hmodDlls[Count],TEXT("test"));//...
-
- cout << "\n\n";//laisser deux lignes vides
- }
-
- void TerminateAPIs()//Tout nettoyer
- {
- for(int i = 1; i <= Count ; i++)//Pour chaque module qu'on a loader
- {
- cout << "Nettoyage du module #" << i << " : " << hmodDlls[i] << "\n";//Dire que le module à été nettoyer
- FreeLibrary(hmodDlls[i]);//Relacher le module
- }
- cout << "\n";//laisser une ligne vide à la fin
- }
//À mettre dans un fichier .h appart qui sera à include
//Mettre les définitions d'API ici
//Comment on défénit le type d'une API? Regardez :
//typedef %type de ce que retourne l'API% (%Convention d'appel%)* %le nom de ce nouveau type%) (%les paramètres de l'API%);
//%le nom du type de l'API% %le nom de la variable qui contiendra l'API%;
//En général, __stdcall sera la convention d'appel requise mais il ce peut que ce soit __cdecl
typedef int (__stdcall* apiMsgBox) (HWND Handle, LPCSTR Texte, LPCSTR Titre, UINT Flags);
apiMsgBox MonMsgBox;
typedef int (__stdcall* apiGetTickCount) (void);
apiGetTickCount MonGetTickCount;
typedef void (__cdecl* apitest) (LPCSTR a, int b);
//LA CONVENTION D'APPEL PAR DÉFAULT EN C++ EST __cdecl donc il ne faut pas __stdcall mais rien ou __cdecl
apitest Montest;
//}
HMODULE hmodDlls[1];//Dans ce tableau, on stock les modules
int Count=1;//On Commence à 1
void InitializeAPIs()//Cette fonction initialize les APIs
{
hmodDlls[Count]=LoadLibrary(TEXT("User32.dll"));//On load la DLL User32.dll
if (!hmodDlls[Count]==0){cout << "Chargement du module #" << Count << " : " << hmodDlls[Count] << "\n";}else{cout << "Impossible de charger le module #" << Count << "!\n";}
MonMsgBox=(apiMsgBox)GetProcAddress(hmodDlls[Count],TEXT("MessageBoxA"));
//La variable MonMsgBox (qui est du type apiMsgBox) reçcit comme valeur un pointeur vers la fonction MessageBoxA de User32.dll
//Si on voudrait déclarer une nouvelle API qui est dans User32.dll, on le ferait ICI
Count++;//Quand on a fini avec un module, on incrémente Count pour faire de la place pour un nouveau module si on en a besoins
//Nouveau module : Kernel32.dll
hmodDlls[Count]=LoadLibrary(TEXT("Kernel32.dll"));//On load la DLL User32.dll
if (!hmodDlls[Count]==0){cout << "Chargement du module #" << Count << " : " << hmodDlls[Count] << "\n";}else{cout << "Impossible de charger le module #" << Count << "!\n";}
MonGetTickCount=(apiGetTickCount)GetProcAddress(hmodDlls[Count],TEXT("GetTickCount"));//...
Count++;
hmodDlls[Count]=LoadLibrary(TEXT("Ma dll.dll"));//On load la DLL Drole.dll (que j'ai fait en C++)
if (!hmodDlls[Count]==0){cout << "Chargement du module #" << Count << " : " << hmodDlls[Count] << "\n";}else{cout << "Impossible de charger le module #" << Count << "!\n";}
Montest=(apitest)GetProcAddress(hmodDlls[Count],TEXT("test"));//...
cout << "\n\n";//laisser deux lignes vides
}
void TerminateAPIs()//Tout nettoyer
{
for(int i = 1; i <= Count ; i++)//Pour chaque module qu'on a loader
{
cout << "Nettoyage du module #" << i << " : " << hmodDlls[i] << "\n";//Dire que le module à été nettoyer
FreeLibrary(hmodDlls[i]);//Relacher le module
}
cout << "\n";//laisser une ligne vide à la fin
}