INFO: Interfaccia di Rundll e Rundll32 in Windows

Traduzione articoli Traduzione articoli
Identificativo articolo: 164787 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In Microsoft Windows 95, Windows 98 e Windows Millennium Edition (ME) sono inclusi due programmi di utilitÓ della riga di comando denominati Rundll.exe e Rundll32.exe che consentono di richiamare una funzione esportata da una DLL, a 16 o 32 bit. I programmi Rundll e Rundll32 non consentono tuttavia di chiamare una funzione esportata da qualsiasi DLL. Non Ŕ possibile, ad esempio, utilizzare questi programmi di utilitÓ per le chiamate di Win32 API (Application Programming Interface) esportate dalle DLL di sistema. Consentono solo di chiamare funzioni da una DLL create appositamente per essere chiamate da tali programmi. In questo articolo vengono forniti maggiori dettagli sull'utilizzo dei programmi Rundll e Rundll32 con i sistemi operativi Windows sopra elencati.

In Microsoft Windows NT 4.0, Windows 2000 e Windows XP Ŕ incluso solo Rundll32. Non Ŕ disponibile il supporto per Rundll (l'utilitÓ Win16) per queste piattaforme.

I programmi di utilitÓ Rundll e Rundll32 sono stati progettati in origine solo per l'uso interno di Microsoft. La funzionalitÓ che offrono Ŕ tuttavia abbastanza generica e per questo ora sono disponibili per l'utilizzo comune. Windows NT 4.0 viene fornito solo con il programma di utilitÓ Rundll32 e supporta solo Rundll32.

Informazioni

Rundll e Rundll32

Rundll carica ed esegue DLL a 16 bit, mentre Rundll32 carica ed esegue DLL a 32 bit. Se si passa il tipo di DLL errato a Rundll o Rundll32, potrebbe non essere eseguito senza restituire messaggi di errore.

Riga di comando di Rundll

Di seguito Ŕ riportata la riga di comando di Rundll:
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
Esempio:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
Nella precedente riga di comando Ŕ necessario considerare con attenzione tre problemi:
  1. Rundll o Rundll32 cerca il nome file della DLL specificato nei percorsi standard (vedere la documentazione della funzione LoadLibrary() per ulteriori dettagli). Si consiglia di specificare il percorso completo della DLL per assicurarsi che venga trovata quella corretta. Per ottenere i migliori risultati, utilizzare il nome file breve anzichÚ il nome di file lungo per evitare che vengano visualizzati caratteri non validi. Notare in particolare che il nome di una DLL nella cartella "C:\Programmi" dovrÓ essere convertito nel relativo nome breve.
  2. Il segnaposto <dllname> non pu˛ contenere spazi o virgole o punti interrogativi. Si tratta di una limitazione del parser della riga di comando di Rundll.
  3. Nella precedente riga di comando la virgola (,) tra <dllname> e il nome di funzione <entrypoint> Ŕ estremamente importante. Se il separatore virgola Ŕ mancante, Rundll o Rundll32 non verrÓ eseguito senza restituire errori. Inoltre non possono essere inseriti spazi vuoti tra <dllname>, la virgola e la funzione <entrypoint>.

Funzionamento di Rundll

Rundll esegue la procedura riportata di seguito:
  1. Viene analizzata la riga di comando.
  2. Viene caricata la DLL tramite LoadLibrary().
  3. Viene ottenuto l'indirizzo della funzione <entrypoint> tramite GetProcAddress().
  4. Viene chiamata la funzione <entrypoint> e passata la parte finale della riga di comando corrispondente a <optional arguments>.
  5. Quando la funzione <entrypoint> viene restituita, la DLL viene scaricata e Rundll.exe viene chiuso.

Creazione della DLL

Nella DLL immettere la funzione <entrypoint> con il seguente prototipo:

DLL a 16 bit:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
DLL a 32 bit:
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
Anche in questo caso, Ŕ necessario considerare 3 problemi relativi alla funzione EntryPoint:
  1. Naturalmente, il nome "EntryPoint" dovrÓ essere sostituito con il nome effettivo della funzione del punto di ingresso. Il punto di ingresso di Rundll32 non Ŕ assolutamente correlato alla funzione DllEntryPoint di una DLL a 32 bit che gestisce il processo e le notifiche di connessione/disconnessione dei thread.
  2. La funzione del punto di ingresso per Rundll32 deve essere definita con la convenzione di chiamata _stdcall (CALLBACK passa per impostazione predefinita all'utilizzo dell'attributo _stdcall). Se l'attributo _stdcall Ŕ mancante, la funzione passa per impostazione predefinita alla convenzione di chiamata _cdecl, quindi Rundll32 verrÓ chiuso in modo anomalo dopo la chiamata alla funzione.
  3. PoichÚ Ŕ necessario dichiarare la funzione con la convenzione di chiamata _stdcall come descritto sopra, ne consegue che dal compilatore Visual C++ verrÓ esportata in effetti come _EntryPoint@16 se la DLL Ŕ scritta in C o verrÓ utilizzato un altro nome decorato se la DLL Ŕ scritta in C++. Assicurarsi quindi di utilizzare il nome esportato corretto nella riga di comando di Rundll o Rundll32. Per evitare di utilizzare nomi decorati, utilizzare un file DEF ed esportare la funzione del punto di ingresso mediante il relativo nome. Per ulteriori informazioni sui nomi decorati quando si utilizzano i compilatori Visual C++, fare riferimento alla documentazione del prodotto e all'articolo riportato di seguito (il contenuto potrebbe essere in inglese):
    140485 INFO: Esportazione di simboli di tipo PASCAL in DLL a 32 bit
Di seguito sono elencati i parametri per il punto di ingresso di Rundll:
   hwnd - handle di finestra da utilizzare come finestra proprietaria per
          qualsiasi finestra creata dalla DLL
   hinst - handle dell'istanza della DLL
   lpszCmdLine - riga di comando ASCIIZ che dovrÓ essere analizzata dalla 
                 DLL
   CmdShow - descrive la modalitÓ di visualizzazione delle finestre della 
             DLL
Nel seguente esempio:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
Rundll chiama la funzione del punto di ingresso InstallHinfSection() in Setupx.dll e passa i seguenti parametri:
   hwnd = (handle di finestra padre)
   hinst = HINSTANCE di SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (qualsiasi valore di nCmdShow passato a CreateProcess)
Si noti che la funzione <entrypoint> (o InstallHinfSection() nell'esempio precedente) dovrÓ analizzare la relativa riga di comando (il parametro lpszCmdLine sopra indicato) utilizzando i singoli parametri secondo le esigenze. Rundll.exe effettua l'analisi solo fino agli argomenti facoltativi passati alla relativa riga di comando. Il resto dell'analisi viene eseguito dalla funzione <entrypoint>.

Note speciali sulle differenze tra Windows 95 e Windows NT

In Windows NT, Windows 2000 e Windows XP le funzionalitÓ di Rundll32.exe sono leggermente diverse per adattarsi alle righe di comando UNICODE.

In Windows NT viene prima effettuato il tentativo di chiamare GetProcAddress per <EntryPoint>W. Se il punto di ingresso viene trovato, il prototipo viene considerato come:
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
╚ uguale ad ANSI EntryPoint, a eccezione del fatto che il parametro lpszCmdLine Ŕ una stringa UNICODE.

Se il punto di ingresso <EntryPoint>W non viene trovato, in Windows NT viene chiamato GetProcAddress per <entrypoint>A e per <entrypoint>. Se vengono trovati entrambi, viene considerato un punto di ingresso ANSI e gestito come in Windows 95/98/ME. Se si desidera quindi che la DLL creata venga eseguita in Windows 95 con il supporto ANSI e in Windows NT/2000/XP con il supporto UNICODE, esportare due funzioni: EntryPointW ed EntryPoint. In Windows NT/2000/ME, la funzione EntryPointW verrÓ chiamata con una riga di comando UNICODE, mentre in Windows 95/98/ME, la funzione EntryPoint verrÓ chiamata con una riga di comando ANSI.

Riferimenti

Per un esempio della sintassi di Rundll, fare riferimento al seguente articolo per informazioni su come avviare un'applet del Pannello di controllo in Windows 95 tramite l'utilitÓ della riga di comando Rundll (il contenuto potrebbe essere in inglese):
135068 HOWTO: Avviare un'applet del Pannello di controllo in Windows 95 o versione successiva

ProprietÓ

Identificativo articolo: 164787 - Ultima modifica: venerdý 1 ottobre 2004 - Revisione: 2.3
Le informazioni in questo articolo si applicano a
  • Microsoft Win32 Application Programming Interfaceáalle seguenti piattaforme
    • Microsoft Windows Millennium Edition
    • Microsoft Windows 98 Second Edition
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows NT Workstation 4.0 Developer Edition
    • Microsoft Windows NT Server 4.0, Terminal Server Edition
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows XP Tablet PC Edition
    • Microsoft Windows XP Professional
    • Microsoft Windows XP Media Center Edition
    • Microsoft Windows XP Home Edition
    • Microsoft Windows 2000 Advanced Server
    • Microsoft Windows 2000 Datacenter Server
    • Microsoft Windows 2000 Professional Edition
    • Microsoft Windows 2000 Server
Chiavi:á
kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787
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.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com