Ho un exe Delphi 2010 che avvia un secondo exe. Nel secondo exe, c'è una finestra di dialogo che chiama openDialog.execute. Quando viene eseguito in Windows 2008 Enterprise R2 su un desktop remoto, viene eseguito come previsto, ma quando viene eseguito come applicazione remota, non appena viene visualizzata la finestra di dialogo del file, l'applicazione si blocca, rendendo bianche tutte le finestre dell'applicazione. L'unico modo per uscirne è terminare l'applicazione. Ho provato a sostituire TOpenDialog con TFileOpenDialog, i risultati sono gli stessi. Ho esaminato la modifica del file RDP che avvia l'applicazione principale, ma non posso vedere nessun parametro che possa fare la differenza. Qualcuno ha mai visto questo tipo di comportamento prima?Delphi TOpenDialog si blocca in Windows 2008 quando viene eseguito come applicazione desktop remota
2010.07.13 Aggiornato
Questo è riproducibile con un semplice esempio. Ci sono due file eseguibili nell'esempio. Il primo è un file launcher, chiamato m_module.exe, che contiene una modifica, un pulsante e il codice seguente. A cambiare il nome del file eseguibile nella modifica in modo che corrisponda alla seconda eseguibile prima di fare clic sul pulsante di lancio:
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;
Il secondo file eseguibile contiene un pulsante e il codice qui sotto:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.execute;
end;
La prima il modulo viene lanciato da un file RDP.
2010.07.14 Aggiornato
ho scoperto che se copio le seguenti DLL:
thumbcache.dll
dtsh.dll
wkscli.dll
dalla cartella \ Windows \ System32 nella cartella dell'applicazione, il problema viene eliminato.
Ho inoltre scoperto che la modifica della proprietà e dei livelli di autorizzazione di queste dll nella cartella \ Windows \ System32 da TrustedInstaller al gruppo dell'Amministratore ha lo stesso risultato (Copiarle alla directory dell'applicazione sta cambiando la proprietà e l'autorizzazione credo)
a conferma di ciò, ho verificato che gli errori sono riapparsi se ho cambiato il livello di proprietà e di autorizzazione di nuovo a TrustedInstaller lontano dal gruppo di amministratori.
Quindi sembra che questo sia un problema di accesso di qualche tipo. Forse questo aiuterà a scoprire la causa del problema.
2010.07.18 Aggiornato
Alcuni ulteriori informazioni che potrebbero essere utili (fornita da Embarcadero):
questo articolo MSDN per GetWindowsDirectory http://msdn.microsoft.com/en-us/library/ms724454%28VS.85%29.aspx documenta un comportamento interessante di applicazioni in esecuzione in Servizi terminal. Mentre GetWindowsDirectory non viene chiamato direttamente il sandboxing della directory di sistema di Windows per ogni utente potrebbe causare qualche tipo di problema. Forse una delle DLL nella catena chiamata a GetOpenFileNameA sta cercando di fare riferimento alla DLL reale nel vero directory di sistema al posto di quello sandbox provocando così una violazione dei diritti. E 'solo speculazione, ma vale la pena indagare.Se si è riusciti a far funzionare SysInternals Process Monitor o Process Explorer sul server, dovrebbe essere possibile visualizzare commdlg32 e le altre DLL nello stack trace caricato.
Tutte le applicazioni legacy (ovvero tutte le applicazioni non create per Servizi terminal o Servizi Desktop remoto) vengono eseguite in un livello di compatibilità delle applicazioni. Vedere questo articolo MSDN http://msdn.microsoft.com/en-us/library/cc834995%28VS.85%29.aspx. Il flag IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE è definito in Windows.PAS. A scopo di verifica è possibile aggiungerlo alla intestazione PE dell'applicazione con l'aggiunta di Windows per la vostra applicazione di USI sezione e proprio sotto put sezione utilizza:
{$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}
Questo farà sì che l'applicazione per bypassare la compatibilità strato. Attualmente sto esaminando se i processi generati (ad es. Il secondo exe) conservano tutti i diritti e le impostazioni dell'applicazione definiti in RDS.
Funziona se si avvia direttamente la seconda applicazione? –
Più monitor sulla macchina in questione? Sospetto che la finestra di dialogo Apri si stia aprendo nell'area del secondo monitor e non nella finestra del desktop remoto. Prova a premere -Alt-Space-M- e poi usa i tasti freccia per spostare nuovamente la finestra di dialogo. –
madExcept segnala EAccessViolation. Puoi commentare come questo è correlato con hang? – Alex