2009-05-08 26 views
5

Tengo una función comercial de JD Edwards, que está escrita en Microsoft Visual C++ como un módulo C. Estoy usando LoadLibrary para acceder a una DLL de terceros. En un programa de prueba independiente, el código funciona bien. Cuando lo ejecuto desde JDE, LoadLibrary devuelve NULL y GetLastError devuelve 126, lo que significa The specified module could not be found según MSDN. Intenté poner la ruta completa a la DLL, y sí, me he acordado de duplicar los caracteres en la ruta. Ninguna diferencia.¿Qué podría evitar que una DLL se cargue con LoadLibrary?

He comprobado que no haya dependencias que impidan que se cargue la DLL; DUMPBIN/DEPENDIENTES devuelve lo siguiente:

WSOCK32.dll 
USER32.dll 
GDI32.dll 
WINSPOOL.DRV 
ADVAPI32.dll 
KERNEL32.dll 

Estas parecen DLL estándar de Windows, así que estoy en una pérdida.

Respuesta

5

¿Falta una dependencia? ¿Ha comprobado con Dependency Walker que se encuentran todas las bibliotecas a las que se hace referencia?

+0

Ha pasado mucho tiempo desde que lo necesitaba, me olvidé por completo de Dependency Walker. Dice que me falta una DLL cargada de retraso dwmapi.dll, que entiendo es solo Vista. No creo que ese sea el problema, pero gracias por el puntero. –

+0

¿Qué hay de mover el dll a una carpeta que está en su camino como% windir% \ system32? –

0

Puede intentar probar mientras se está ejecutando ProcMon y ver si hay errores visibles mientras la supervisión de archivos está habilitada.

3

Si adjunta un depurador durante la llamada LoadLibrary, puede arrojar información de error para depurar la salida. Además de las otras sugerencias aquí, si el manifiesto tiene un error, este problema ocurrirá.

Estoy seguro de que es un problema de dependencia para usted. Pruebe la cosa ProcMon, y también intente ejecutar en Vista para ver si eso resuelve el problema. Puede obtener una imagen VPC de prueba here.

+0

Tengo un problema de DLL ahora, y esta respuesta me ayudó. Recibo el error 126 y vi en el depurador que los símbolos de mi DLL se cargaron y luego se descargaron de inmediato. Sospecho que tengo un problema de dependencia que no he descubierto, y no un problema de ruta DLL. –

1

Fui una vez a la misma pesadilla. Fue imposible diagnosticar cualquier cosa, descubrí que restablecer la ruta de la orden de la lista de búsqueda dll (la palabra clave aquí es probablemente 'lista', no 'orden') solucionó el problema.

SetDllDirectory (NULL);

La explicación es que una DLL de terceros en el medio probablemente estaba jugando con eso, sin restaurar su estado original. Esto podría explicar por qué solo su aplicación de prueba estaba funcionando.

+0

No sabía acerca de SetDllDirectory, gracias por el puntero. En este caso, debería haber sido redundante, ya que tenía la ruta completa a la DLL en el nombre del archivo. –

+0

En mi caso particular, ni siquiera estaba trabajando con una ruta completa a la DLL, porque de nuevo dependía de otras DLL. – Jem

0

Además, el Dependency walker se puede ejecutar utilizando la opción de perfil. En este caso, el archivo ejecutable debe cargarse en el administrador de dependencias. Además, se puede usar el menú "Perfil".

La aplicación se inicia en ese momento y el árbol dll se llena. Esto también mostrará si falta un dll de carga de carga y otras cosas.

0

Si no encuentra una respuesta marcando dependencias, le sugiero que se concentre en posibles problemas debido a la arquitectura.

Mencionó que está utilizando un entorno de prueba independiente, pero cuando lo prueba en un entorno normal, no funciona. ¿La configuración de la función Business se ejecuta en el servidor?

Ha pasado bastante tiempo desde la última vez que trabajé con JDE. Recuerdo que una vez escribí un BSFN en C para llamar a varias UBE en una especie de sincronización y funcionó bien en mi máquina local y no funcionó cuando estaba probando en el servidor. Había algo en el servidor que no podía encontrar la DLL (aunque yo estaba proporcionando una ruta) y algunas configuraciones que se requerían. Además, había una diferencia que era crítica en mi caso: en mi máquina, el BSFN esperaría la finalización de las UBE y capturaría el estado, en el servidor no lo haría y también tenía que ver con la configuración de los objetos .

De nuevo, si no encuentra nada útil, intente solicitar ayuda en www.jdelist.com.

Cuestiones relacionadas