PRB: Ejecutar un proceso de 16 bits con una línea de comandos grandes en Windows NT, 2000 y XP

Seleccione idioma Seleccione idioma
Id. de artículo: 198429 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza CreateProcess(), ShellExecute() o ShellExecuteEx() iniciar un ejecutable de 16 bits en Microsoft Windows NT, Microsoft Windows 2000 y la ruta de acceso del archivo de Microsoft Windows XP está limitado a 128 caracteres y los argumentos de línea de comandos están limitados a 130 caracteres menos la longitud del nombre del archivo ejecutable.

Causa

Limitación de longitud de ruta de acceso

La ruta de acceso completa del ejecutable (la ruta de acceso y nombre, excluyendo los parámetros de línea de comandos) está sujeto a un límite de 128 caracteres. Se impone esta limitación, incluso cuando se utiliza una ruta relativa más pequeña para ejecutar la aplicación de 16 bits, porque el sistema debe expandir el nombre de archivo a una ruta completa antes de transferirlo en el subsistema Windows On Windows (WOW).

Este comportamiento proviene de un límite codificado de forma rígida en el bloque de prefijo de segmento de programa de MS-DOS (PSP). Puesto que Windows de 16 bits se ejecuta en la parte superior de MS-DOS, está sujeta a este límite. El subsistema WOW se escribió para emular Windows de 16 bits tan fielmente como sea posible. Por tanto, WOW debe exigir todos los límites de 16 bits; no ofrece ninguna funcionalidad agregada, ya sería permiten programas de 16 bits escribirse para NT que no ejecutan en los sistemas operativos de Windows de 16 bits originales.

Solución

Para evitar este problema, puede utilizar el comando de MS-DOS "subst" para asociar una ruta de acceso a una letra de unidad. Para la sintaxis de este comando, escriba SUBST /? desde un símbolo del sistema. Para lograr esto mediante programación, puede utilizar la API DefineDosDevice().

También puede evitar el problema asignando una letra de unidad a un directorio compartido profundidad dentro de la ruta de acceso. Esto tiene una sobrecarga mayor porque el acceso a archivos en el recurso compartido debe pasar por el redirector de red. Para lograr esto mediante programación, puede utilizar la API WNetAddConnection2().

Estado

Este comportamiento es por diseño.

Más información

Limitación de longitud de los argumentos de línea de comandos

En además el límite de ruta de acceso del archivo de 128 caracteres, hay un límite en la longitud combinada de los argumentos la línea de comandos que se puede pasar a la aplicación de 16 bits. Este límite es de 130 caracteres, menos la longitud del nombre de archivo ejecutable (sin incluir la ruta de acceso).

Por ejemplo, cuando ejecuta un programa de 16 bits "c:\go.exe", la longitud de los argumentos de línea de comandos sería limitada a 124 caracteres, porque "go.exe" tiene una longitud de 6 caracteres. Está sujetos a esta limitación de 124 caracteres incluso si se intenta ejecutar "Ir" (dejando fuera la extensión ".exe") porque el sistema expande el nombre de archivo.

Si superas cualquiera de estos límites, ya sea la limitación de la longitud de ruta de acceso del archivo o la limitación de la longitud de argumentos de línea de comandos, no puede iniciar el programa de 16 bits. Este error presenta en distintos formularios, dependiendo de la función se utiliza para iniciar la aplicación:

Error con CreateProcess()

Si supera el límite de ruta de acceso del archivo, se producirán un error de protección general en el subsistema WOW. Esto hace que el sistema presentar los siguientes cuadros de dos mensaje simultáneamente:
No se puede ejecutar el programa de Windows de 16 bits
<filename>No se puede encontrar el archivo <nombredearchivo> (o uno de sus componentes). Asegúrese de que el nombre de archivo y la ruta de acceso son correctos y que todas las bibliotecas requeridas están disponibles.
Error de la aplicación
WOWEXEC provocó un error de protección general en el módulo WOWEXEC.EXE en 0001:066E. Elija Cerrar. WOWEXEC se cerrará.
Si supera el límite de longitud del argumento, CreateProcess() devolverá FALSE y GetLastError() devolverá el código de error 87 (ERROR_INVALID_PARAMETER).

Error con ShellExecute()

Si superan el límite de ruta de acceso del archivo o el límite de longitud del argumento, ShellExecute() devolverá el código de error 5 (SE_ERR_ACCESSDENIED).

Error con ShellExecuteEx()

Si se superan el límite de ruta de acceso del archivo o el límite de longitud del argumento, ShellExecuteEx() devolverá FALSE y GetLastError() devolverá el código de error 5 (ERROR_ACCESS_DENIED). El miembro hInstApp de la estructura SHELLEXECUTEINFO pasada a ShellExecuteEx() también contendrá el código de error 5.

De forma predeterminada, cuando falla ShellExecuteEx() de esta manera, el sistema presentará un cuadro de mensaje con el mensaje de error siguientes:
Se ha denegado el acceso al dispositivo, a la ruta de acceso o al archivo especificado.
Puede evitar que este cuadro de mensaje incluyendo la marca SEE_MASK_FLAG_NO_UI en el miembro fMask de la estructura SHELLEXECUTEINFO pasada a ShellExecuteEx().

Referencias

Para obtener más información sobre el uso CreateProcess() para iniciar programas de 16 bits, consulte el siguiente artículo de Knowledge Base:
175986INFORMACIÓN: Descripción CreateProcess y argumentos de línea de comandos

Propiedades

Id. de artículo: 198429 - Última revisión: domingo, 23 de febrero de 2014 - Versión: 4.1
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Palabras clave: 
kbnosurvey kbarchive kbmt kb16bitonly kbapi kbkernbase kbprb KB198429 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 198429

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