INFO: Interfaz de Rundll y Rundll32 en Windows

Seleccione idioma Seleccione idioma
Id. de artículo: 164787 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Microsoft Windows 95, Windows 98 y Windows Millennium Edition (Me) contienen dos herramientas de línea de comandos, denominadas Rundll.exe y Rundll32.exe, que permiten invocar una función exportada de una DLL de 16 o de 32 bits. Sin embargo, los programas Rundll y Rundll32 no permiten llamar a cualquier función exportada de cualquier DLL. Por ejemplo, no puede utilizar estos programas para llamar a las funciones Win32 (Interfaz de programación de aplicaciones) exportadas de los archivos DLL del sistema. Los programas sólo le permiten llamar a funciones de un archivo DLL escritas expresamente con ese fin. En este artículo se proporcionan más detalles sobre el uso de los programas Rundll y Rundll32 con los sistemas operativos Windows enumerados anteriormente.

Microsoft Windows NT 4.0, Windows 2000 y Windows XP sólo incluyen Rundll32. No hay soporte técnico para Rundll (la utilidad Win16) en estas plataformas.

Rundll y Rundll32 se diseñaron originalmente sólo para uso interno en Microsoft. Sin embargo, las funciones que proporcionan son suficientemente genéricas como para que estén ahora disponibles para el uso general. Tenga en cuenta que Windows NT 4.0 sólo incluye el programa Rundll32 y que sólo es compatible con Rundll32.

Más información

Rundll frente a Rundll32

Rundll carga y ejecuta archivos DLL de 16 bits, mientras que Rundll32 carga y ejecuta archivos DLL de 32 bits. Si pasa un tipo de DLL incorrecto a Rundll o Rundll32, es posible que no se ejecute sin mostrar ningún mensaje de error.

Línea de comandos de Rundll

La línea de comandos de Rundll es como sigue:
   RUNDLL.EXE <dllname>,<entrypoint> <argumentos opcionales>
				
A continuación puede ver un ejemplo:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Hay tres cuestiones que se deben considerar con cuidado en la línea de comandos anterior:
  1. Rundll o Rundll32 buscan el nombre de archivo DLL proporcionado en los lugares estándar (consulte la documentación de la función LoadLibrary () para obtener más detalles). Se recomienda incluir una ruta de acceso completa al archivo DLL para garantizar que se encontrará la correcta. Para obtener los mejores resultados, utilice el nombre corto de archivo en lugar del nombre largo para garantizar que no aparecerá ningún carácter ilegal. En especial, tenga en cuenta que tendrá que convertir a su forma corta los nombres de los archivos DLL que se encuentren en en la carpeta "C:\Archivos de programa".
  2. El valor <dllname> no puede contener espacios, comas ni comillas. Se trata de una limitación en el analizador de línea de comandos de Rundll.
  3. En la línea de comandos anterior, la coma (,) entre <dllname> y el nombre de la función <entrypoint> es sumamente importante. Si falta la coma, se producirá un error en Rundll o en Rundll32 sin que aparezca ningún error. Además, no puede haber ningún espacio en blanco entre <dllname>, la coma y la función <entrypoint>.

Cómo funciona Rundll

Rundll realiza los pasos siguientes:
  1. Analiza la línea de comandos.
  2. Carga la DLL especificada mediante LoadLibrary().
  3. Obtiene la dirección de la función <entrypoint> mediante GetProcAddress().
  4. Llama a la función <entrypoint>, pasando el final de la línea de comandos, que incluye los <argumentos opcionales>.
  5. Cuando vuelve la función <entrypoint>, Rundll.exe descarga el archivo DLL y termina.

Cómo escribir su DLL

En el archivo DLL, escriba la función <entrypoint> con el prototipo siguiente:

DLL de 16 bits:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
32-bit DLL:
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
De nuevo, hay tres cuestiones que considerar con la función EntryPoint:
  1. Obviamente, el nombre "EntryPoint" debe reemplazarse con el nombre real del punto de entrada de su función. Tenga en cuenta que el punto de entrada de Rundll32 no guarda ninguna relación con la función DllEntryPoint de un archivo DLL de 32 bits que controla notificaciones de asociación y desasociación de procesos y subprocesos.
  2. La función de punto de entrada para Rundll32 debe definirse con la convención de llamada _stdcall (CALLBACK utiliza el atributo _stdcall de forma predeterminada). Si falta el atributo _stdcall, la función utiliza de forma predeterminada la convención de llamada _cdecl y, a continuación, Rundll32 finaliza después de llamar a la función.
  3. Puesto que debe declarar la función con la convención de llamada _stdcall, como se describe anteriormente, el compilador de Visual C++ la exportará realmente como _EntryPoint@16 si el archivo DLL fue escrito en C o utilizará un nombre representativo si el archivo DLL fue escrito en C++. Por tanto, asegúrese de utilizar el nombre exportado correctamente en la línea de comandos de Rundll o Rundll32. Si desea evitar utilizar los nombres representativos, utilice un archivo .def y exporte la función de punto de entrada por su nombre. Consulte la documentación del producto y el artículo siguiente para obtener más información sobre los nombres representativos utilizados en los compiladores de Visual C++:
    140485 Exportar símbolos PASCAL-Like en DLLs de 32 bits
Los parámetros para el punto de entrada de Rundll son los siguientes:
   hwnd - identificador de ventana para el que debe usarse como ventana propietaria
          para todas las ventanas creadas por el archivo DLL
   hinst - el controlador de instancia de su DLL
   lpszCmdLine - línea de comandos de ASCIIZ que debe analizar el archivo DLL
   nCmdShow - describe cómo deben mostrarse las ventanas del archivo DLL
				
En el ejemplo siguiente:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Rundll llama al punto de entrada InstallHinfSection() en Setupx.dll y le pasa los siguientes parámetros:
   hwnd = (identificador de la ventana primaria)
   hinst = HINSTANCE de SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (el valor de nCmdShow pasado a CreateProcess)
				
Observe que la función <entrypoint> (o la sección InstallHinfSection() en el ejemplo anterior) tiene que analizar su propia línea de comandos (el parámetro lpszCmdLine indicado anteriormente) y utilizar los parámetros individuales según sea necesario. Rundll.exe sólo analiza hasta los argumentos opcionales pasados a su línea de comandos. El resto del análisis lo realiza la función <entrypoint>.

Notas especiales sobre las diferencias entre Windows 95 y Windows NT

En Windows NT, Windows 2000 y Windows XP el comportamiento de Rundll32.exe es ligeramente diferente para poder utilizar líneas de comandos UNICODE.

Windows NT intenta primero ejecutar GetProcAddress para <EntryPoint>W. Si se encuentra este punto de entrada, se supone que el prototipo es:
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Es igual que ANSI EntryPoint, pero el parámetro lpszCmdLine es ahora una cadena UNICODE.

Si el punto de entrada de <EntryPoint>W no se encuentra, a continuación, Windows NT llamará a GetProcAddress con <entrypoint>A y <entrypoint>. Si se encuentra cualquiera de ellos, se considera un punto de entrada de ANSI y se trata de la misma manera que en Windows 95, Windows 98 o Windows Millennium Edition. Por tanto, si desea que su DLL se ejecute en Windows 95 con compatibilidad ANSI y en Windows NT, Windows 2000 y Windows XP con compatibilidad UNICODE, debe exportar dos funciones: EntryPointW y EntryPoint. En Windows NT, Windows 2000 y Windows Millennium Edition, la llamada a función EntryPointW se realizará con una línea de comandos UNICODE; en Windows 95, Windows 98 y Windows Millennium Edition, la llamada a la función EntryPoint se realizará con una línea de comandos ANSI.

Referencias

Para ver un ejemplo de la utilización de Rundll, consulte el artículo siguiente sobre cómo ejecutar un subprograma del Panel de control en Windows 95, que utiliza la utilidad de línea de comandos Rundll:
135068 CÓMO: Iniciar un subprograma del Panel de control en Windows 95, Windows 98 o Windows NT

Propiedades

Id. de artículo: 164787 - Última revisión: martes, 18 de octubre de 2005 - Versión: 4.2
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows 2000 Standard Edition
    • Microsoft Windows XP Professional
Palabras clave: 
kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787

Enviar comentarios

 

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