Utiliser les apis de dlls sans avoir le fichier .lib

Description

Ceci permet d'utiliser APIs de DLLs sans avoir le fichier .lib qui nous manque parfois de façon complète et relativement simplement.

C'est ma première source C++ (je fesais du VB avant) donc soyez pas trop chiens s.v.p

Source / Exemple :


//À 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
}

Conclusion :


Alors? Pour plus d'explications, veuillez me les demander.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.