2009-05-08 11 views
5

Possiedo una funzione aziendale JD Edwards, scritta in Microsoft Visual C++ come modulo C. Sto usando LoadLibrary per accedere a una DLL di terze parti. In un programma di test indipendente, il codice viene eseguito correttamente. Quando lo eseguo da JDE, LoadLibrary restituisce NULL e GetLastError restituisce 126, che significa The specified module could not be found in base a MSDN. Ho provato a inserire il percorso completo della DLL, e sì mi sono ricordato di raddoppiare i \ caratteri nel percorso. Nessuna differenza.Cosa potrebbe impedire il caricamento di una DLL con LoadLibrary?

Ho verificato che non ci siano dipendenze che impediscano il caricamento della DLL; DUMPBIN/A CARICO restituisce il seguente:

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

Questi sembrano DLL standard di Windows, quindi sono in perdita.

risposta

5

Una dipendenza mancante? Hai controllato con Dependency Walker che tutte le librerie di riferimento sono state trovate?

+0

È passato molto tempo da quando ne avevo bisogno, mi sono completamente dimenticato di Dependency Walker. Dice che mi manca una DLL caricata in ritardo dwmapi.dll, che capisco solo Vista. Non penso sia questo il problema, ma grazie per il puntatore. –

+0

Che ne dici di spostare la DLL in una cartella sul tuo percorso come% windir% \ system32? –

0

È possibile provare a eseguire il test mentre ProcMon è in esecuzione e verificare se sono visibili errori durante il monitoraggio dei file.

3

Se si allega un debugger durante la chiamata LoadLibrary, è possibile che vengano visualizzate informazioni di errore per eseguire il debug dell'output. Oltre agli altri suggerimenti qui, se il manifest presenta un errore, si verificherà questo problema.

Sono abbastanza sicuro che sia un problema di dipendenza per te. Prova la cosa ProcMon, e prova anche a correre su Vista per vedere se questo risolve il problema. È possibile ottenere un'immagine VPC di prova here.

+0

Al momento ho un problema con DLL e questa risposta mi ha aiutato. Ricevo l'errore 126 e ho visto nel debugger che i simboli della mia DLL sono stati caricati e quindi immediatamente scaricati. Ho il sospetto che ho un problema di dipendenza che non ho capito, e non un problema di path DLL. –

1

Sono andato una volta nello stesso incubo. Non è stato possibile diagnosticare nulla, ho appena scoperto che il ripristino del percorso dell'ordine della lista di ricerca dll (la parola chiave qui è probabilmente 'elenco', non 'ordine') ha risolto il problema.

SetDllDirectory (NULL);

La spiegazione è che una DLL di terze parti nel mezzo probabilmente stava scherzando con esso, senza ripristinare il suo stato originale. Questo potrebbe spiegare perché solo la tua applicazione di test funzionava.

+0

Non sapevo di SetDllDirectory, grazie per il puntatore. In questo caso avrebbe dovuto essere ridondante, dal momento che avevo il percorso completo della DLL nel nome del file. –

+0

Nel mio caso particolare, non funzionava nemmeno con un percorso completo alla DLL, perché era di nuovo dipendente da altre DLL. – Jem

0

In aggiunta il Dependency walker può essere eseguito utilizzando l'opzione profilo. In questo caso, l'exe deve essere caricato nel walker delle dipendenze. Successivamente è possibile utilizzare il menu "Profilo".

L'applicazione viene avviata e l'albero di dll viene riempito. Questo mostrerà anche se manca dll di caricamento e altre cose.

0

Se non si trova una risposta controllando le dipendenze, suggerirei di concentrarsi sui possibili problemi dovuti all'architettura.

Hai menzionato che stai utilizzando un ambiente di prova autonomo, ma quando lo provi in ​​un ambiente normale non funziona. La configurazione della funzione aziendale è in esecuzione nel server?

È passato un po 'di tempo dall'ultima volta che ho lavorato con JDE. Ricordo che una volta scrissi un BSFN in C per chiamare diversi UBE in una sorta di synchonization e funzionava bene sulla mia macchina locale e non funzionava quando stavo testando il server. C'era qualcosa sul server che non riusciva a trovare la DLL (anche se stavo fornendo un percorso) e alcune impostazioni che erano richieste. Inoltre, nel mio caso c'era una differenza che era critica: sulla mia macchina, il BSFN avrebbe atteso il completamento degli UBE e avrebbe catturato lo stato, sul server non lo avrebbe fatto e avrebbe dovuto fare anche con le impostazioni sugli oggetti .

Anche in questo caso, se non trovi nulla di utile, prova a chiedere aiuto su www.jdelist.com.

Problemi correlati