2010-07-08 19 views
11

Tengo un exe Delphi 2010 que inicia un segundo exe. En el segundo exe, hay un cuadro de diálogo que llama a openDialog.execute. Cuando esto se ejecuta en Windows 2008 Enterprise R2 bajo un escritorio remoto, se ejecuta como se esperaba, , pero cuando se ejecuta como una aplicación remota, tan pronto como aparece el diálogo de archivo, la aplicación se cuelga, convirtiendo todas las ventanas de la aplicación en blancas. La única forma de salir de él es terminar la aplicación. Traté de reemplazar TOpenDialog con TFileOpenDialog, los resultados son los mismos. He buscado modificar el archivo RDP que inicia la aplicación principal, pero no veo ningún parámetro que pueda marcar la diferencia. ¿Alguien ha visto alguna vez este tipo de comportamiento?Delphi TOpenDialog se cuelga en Windows 2008 cuando se ejecuta como aplicación de escritorio remota


2010.07.13 Actualizado

Ésta es reproducible mediante un ejemplo sencillo. Hay dos archivos ejecutables en el ejemplo. El primero es un iniciador de archivos, llamado m_module.exe, que contiene una edición, un botón y el siguiente código. Puedo cambiar el nombre del archivo ejecutable en la edición para que coincida con el segundo ejecutable antes de hacer clic en el botón de inicio:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShellExecute(Handle, 'open', stringToOLEstr(edit1.text) , nil, nil, SW_SHOWNORMAL) ; 
end; 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    edit1.text:=application.exename; 
end; 

El segundo ejecutable contiene un botón y el código de abajo:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    OpenDialog1.execute; 
end; 

La primera El módulo se inicia desde un archivo RDP.

2010.07.14 Actualizado

He descubierto que si puedo copiar los siguientes archivos DLL:

thumbcache.dll 
dtsh.dll 
wkscli.dll 

de la carpeta \ Windows \ System32 en la carpeta de la aplicación, se elimina el problema.

he descubierto además que el cambio de los niveles de propiedad y permisos de estos archivos DLL en la carpeta \ Windows \ System32 de TrustedInstaller al grupo del administrador tiene el mismo resultado (copiarlos en el directorio de la aplicación está cambiando la propiedad y el permiso creo)

Para confirmar esto, verifiqué que los errores volvieron a aparecer si cambié los niveles de propiedad y permisos a TrustedInstaller fuera del grupo del Administrador.

Parece que se trata de un problema de acceso de algún tipo. Tal vez esto ayude a descubrir la causa del problema.

2010.07.18 Actualizado

Parte de la información adicional que pueda ser útil (proporcionado por el Embarcadero):

En este artículo de MSDN para GetWindowsDirectory http://msdn.microsoft.com/en-us/library/ms724454%28VS.85%29.aspx documenta un comportamiento interesante de aplicaciones que se ejecutan en Servicios de Terminal Server. Si bien GetWindowsDirectory no se está llamando directamente, la zona de pruebas del directorio del sistema de Windows por usuario podría estar causando algún tipo de problema. Tal vez uno de los archivos DLL en la cadena de llamadas a GetOpenFileNameA está tratando de hacer referencia a la DLL real en el directorio real del sistema en lugar de la sandboxed, lo que causa una violación de los derechos. Es solo especulación, pero vale la pena investigar.Si pudieras trabajar con el SysInternals Process Monitor o el Process Explorer en el servidor, deberías poder ver commdlg32 y las otras DLL en el seguimiento de pila que se está cargando.

Todas las aplicaciones heredadas (es decir, no todas las aplicaciones creadas para Terminal Services o Remote Desktop Services) se ejecutan bajo una capa de compatibilidad de aplicaciones. Consulte este artículo de MSDN http://msdn.microsoft.com/en-us/library/cc834995%28VS.85%29.aspx. El indicador IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE se define en Windows.PAS. Para propósitos de prueba se puede añadir a la cabecera PE de la aplicación mediante la adición de Windows a la aplicación de las APLICACIONES sección y justo debajo de la sección USOS puesto:

{$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

Esto hará que su aplicación para eludir la compatibilidad capa. Actualmente estoy investigando si los procesos generados (por ejemplo, su segundo exe) retienen todos los derechos y configuraciones de la aplicación definida en RDS.

+0

¿Funciona si inicia la segunda aplicación directamente? –

+0

¿Monitores múltiples en la máquina en cuestión? Sospecho que el Diálogo Abierto se está abriendo en el área del Segundo Monitor y no en la Ventana del Escritorio Remoto. Intenta presionar -Alt-Space-M- y luego usa las teclas de flecha para volver a mostrar el cuadro de diálogo. –

+0

madExcept reports EAccessViolation. ¿Puedes comentar cómo esto se correlaciona con Hang? – Alex

Respuesta

2

Windows informa AV (c0000005) en el módulo thumbcache.dll.

creo que thumbcache.dll tienen algo que ver con la construcción miniaturas/almacenamiento en caché de archivos. Crear miniaturas puede significar el uso de extensiones de terceros para Explorer, que pueden no comportarse muy bien con RDP.

Prueba eso en el sistema limpio. Use VMWare o una máquina virtual similar para configurar la configuración de prueba.

P.S. Vea también este artículo: How to debug application’s hang? Pero creo que el bloqueo es solo consecuencia de otro problema en su caso.

+0

Con todas sus actualizaciones, la imagen completa parece más clara ¿no? Creo que debería editar esta respuesta para contener alguna referencia a la Capa de compatibilidad de aplicaciones de Windows Terminal Server y sus efectos en el diálogo estándar de TFileOpen con su 'explorer.exe' y sus subcomponentes, incluido' thumbcache.dll' que no fue cargado por Bill mismo, sino fue cargado por los diálogos estándar de archivos de Windows. –

0

recomiendo que uses Process Explorer herramienta para ver las propiedades de su proceso. Compruebe, qué DLL exactamente se cargan en ambos casos (puede hacerlo seleccionando su proceso y abriendo el panel inferior en la vista de módulos).

También puede usar la herramienta Process Monitor para supervisar el inicio del proceso (nuevamente: en ambos casos) y ver las referencias a las DLL en cuestión.

2

Fwiw, tenemos una situación similar, pero está impulsado por una necesidad de seguridad, y no un accidente. Cuando nuestra aplicación se ejecuta a través de Citrix, no podemos mostrar los cuadros de diálogo "abrir" o "guardar como" de Windows. Así que rodó el nuestro. Tiene un combo de letras de unidad (unidades locales solamente), selector de carpeta (restringido a las unidades aprobadas), selector de nombre de archivo y cuadro de edición de nombre de archivo.

Para nosotros, esto evita cualquier problema de directorio activo y mantiene la seguridad. Y evita que los usuarios intenten soltar archivos en nuestro sistema de archivos o ver cosas que no deberían.

Si no están funcionando en la caja de arena, mostramos los diálogos de archivos de Windows regulares. Una función de envoltura nos permite llamar desde cualquier lugar y dejar la decisión de "sandboxed vs windows" en un solo lugar.

0

Usted parece haber reducido su problema a un problema de acceso de algún tipo, por lo que la siguiente explicación no le podría ayudar. Sin embargo, parece existir un problema con las ventanas emergentes de RemoteApp y me podría imaginar que podría conducir (al menos teóricamente) a un problema similar, por eso me gustaría mencionar que: http://social.technet.microsoft.com/Forums/en-US/winserverTS/thread/0a88919f-2d72-4340-abd7-fbe0e9545f25/

Al parecer, el orden Z de las ventanas no siempre es correcto cuando se utiliza RemoteApp. En su caso TOpenDialog debe ser una ventana emergente modal. Debido al error, podría imaginar que TOpenDialog podría aparecer en segundo plano. Su ventana principal permanecerá en primer plano, pero se desactivará ya que TOpenDialog es modal. Windows podría no saber cómo volver a dibujar una ventana deshabilitada y simplemente dibujar un cuadro blanco.

0

Estábamos teniendo problemas en la OpenDialog.Execute pero sólo en un ordenador - y que parecía ser al azar He encontrado que la adición del exe del DEP Windows puede resolver el problema no hemos tenido ningún problema ya que el cambio se

aquí está el enlace sobre cómo cambiar las ventanas de configuración de DEP http://www.itechtalk.com/thread3591.html

esto es una solución - si alguien sabe cómo mantener el DEP feliz por favor agregue un comentario a continuación

0

es el orden Z Es incorrecto (que a menudo veo en Citrix, sin tener una solución adecuada para eso) aún sería capaz de cerrar el formulario con ctrl-F4 o alt-f4. Además, la aplicación no estaría "respondiendo". Algunas veces la orden se corregirá sola al cambiar entre las tareas

Cuestiones relacionadas