visual studio farproc visual-c++ loadlibrary

visual-c++ - studio - farproc getprocaddress



Código de error de LoadLibrary() 127 (8)

¿Tiene una discrepancia entre los tiempos de ejecución utilizados para su aplicación y la DLL?

Un problema que me mordió con VS 2005 en el pasado es que una parte se crea como una versión de lanzamiento y la otra como una versión de depuración. Estos tiran de diferentes versiones de las DLL de tiempo de ejecución de Microsoft que son incompatibles ya que solo puede tener una cargada en un proceso determinado.

Creo que la razón por la que ve el Error 127 es porque su DLL está buscando una función en el DLL de tiempo de ejecución cargado que no está allí porque es el tiempo de ejecución incorrecto.

Estoy teniendo problemas con LoadLibrary () y obtengo un error que no tiene sentido para mí:

::SetLastError(0); m_hDll = ::LoadLibrary(szName); if (m_hDll == NULL) // Failure to load the DLL. { DWORD err = GetLastError(); }

El error es 127 ("No se pudo encontrar el procedimiento especificado"). Eso no tiene ningún sentido para mí en una llamada a LoadLibrary (). No he llamado a GetProcaddress () todavía.

La DLL (y la aplicación) están compiladas con VS ++ 2005 SP1.

¿Qué podría salir mal?


Dos conjeturas de mi
1. LoadLibrary llama al DllMain de la DLL especificada (la primera vez que intenta adjuntarlo a su proceso). Plano general pero está ahí?
2. LoadLibrary cargará la DLL especificada y todas sus dependencias. Por lo tanto, si un módulo dependiente de la DLL no puede ubicarse en la ruta de búsqueda que hará que la carga falle, puede usar depends.exe para verificar, disponible here


El mensaje de error significa que se ha encontrado una DLL apropiada pero falta la exportación del procedimiento requerido. ¿Tienes la versión correcta de la DLL?

Puede usar dumpbin.exe para verificar qué funciones exporta su DLL y verificar la ortografía.


Instale las herramientas de depuración y ejecute gflags -i your_application.exe +sls . Después de eso, ejecute la aplicación bajo el depurador para capturar las trazas del cargador.


La herramienta gflags Microsoft siempre le dirá exactamente qué dependencia no se carga y por qué.

Ejecute gflags -i your_application.exe +sls . Después de eso, ejecute la aplicación bajo el depurador para capturar las trazas del cargador .

gflags forma parte de las herramientas de depuración ; puede consultar C:/Program Files (x86)/Windows Kits/10/Debuggers/x64 para ver si ya lo tiene. Puede agregar ese directorio a su ruta, o simplemente ejecutar gflags desde ese directorio en cmd.exe.

Por ejemplo, después de ejecutar gflags, coloque un punto de interrupción en la ::LoadLibrary(_T("foo")) y ::LoadLibrary(_T("foo")) mientras busca errores en el cargador de su ventana de resultados de Visual Studio, por ejemplo

4b00:396c @ 479194074 - LdrpSnapThunk - ERROR: Procedure "?SetObject@vis_DollarMap@@QEAAXHPEAX@Z" could not be located in DLL "bar.dll" First-chance exception at 0x0000000077307EF8 (ntdll.dll) in your_application.exe: 0xC0000139: Entry Point Not Found. 4b00:396c @ 479194074 - LdrpGenericExceptionFilter - ERROR: Function LdrpSnapIAT raised exception 0xc0000139 Exception record: .exr 0000000000129070 Context record: .cxr 0000000000128B80 4b00:396c @ 479194074 - LdrpHandleOneOldFormatImportDescriptor - ERROR: Snapping the imports from DLL "C:/test/64Debug/foo.DLL" to DLL "C:/test/64Debug/bar.dll" failed with status 0xc0000139

Esto significa que durante la carga de foo.dll , se importó la dependencia bar.dll y la importación de bar.dll falló.

¿Falló la importación de dependencias porque ?SetObject@vis_DollarMap@@QEAAXHPEAX@Z el procedimiento ?SetObject@vis_DollarMap@@QEAAXHPEAX@Z - puede demangle al public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64 .

Probablemente tenga la versión incorrecta de una dependencia, tal vez necesite reconstruir la dependencia para actualizarla.

Ejecute gflags -i your_application.exe -sls después para deshabilitar los rastros del cargador.


Recibía el mismo código de error después de llamar a LoadLibrary (). Finalmente se encontró a través del caminante de dependencias que faltaban algunas dependencias del módulo (szName).


Vamos a dar un paso a paso:

  1. El mensaje de error significa que se encontró la dll pero falta una función requerida. (Jitter tiene razón). Esto implica que tiene la dll que necesita, pero no la versión correcta. (Davefiddes tiene razón, aunque el problema puede ser cualquier dll, no solo la biblioteca de tiempo de ejecución de Microsoft. Y, al menos para las actualizaciones importantes, Microsoft le da nombres a sus bibliotecas de tiempo de ejecución, por lo que en ese caso no sería un problema).

  2. Esto no tiene sentido, porque no se ha solicitado ninguna función desde el dll que se está cargando. (Adán tiene razón).

  3. Por lo tanto, se esperaba que la función faltante no se encontrara en la dll que está siendo cargada explícitamente por el comando LoadLibrary, sino en una dll dependiente que se está cargando implícitamente al mismo tiempo, porque la primera dll lo requiere. (Zebrabox estaba cerca.)

  4. Una dll dependiente es una dll que está "estáticamente" vinculada a la biblioteca que se carga explícitamente, a través de una biblioteca de importación o archivo .lib, incluida en el paso del enlazador de la dll cargada explícitamente. (Apuesto a que no sabías que una "biblioteca de enlaces dinámicos" podría estar "enlazada estáticamente". Bueno, ahora lo sabes).

  5. Si tiene varias versiones de la misma dll en diferentes carpetas, entonces esto también podría ser un problema de búsqueda (como sugiere zebrabox). El orden de búsqueda de la ruta Dll es un tema complicado en sí mismo: consulte http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx . Depende del sistema operativo, entre otras cosas. La apuesta más segura, cuando sea práctico, es poner todas las dlls de problemas potenciales en la misma carpeta que su exe.

  6. Las DLL dependientes también pueden tener sus propias DLL dependientes, lo que puede hacer que este problema sea muy difícil de resolver. Depende puede ayudar, pero si no lo hace, intente filemon. La última dll que se leyó correctamente antes de su mensaje de error es la que tiene la versión incorrecta.


Yo sugeriría usar here para averiguar qué método falta o qué DLL son necesarios o faltan.