Erreur «La procédure spécifiée est introuvable» lors de l’exécution de l’application sous Windows XP (exception c0000139)

Nous avons une dll qui fonctionnait correctement sous Vista et Win7 depuis un moment, mais lorsque XP fonctionnait, nous obtenions l’erreur “La procédure spécifiée était introuvable” lorsque LoadLibrary() était appelée pour le charger.

J’ai essayé de l’exécuter avec Dependency Walker avec l’option Profile, avec des drapeaux globaux configurés pour afficher les captures instantanées du chargeur. Les seules informations apparemment utiles que je peux en extraire sont les suivantes:

 LDR: Snapping imports for MyDll.dll from KERNEL32.dll LDR: LdrGetProcedureAddress by NAME - RtlGetLastWin32Error LDR: exception c0000139 thrown within function LdrpSnapIAT Exception record: 0012E490 Context record: 0012E4A4 Context->Eip = 7C9673BE Context->Ebp = 0012E7C0 Context->Esp = 0012E770 LDR: LdrpSnapIAT - caught exception c0000139 snapping thunks (#2) LDR: LdrpWalkImportTable - LdrpSnapIAT #2 failed with status c0000139 

Je crois que l’exception c0000139 est “Point d’entrée introuvable”.

Nous avons veillé à ce qu’il n’y ait pas de dépendances directes sur les API post-XP (il y en a quelques-unes, mais elles sont chargées dynamicment avec LoadLibrary() ). La DLL a été WINVER avec WINVER et _WIN32_WINNT défini sur 0x0501 . Le point d’entrée de la bibliothèque est visible dans les exportations affichées dans Dependency Monitor et il n’y a pas de dépendances manquantes évidentes. La même application fonctionne absolument bien sous Vista et Win7. Une version antérieure de la DLL fonctionnait parfaitement sous XP (en raison de la nature de ce composant, il est difficile de voir quel changement a provoqué une panne).

Edit: autres choses que je pense avoir actualisées:

  • Les exécutions de Visual Studio sont installées
  • Les fichiers manifeste d’une dll fonctionnelle et d’une autre qui ne sont pas identiques

Y a-t-il autre chose évident qui me manque?

Je ne sais pas si cela vous aidera, mais j’avais exactement le même problème aujourd’hui avec les instantanés du chargeur. Il s’est avéré que mon problème était visible dans depend.exe mais je ne connaissais pas la signification du dll rose: je n’ai jamais diagnostiqué que des problèmes d’exportation avec dépend, pas des problèmes d’importation.

Mon problème était que j’utilisais “RegGetValue” qui est uniquement disponible sur Vista +. Malheureusement, il n’y a pas de rapport d’erreur approprié si vous utilisez une API uniquement Vista sous Windows XP. Depends a montré cela dans la section import comme ceci:

entrez la description de l'image ici

Je remarque que votre problème était avec Kernel32.dll plutôt que Advapi.dll afin de vérifier les importations avec dépend …