Cómo permitir aplicaciones de 32 bits en 64 bits de Windows para ejecutar aplicaciones de 64 bits proporcionados en Windows \ System32

StackOverflow https://stackoverflow.com/questions/509989

Pregunta

Digamos que tienes una aplicación, que desea proporcionar a los usuarios la capacidad de navegar por el directorio system32 y ejecutar programas en (como Telnet).

¿Cuál es el mejor método para el apoyo a esta cuando se necesita para apoyar XP en adelante como cliente y servidor para 2k en adelante?

haber escrito todo esto me pregunto si es sólo demasiado tiempo / esfuerzo en proporcionar un navegar a ello, en los que sólo se podían copiar desde el explorador. Aún requiere de capacidad de lanzar.

He encontrado algunos debates sobre -Nynaeve .

Hasta ahora parece que hay las siguientes opciones

  1. Crear una carpeta sysnative en las ventanas que permitirán a navegar / ejecución de 64 bits. Temas son:
    • sólo está disponible en Vista / Longhorn, por lo que no hay soporte para XP 64
    • conduce a diferente denominación camino, no puede utilizar mismo camino en múltiples versiones.
    • estará activo durante toda la ventanas, no sólo nuestra aplicación
    • no puede (probablemente no lo es) apropiado hacerlo al instalar la aplicación
    • permite especificar de forma explícita a través del camino solamente la versión de la aplicación para poner en marcha si hay una de 32 bits y la versión de 64 bits
  2. Utilice la API de Windows para desactivar temporalmente la redirección cuando se muestran las listas de archivos o ejecutar a los usuarios ejecutar comandos. Temas son:
    • Sólo disponible en 64 bits - tiene que meterse con GetProcAddress
    • disponible sólo bajo ciertas paquetes de servicio
    • debe identificar individualmente a todos los lugares que la tarea debe realizarse
    • usuario tendrá que proporcionar información independiente acerca de si esta es una aplicación de 64 bits o 32 bits.

Si alguien tenía un código de ejemplo, que muestra un cuadro de diálogo de Windows OpenFile (MFC decir utilizando CFileDialog) que muestra nativly para XP / Vista y lo que permite la visualización de directorio system32 de 64 bits, que sería impresionante.

Si alguien tenía un ejemplo de lanzar la aplicación llamada, que también sería genial!

Editar:
Actualmente utilizamos CreateProcess para el lanzamiento de la aplicación (que está fallando).

err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);
¿Fue útil?

Solución

He ido con la opción 2, Para aquellos que puedan estar interesados; aquí está mi truco rápido en una versión con ámbito de gestión de la desactivación de WoW64 redirección basado en las notas de MS. Redirigirá si la API está disponible, espera que kernel32.dll ya está disponible.

class Wow64RedirectOff {
    typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
    typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in  PVOID OldValue );

public:
    Wow64RedirectOff() {
        LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
        if( LPFN_Disable ) {
            LPFN_Disable(&OldValue);
        }
    }

    ~Wow64RedirectOff() {
        if( LPFN_Disable ) {
            FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
            if( LPFN_Revert ) {
                LPFN_Revert(OldValue);
            }
        }
    }

private:
    FN_Wow64DisableWow64FsRedirection LPFN_Disable;
    PVOID OldValue; 
};

Y así sería el uso

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

Otros consejos

¿Usted está consiguiendo redireccionado a Windows / SysWoW64? Puedo lanzar aplicaciones de 64 bits de Windows / System32 de un OpenFile en un ejecutable gestionados 32 bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top