Al momento sei offline in attesa che la connessione Internet venga ristabilita

INFO: Interfaccia di Rundll e Rundll32 in Windows

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):
    140485INFO: 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):
135068HOWTO: Avviare un'applet del Pannello di controllo in Windows 95 o versione successiva
win95 tools
Proprietà

ID articolo: 164787 - Ultima revisione: 10/01/2004 20:00:00 - Revisione: 2.3

Microsoft Win32 Application Programming Interface

  • kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787
Feedback