2012-03-26 57 views
19

Abbiamo un progetto che viene compilato in una DLL COM a 32 bit e in una DLL COM a 64 bit (la stessa da my earlier question). Quando registro entrambi sul mio computer con Windows 7, entrambi registrano correttamente. Quando registro entrambi su un computer Windows Server 2003, entrambi registrano correttamente.DLL a 32 bit "potrebbe non essere compatibile" su Server 2008, ma funziona su Server 2003

Ma quando provo a registrare le DLL su un computer Windows Server 2008 R2 macchina standard SP1, la DLL a 64 bit registra con successo, ma la DLL a 32 bit riesce con il messaggio (sic):

Il modulo ""% 1 "" potrebbe non essere compatibile con la versione di Windows in esecuzione. Verificare se il modulo è compatibile con una versione x86 (32 bit) o ​​x64 (64 bit) di regsvr32.exe.

Non penso che una DLL a 32 bit possa essere compatibile con WS2003 e Win7 ma non con WS2008. Non ha senso.

Cosa potrebbe succedere?

+1

Questa potrebbe essere una domanda stupida, ma se si dispone di una versione sia a 32 bit che a 64 bit dell'assembly, perché si sta tentando di registrare la versione a 32 bit su un sistema operativo a 64 bit? – NotMe

+5

Questa potrebbe essere una domanda più sciocca, ma perché c'è un errore grammaticale all'interno del messaggio di errore? Questo dovrebbe suggerire qualche situazione FU a portata di mano? – arsaKasra

+2

Per rispondere alla prima domanda stupida: garanzia della qualità. Poiché le DLL a 32 bit sono supportate da Windows a 64 bit, dobbiamo assicurarci che la nostra DLL a 32 bit funzioni in quella situazione. –

risposta

13

La versione di Regsvr32.exe deve corrispondere a quella del 32-/64-bitness della DLL che si sta tentando di registrare. Il regsvr32 a 64 bit non può caricare una dll a 32 bit e viceversa.

Potrebbe essere necessario chiamare esplicitamente la versione a 32 bit di regsrv32 situata in% systemroot% \ SysWoW64 \ regsvr32.exe.

Da http://support.microsoft.com/kb/249873

Regsvr32.exe è incluso in Microsoft Internet Explorer 3.0 o versioni successive, Windows 95 OEM Service Release 2 (OSR2) o versioni successive, e Windows NT 4.0 Service Pack 5 (SP5) o versioni successive . Regsvr32.exe è installato nella cartella Sistema (Windows Me/Windows 98/Windows 95) o System32 (Windows NT/Windows XP/Windows Vista/Windows 7).

Nota Su una versione a 64 bit di un sistema operativo Windows, ci sono due versioni del file Regsv32.exe:

  • La versione a 64-bit è% SystemRoot% \ System32 \ regsvr32.exe.
  • La versione a 32 bit è% systemroot% \ SysWoW64 \ regsvr32.exe.

Regsvr32.exe utilizzo RegSvr32.exe ha le seguenti opzioni della riga di comando: Regsvr32 [/ u] [/ n] [/ i [: cmdline]] dllname

/u - Annulla la registrazione del server /i - Chiama DllInstall passandogli una [cmdline] facoltativa; se utilizzato con/u chiama dll uninstall /n - non chiamare DllRegisterServer; questa opzione deve essere utilizzata con/i /s - Silent; visualizza nessuna finestra di messaggio (aggiunta con Windows XP e Windows Vista) Quando si utilizza Regsvr32.exe, tenta di caricare il componente e chiamare la sua funzione DLLSelfRegister. Se questo tentativo ha esito positivo, Regsvr32.exe visualizza una finestra di dialogo che indica il successo. Se il tentativo non riesce, Regsvr32.exe restituisce un messaggio di errore. Questo può includere un codice di errore Win32.Per ulteriori informazioni, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base: 193625 Codici di errore WinInet (da 12001 a 12156)

+2

La versione a 64 bit di regsvr32 può delegare alla versione a 32 bit per (annullare) la registrazione di DLL a 32 bit e viceversa. Quel che è più probabile è che WOW64 non è installato affatto. A partire da Windows Server 2008 R2, WOW64 è ora un componente opzionale. –

+1

Buono a sapersi, grazie! :) – nullforce

+3

Abbiamo già provato a utilizzare SysWOW64 \ regsvr32 per registrare la DLL a 32 bit e che riporta lo stesso errore. –

2

L'ho registrato spostando la DLL in c: \ windows \ syswow64 \ directory (che non avrebbe funzionato nella directory system32) e quindi chiamando esplicitamente syswow64 \ regsvr32, per esempio

c: \ windows \ syswow64 \ regsvr32 yourdll.dll

btw che non avrebbe funzionato al momento della chiamata c: \ windows \ syswow64 \ regsvr32 c: \ windows \ syswow64 \ yourdll.dll

6

Questo non è probabile che b e il problema nel tuo caso, ma potrebbe essere utile per gli altri che trovano questa domanda cercando sullo stesso messaggio di errore:

Ho avuto un problema simile: una DLL che non si registrava con il 32-bit o 64 versione bit di RegSvr32. Ho caricato la DLL su Dependency Walker (depends.exe, http://www.dependencywalker.com/) e ho ricevuto un messaggio molto più utile:

Errore: Almeno un file non era un modulo Windows a 32 o 64 bit.

Scansione della colonna della CPU nell'elenco modulo identificato il modulo in questione. (Nel mio caso, si dice "Nessuna firma DOS o PE trovata.")

Morale: il Dependency Walker potrebbe darti un messaggio di errore più utile di RegSvr32.exe.

+0

Questo ha mostrato la fonte del problema per me. Il mio percorso era tale che veniva caricata una DLL a 64 bit anziché la versione a 32 bit. – Armbie

1

Ho lo stesso problema, ma ho risolvere con comandi

CD \ windows \ syswow64 regsvr32 c: \ filename. dll

0

Utilizzare Process Monitor da SysInternals.

1. Filtra per "Nome processo" = regsvr32.exe. Filter

2. Prova a registrare la tua DLL dalla versione corretta di regsvr32.exe (la versione a 32 bit si trova nella cartella SysWow64)

3. Il monitor di processo traccerà TUTTO ciò che accade sul tuo computer.

4. Innanzitutto avviare l'analisi eliminando gli eventi del registro (per ora) enter image description here

5. Potresti riuscire a vedere la dll della strega trovata e non trovata.

Qui un (molto) Schermata parziale regsvr32.exe di Threed32.ocx cui possiamo vedere alcune delle dll richiesto enter image description here

6. Il tuo lavoro è appena iniziato. Da adesso.

1

L'esecuzione del prompt dei comandi come amministratore ha risolto il problema.

Problemi correlati