DosQueryProcAddr |
DOS : Requête d'adressage de procédure |
---|---|
DOSCALLS.DLL | os2.h |
Syntaxe
APIRET DosQueryProcAddr( HMODULE hMod, ULONG ulOrdinal, PSZ pszProcName, PFN* pProcAddr ); |
Paramètres
Nom | Description |
---|---|
hMod | Ce paramètre permet d'indiquer le Handle du module de la requête (pour le DosLoadModule). |
ulOrdinal | Ce paramètre permet d'indiquer le nombre ordinal pour le processus recherché. Si la valeur est 0, pszProcName est utilisé. |
pszProcName | Ce paramètre permet d'indiquer un pointeur vers une chaîne de caractères contenant le nom du processus recherché. Il ne distinct pas les majuscules ou minuscules. |
pProcAddr | Ce paramètre permet d'indiquer l'adresse du pointeur de fonction, lequel contient l'adresse de la procédure. |
Retour
Valeur | Constante | Description |
---|---|---|
0 | NO_ERROR | Cette valeur permet d'indiquer que l'opération s'est correctement effectué |
6 | ERROR_INVALID_HANDLE | Cette valeur permet d'indiquer que la valeur du hmuxSemaphore ne point pas sur un sémaphore valide. |
123 | ERROR_INVALID_NAME | Cette valeur permet d'indiquer que le nom pszSemaphoreName est rejeté par un fichier système. |
65079 | ERROR_ENTRY_IS_CALLGATE | Cette valeur permet d'indiquer qu'une erreur d'entrée dans l'appel des point d'entrées du module s'est produit. |
Description
Cette fonction permet de trouver l'adresse d'un processus d'un module de lien dynamique.
Remarques
- Il est plus rapide et plus fiable d'interroger les adresses de procédure par ordinal lorsque cette situation est possible, en supposant que les ordinaux de la DLL ont été explicitement attribués. Les noms de procédure peuvent changer dans une DLL et la spécification d'un ordinal correspondant à un ordinal attribué dans le fichier DEF de la DLL garantit que les changements de nom ne casseront pas votre code.
- Si vous recevez le code retour ERROR_INVALID_HANDLE, lancez DosLoadModule et répétez cet appel.
- Si l'adresse de la procédure à interroger se trouve dans le module DOSCALLS.DLL ou tout autre module contenant uniquement des ordinaux, vous devez l'interroger via l'ordinal, sinon ERROR_INVALID_NAME sera renvoyé.
- Si vous émettez DosQueryProcAddr pour obtenir l'adresse d'un point d'entrée accessible uniquement via un portail d'appel, vous recevez le code retour ERROR_ENTRY_IS_CALLGATE.
- Si la procédure est introuvable dans la DLL, la constante ERROR_PROC_NOT_FOUND est renvoyé. Voici quelques-unes des raisons possibles de cette erreur : La procédure n'a pas été exportée par le fichier de définitions de module (.DEF). Assurez-vous qu'une exportation est définie pour la procédure dans le fichier DEF. Il y a une erreur dans le cas de la procédure. À moins que la DLL ne soit liée à l'option NOIGNORECASE (/NOI), le nom de la procédure (le paramètre pszProcedureName) doit être spécifié en majuscules. Le nom de la procédure a été mal orthographié.
- Les adresses de fonction renvoyées par DosQueryProcAddr ont une liaison _System. Les fonctions compilées avec CSet++ utilisent la liaison Optilink par défaut. Assurez-vous que les liens correspondent, sinon des résultats imprévisibles se produiront.
Exemple
Voici un simple exemple montrant comme appeler cette API avec WatCom C++ for OS/2 :
- #define INCL_DOSERRORS
- #define INCL_DOSMODULEMGR
- #include "os2.h"
- #include "stdio.h"
-
- void main(void) {
- void (* dll_fonction)(int, char*);
- HMODULE hmod;
- switch(DosQueryProcAddr(hmod, 0, "MA_FONCTION", (PFN *) dll_fonction)) {
- case NO_ERROR: printf("Tout va bien !");break;
- case ERROR_INVALID_HANDLE: printf("Erreur : La valeur du hmuxSemaphore ne point pas sur un sémaphore valide.");break;
- case ERROR_INVALID_NAME: printf("Erreur : Le nom pszSemaphoreName est rejeté par un fichier système.");break;
- case ERROR_ENTRY_IS_CALLGATE: printf("Erreur : Une erreur d'entrée dans l'appel des point d'entrées du module s'est produit");break;
- }
-
- dll_fonction(1234,"Ma fonction!\n");
- }
Voir également
Langage de programmation - C pour OS/2 - DosLoadModule
Langage de programmation - C pour OS/2 - DosFreeModule
Langage de programmation - C pour OS/2 - DosQueryModuleName
Langage de programmation - C pour OS/2 - DosQueryProcType
Système d'exploitation - OS/2 - Introduction
Dernière mise à jour : Lundi, le 19 juillet 2010