Quando si utilizza l'operatore New o CreateObject in Microsoft Visual Basic per creare un'istanza di
un'applicazione di Microsoft Office, potrebbe essere visualizzato un messaggio
di errore analogo al seguente:
Errore di runtime "'429":
il componente ActiveX non può creare l'oggetto
Questo errore si
verifica quando l'oggetto di automazione richiesto non può essere creato da COM
e non è pertanto disponibile in Visual Basic. L'errore viene in genere rilevato
solo su alcuni computer.
In questo articolo vengono forniti alcuni
suggerimenti per la rilevazione e la risoluzione di problemi comuni noti come
causa dell'errore.
A differenza di alcuni errori generati in Visual Basic, non
vi è una causa specifica dell'errore 429. Il problema si verifica a causa di un
errore di configurazione dell'applicazione o del sistema o di un componente
mancante o danneggiato. Per individuarne l'esatta causa è necessario procedere
per esclusione, analizzando le varie possibilità. Se l'errore viene rilevato in
un computer client, numerosi sono gli elementi da verificare per individuare e
risolvere il problema.
Gli elementi illustrati più avanti forniscono
alcuni suggerimenti pratici per la risoluzione di questo errore durante
l'utilizzo di applicazioni di Office. Per quanto alcune di queste informazioni
potrebbero essere applicate anche a server COM non di Office, tuttavia in
questo articolo si presume che l'utente stia tentando di automatizzare
Microsoft Office.
Il primo elemento da verificare in questi casi è il codice. Prima
di iniziare a risolvere l'errore, è necessario conoscere il punto in cui
l'errore si verifica. Tentare di restringere tale ricerca a una singola riga di
codice.
Quando si è individuato il codice contenente l'errore,
provare a effettuare le seguenti operazioni:
Verificare che nel codice sia utilizzata la creazione
esplicita degli oggetti. Qualsiasi tipo di problema è più semplice da
individuare se lo si riconduce a una singola azione. Ad esempio, pratiche come
le seguenti sono sconsigliate:
Application.Documents.Add 'DON'T USE THIS!!
Oppure
Dim oWordApp As New Word.Application 'DON'T USE THIS!!
'... some other code
oWordApp.Documents.Add
Entrambi questi metodi utilizzano la creazione implicita degli oggetti.
L?avvio di Microsoft Word non avviene finché la variabile non viene chiamata
almeno una volta. Poiché la variabile può essere chiamata in varie parti del
programma, potrebbe essere difficoltoso individuare il problema. Inoltre, non è
chiaro se il problema riguarda la creazione dell'oggetto Application o quella
dell'oggetto Document.
Effettuare invece chiamate esplicite per
creare ciascun oggetto distintamente:
Dim oWordApp As Word.Application
Dim oDoc As Word.Document
Set oWordApp = CreateObject("Word.Application")
'... some other code
Set oDoc = oWordApp.Documents.Add
In questo modo il problema sarà più facilmente individuabile e il
codice più leggibile.
Quando si crea un'istanza di un'applicazione di Microsoft
Office, utilizzare CreateObject anziché New. CreateObject è maggiormente conforme al processo di creazione utilizzato dalla
maggior parte dei client Visual C++ e consente l'eventuale cambiamento dei
CLSID del server CLSID tra una versione e l'altra. CreateObject può essere utilizzato sia con oggetti ad associazione anticipata
sia con oggetti ad associazione tardiva.
Verificare che la stringa ProgID passata a CreateObject sia corretta e indipendente dalla versione (ad esempio,
utilizzare "Excel.Application" anziché "Excel.Application.8"). Nel sistema in
cui si verifica l'errore potrebbe essere installata una versione di Microsoft
Office precedente o più recente di quella specificata in ProgID.
Per facilitare il debug di applicazioni che non possono
essere eseguite nell'IDE, utilizzare il comando Erl per la segnalazione del numero della riga in cui si verifica
l'errore. Mediante il seguente codice, ad esempio, si otterrà la segnalazione
dell'oggetto di automazione che non può essere creato in Word o in Excel:
Dim oWord As Word.Application
Dim oExcel As Excel.Application
On Error Goto err_handler
1: Set oWord = CreateObject("Word.Application")
2: Set oExcel = CreateObject("Excel.Application")
' ... some other code
err_handler:
MsgBox "The code failed at line " & Erl, vbCritical
Utilizzare una combinazione di finestre di messaggio e di numeri di
riga per tenere traccia dell'errore.
Provare a utilizzare l'associazione tardiva (ossia, Dim
oWordApp As Object). Gli oggetti ad associazione anticipata richiedono infatti
l'utilizzo delle relative interfacce personalizzate per poter essere sottoposti
a marshalling tra processi diversi. Se si verifica un problema di marshalling
di un'interfaccia personalizzata durante l'esecuzione di CreateObject o New, verrà generato un errore 429. Un oggetto ad associazione tardiva
utilizza un'interfaccia definita dal sistema (IDispatch) per il cui marshalling
non è necessario in un proxy personalizzato. Provare a utilizzare un oggetto ad
associazione tardiva e verificare se si ottengono cambiamenti
significativi.
Se il problema si verifica solo quando l'oggetto è
associato anticipatamente, la causa sarà nell'applicazione server e in genere
il problema potrà essere corretto reinstallando l'applicazione (vedere più
avanti in questo articolo).
Se si sta eseguendo l'automazione da ASP o da un componente
MTS, utilizzare CreateObject anziché Server.CreateObject(). Utilizzando Server.CreateObject verrà creata un'istanza dell'applicazione di Office con
l'identità di un pacchetto MTS che è la causa nota dei problemi riscontrati in
Microsoft Office.
Le cause più comuni di un errore di esecuzione di CreateObject o New sono problemi relativi alla stessa applicazione server. In
genere, questi problemi riguardano la configurazione o l'installazione
dell'applicazione. Di seguito sono illustrati alcuni degli elementi da
verificare:
Verificare che l'applicazione di Microsoft Office che si
intende automatizzare sia installata nel computer locale e che sia possibile
avviarla scegliendo Esegui dopo aver fatto clic sul pulsante Start. Se il
programma non può essere avviato manualmente, non sarà in grado di funzionare
in automazione.
Eseguire una nuova registrazione dell'applicazione
digitando il percorso del server nella finestra di dialogo Esegui visualizzata
scegliendo Esegui dopo aver fatto clic sul pulsante Start, quindi inserire /RegServer alla fine della riga. Scegliere OK. Questo metodo dovrebbe eseguire l'applicazione in modo
invisibile all'utente e rieseguirne la registrazione come server COM. Se il
problema riguarda una chiave del Registro di sistema mancante, in genere il
metodo indicato dovrebbe risolverlo.
Controllare la chiave del Registro di sistema LocalServer32
sotto il CLSID dell'applicazione che si intende automatizzare, verificando che
il percorso dell'applicazione sia specificato in modo corretto e in formato
breve (DOS 8.3). Anche se non è necessario che un server sia registrato
utilizzando un nome di percorso breve, è noto che i nomi lunghi di percorso
contenenti spazi causano problemi su alcuni sistemi (vedere più avanti in
questo articolo).
Per verificare la chiave del percorso memorizzata
per il server, avviare l'editor del Registro di sistema scegliendo Esegui dopo
aver fatto clic sul pulsante Start e digitando regedit
nella finestra di dialogo Esegui. Selezionare la chiave del Registro di sistema
HKEY_CLASSES_ROOT\Clsid. In corrispondenza di questa chiave del Registro di
sistema sono specificati i CLSID dei server di automazione registrati nel
sistema. Facendo riferimento ai valori indicati più avanti, individuare la
chiave del Registro di sistema che rappresenta l'applicazione di Office che si
intende automatizzare e verificare la relativa chiave del Registro di sistema
LocalServer32 per il percorso.
+========================+=========================================+
| Server di office | Chiave del Registro di sistema CLSID |
+========================+=========================================+
| Access.Application | {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9} |
+------------------------+-----------------------------------------+
| Excel.Application | {00024500-0000-0000-C000-000000000046} |
+------------------------+-----------------------------------------+
| FrontPage.Application | {04DF1015-7007-11D1-83BC-006097ABE675} |
+------------------------+-----------------------------------------+
| Outlook.Application | {0006F03A-0000-0000-C000-000000000046} |
+------------------------+-----------------------------------------+
| PowerPoint.Application | {91493441-5A91-11CF-8700-00AA0060263B} |
+------------------------+-----------------------------------------+
| Word.Application | {000209FF-0000-0000-C000-000000000046} |
+------------------------+-----------------------------------------+
Verificare che il percorso corrisponda alla posizione reale del
file. Con i nomi di percorso brevi, infatti, si può avere l'impressione che il
percorso sia corretto anche quando non lo è. Ad esempio, per Microsoft Office e
Microsoft Internet Explorer, se installati nei percorsi predefiniti, sarà
specificato un percorso analogo a "C:\PROGRA~1\MICROS~X\", dove X è un numero.
Non è immediatamente evidente che il nome del percorso specificato è in formato
breve.
È possibile verificare la correttezza del percorso copiando il
valore dal Registro di sistema e incollandolo nella finestra di dialogo Esegui,
visualizzata scegliendo Esegui dopo aver fatto clic sul pulsante Start. Prima
di eseguire l'applicazione, rimuovere l'opzione /Automation. Verificare se l'applicazione si avvia quando si sceglie OK. Se si avvia, significa che il server è registrato correttamente.
In caso contrario, sostituire il valore della chiave del Registro di sistema
LocalServer32 con il percorso corretto, utilizzando, se possibile, un nome di
percorso breve.
Problemi sono stati riscontrati durante l'automazione di
Word o di Excel quando il modello Normal.dot di Word o il file di risorse
Excel.xlb di Excel sono danneggiati. Per verificare se i file sono danneggiati,
cercare tutte le istanze di Normal.dot o *.xlb all'interno dei dischi rigidi
locali. Se si esegue Windows 2000, Windows NT o Windows 95/98 con i profili
abilitati, potranno trovarsi più copie di questi file, una per ogni profilo
utente presente nel sistema. Rinominare temporaneamente i file Normal.dot o
*.xlb e riavviare il test di automazione. I file verranno ricreati
automaticamente qualora non vengano trovati. Verificare che il codice funzioni.
Se funziona, i file rinominati dovranno essere eliminati perché sono
danneggiati. Se il codice non funziona, ripristinare il nome originale dei file
in modo che le impostazioni personalizzate salvate nei file non vadano
perdute.
Se si utilizza un sistema Windows NT, Windows 2000, Windows
XP o Windows Server 2003, eseguire l'applicazione accedendo con l'account
Administrator. I server di Office devono disporre dell'accesso in
lettura/scrittura al Registro di sistema e all'unità disco e potrebbero non
essere caricati correttamente qualora le impostazioni di protezione correnti
negassero questo privilegio.
La configurazione del sistema può causare problemi anche durante
la creazione di server COM out-of-process. Di seguito sono illustrati alcuni
degli elementi di sistema da controllare quando si verifica l'errore:
Controllare se il problema si verifica con ogni server
out-of-process. Se un'applicazione, ad esempio Word, utilizza esclusivamente
uno specifico server COM, eseguire una prova su un server out-of-process
differente per assicurarsi che il problema non riguardi espressamente il
livello COM. Se nel sistema non è possibile creare altri server COM
out-of-process, per risolvere il problema sarà necessario provvedere a una
reinstallazione dei file di sistema OLE (vedere di seguito) o dell'intero
sistema operativo.
Verificare i numeri di versione dei file di sistema OLE che
gestiscono l'automazione. Questi file vengono in genere installati come insieme
e devono avere numeri di build corrispondenti. Un'utilità di installazione
configurata in modo improprio potrebbe erroneamente installare i file
separatamente, provocando errori di mancata corrispondenza. Per evitare
problemi di automazione, verificare che i numeri di build dei file
corrispondano.
I file di automazione si trovano nella directory
Windows\System o Winnt\System32. Di seguito è fornito l'elenco dei file da
verificare:
+---------------+-------------+----------------+
| Nome file | Versione | Data modifica |
+---------------+-------------+----------------+
| Asycfilt.dll | 2.40.4275 | 8 marzo 1999 |
| Oleaut32.dll | 2.40.4275 | 8 marzo 1999 |
| Olepro32.dll | 5.0.4275 | 8 marzo 1999 |
| Stdole2.tlb | 2.40.4275 | 8 marzo 1999 |
+---------------+-------------+----------------+
Verificare la versione del file facendo clic con il pulsante
destro del mouse sul file in Esplora risorse e scegliendo Proprietà dal menu di
scelta rapida. I valori più importanti sono le ultime quattro cifre della
versione del file, ossia il numero di build, e la data dell'ultima modifica.
Verificare che i valori siano uguali per tutti i file di automazione.
Si noti che i numeri di versione e le date di modifica indicate sono forniti a
solo scopo esemplificativo. I valori reali possono essere differenti.
Verificare che vi sia corrispondenza tra i valori reali, non tra quelli reali e
i valori elencati in tabella.
Se i numeri di versione e le date di
modifica dei file non corrispondono, è possibile scaricare un'utilità
autoestraente che aggiornerà i file di automazione.
Per ulteriori informazioni, fare
clic sul numero dell'articolo della Microsoft Knowledge Base riportato di
seguito:
290887
(http://support.microsoft.com/kb/290887/
)
VBRun60sp6.exe installa i file di runtime di Visual Basic 6.0 SP6
In Windows NT 4.0 è stato riscontrato un problema durante
l'avvio dei server di automazione presenti in una cartella il cui nome contiene
uno spazio e/o gli stessi 8 caratteri iniziali del nome di un'altra cartella.
Ad esempio, un server presente in C:\Programmi\Cartella potrebbe non avviarsi
durante una chiamata a CreateObject se nel sistema esiste un'altra cartella
denominata C:\Altri programmi\Cartella. Per ulteriori informazioni, vedere il
seguente articolo della Microsoft Knowledge Base:Per ulteriori informazioni su questo
problema e sulle procedure di risoluzione, fare clic sul numero dell'articolo
della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe
essere in inglese):
185126
(http://support.microsoft.com/kb/185126/
)
BUG: Impossibile avviare il server COM/OLE in Windows NT 4.0
Se nessuna delle procedure precedenti consente di risolvere il
problema, provare a disinstallare Microsoft Office e a reinstallarlo
nuovamente. Microsoft consiglia di disinstallare la versione esistente prima di
procedere a una nuova installazione dai dischi di installazione
originali.
Per un elenco completo degli elementi di programma da
rimuovere, vedere i seguenti articoli della Microsoft Knowledge Base:
219423
(http://support.microsoft.com/kb/219423/
)
OFF2000: Rimozione completa del CD1 di Microsoft Office
158658
(http://support.microsoft.com/kb/158658/
)
OFF97: Rimozione completa di Microsoft Office 97
Per ulteriori informazioni sulla
risoluzione del messaggio di errore 429, fare clic sul numero dell'articolo
della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe
essere in inglese):
Per informazioni aggiornate ed esempi di codice
relativi all'automazione di Microsoft Office, visitare il seguente sito Web del
Servizio Supporto Tecnico Clienti Microsoft (informazioni in lingua inglese):
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.