Delphi TOpenDialog hängt in windows 2008, wenn die Ausführung als remote-desktop-Anwendung
Ich habe ein Delphi 2010 exe-Datei, startet eine zweite exe-Datei. In der zweiten exe, es ist ein dialog, fordert openDialog.ausführen. Wenn diese läuft unter Windows 2008 Enterprise R2 unter einem remote-desktop, es läuft wie erwartet, aber bei der Ausführung als eine remote-Anwendung, sobald der Datei-dialog öffnet sich, reagiert die Anwendung, drehen Sie alle mit der Anwendung windows weiß. Der einzige Weg raus aus der es ist, um die Anwendung zu beenden. Ich habe versucht, ersetzen TOpenDialog mit TFileOpenDialog, die Ergebnisse sind die gleichen. Ich habe mir in ändern Sie die RDP-Datei, startet die Hauptanwendung, aber nicht sehen können, alle Parameter, es würde einen Unterschied machen. Hat jemand je gesehen, diese Art von Verhalten vor?
2010.07.13 Aktualisiert
Dies ist reproduzierbar mit einem einfachen Beispiel. Es gibt zwei ausführbare Dateien, die in dem Beispiel. Die erste ist eine Datei launcher, genannt m_module.exe enthält ein edit, ein button, und der code unten. Ich ändern Sie den Namen der ausführbaren Datei in dem edit-entsprechend der zweiten ausführbaren Datei, bevor ich Sie auf die starten-Taste:
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;
Die zweite ausführbare Datei enthält eine Schaltfläche und den folgenden code:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.execute;
end;
Dem ersten Modul gestartet ist, aus einer RDP-Datei.
2010.07.14 Aktualisiert
Habe ich entdeckt, dass wenn ich kopieren Sie die folgenden dlls:
thumbcache.dll
dtsh.dll
wkscli.dll
aus dem \Windows\System32 Ordner in den Programm-Ordner, das problem ist beseitigt.
Habe ich weiter entdeckt, dass die Eigentümer wechseln und die Berechtigungsstufen, die diese dlls in \Windows\System32 Ordner vom TrustedInstaller auf den Administrator-Gruppe hat das gleiche Ergebnis (Kopieren Sie das Verzeichnis der Anwendung ändert sich das Eigentum und die Erlaubnis glaube ich)
Um dies zu bestätigen, ich habe überprüft, dass der Fehler wieder aufgetaucht, wenn ich änderte die Eigentums-und Berechtigungsstufen wieder TrustedInstaller Weg von der Administrator-Gruppe.
So scheint es, dass dies ein access-Problem in irgendeiner Form. Vielleicht hilft bei der Entdeckung der Ursache des Problems.
2010.07.18 Aktualisiert
Einige zusätzliche Informationen, die hilfreich sein könnten (zur Verfügung gestellt von Embarcadero):
In diesem MSDN-Artikel für GetWindowsDirectory http://msdn.microsoft.com/en-us/library/ms724454%28VS.85%29.aspx Dokumente einige interessante Verhalten von Anwendungen unter Terminal Services. Während GetWindowsDirectory ist nicht direkt aufgerufen die Sandbox des Windows-System-Verzeichnis pro Benutzer verursachen könnten irgendeine Art von problem. Vielleicht eine der DLLs, die in der aufrufenden Kette an GetOpenFileNameA versucht Verweis auf die real-DLL in das Reale System Verzeichnis statt auf die Sandbox einer so verursacht eine Rechtsverletzung dar. Es ist nur Spekulation, aber es ist eine Untersuchung Wert. Wenn Sie waren in der Lage zu Holen Sie sich die SysInternals-Prozess Monitor oder Process Explorer auf dem server arbeiten, sollten Sie in der Lage, um zu sehen, commdlg32 und den anderen DLLs in dem stack-trace geladen werden.
Alle legacy-Anwendungen (d.h. alle Anwendungen, die Sie nicht geschaffen für Terminal Services oder Remote Desktop Services) laufen unter einem Application Compatibility Layer. Finden Sie in diesem MSDN-Artikel http://msdn.microsoft.com/en-us/library/cc834995%28VS.85%29.aspx . Die IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE flag ist definiert in Windows.PAS. Für Testzwecke können Sie es hinzufügen, um Ihre Anwendung PE-header durch das hinzufügen von Fenstern zu der Anwendung VERWENDET Abschnitt und direkt unter der USES-Abschnitt setzen:
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}
Dies bewirkt, dass Ihre Anwendung die bypass-Kompatibilität Schicht. Ich bin derzeit, wenn gespawnt Prozesse (z.B. Ihre zweite exe) behalten alle Rechte und Einstellungen in der Anwendung definiert, die unter RDS.
- Funktioniert es, wenn Sie beginnen, die zweite Applikation direkt?
- Mehrere Monitore an der Maschine in Frage? Ich vermute, dass der Öffnen-Dialog wird geöffnet, in dem Zweiten Monitor Bereich und nicht in der Remote Desktop-Fenster. Versuchen Sie durch drücken von -Alt-Platz-M - und benutzt dann die Pfeiltasten zu bewegen, den dialog wieder in den Blick.
- madExcept Berichte EAccessViolation. Können Sie erläutern, wie diese korrelieren mit hängen?
- Können Sie reproduzieren diese in anderen Umgebungen? Auf jedem anderen Windows 2008 Enterprise Maschine? Mit anderen Delphi? Für alle nicht-Delphi-Anwendung?
- Sind Sie x32 oder x64? Und was ist UAC-status?
- > Informationen über das, was diese dll macht würde werden geschätzt - wie ich schon sagte: er schafft-Datei-Miniaturansichten in der Schale.
- Danke für alle diese Forschungen, alle von Ihnen.
- "IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE flag ist definiert in Windows.PAS. "Nur in einigen Versionen von Delphi. Es ist nicht definiert in Delphi 7.0 oder 7.2.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Windows meldet, AV (c0000005) in thumbcache.dll -Modul.
Ich denke, dass thumbcache.dll haben etwas zu tun mit dem Bau/der Zwischenspeicherung von Miniaturansichten für Dateien. Gebäude thumbnails kann bedeuten, mit 3rd-party-Erweiterungen von Explorer, die Verhalten sich möglicherweise nicht gut mit RDP.
Versuchen, die auf sauberes system. Verwenden Sie VMWare oder ähnliche virtuelle Maschine setup-Konfiguration testen.
P. S. Siehe auch diesen Artikel: Gewusst wie: Debuggen von Anwendung hängen? Aber ich denke, der hang ist nur Folge eines anderen Problems in Ihrem Fall.
explorer.exe
und Teilkomponenten einschließlichthumbcache.dll
wurde nicht geladen von Bill selbst, aber war geladen mit dem standard-Windows-Datei-Dialoge.FWIW, wir haben eine ähnliche situation, aber es ist angetrieben durch eine Sicherheit brauchen, und nicht einen Absturz. Wenn Sie unsere app läuft über Citrix, wir sind verboten, immer zeigen Sie die normale windows - "öffnen" oder "speichern unter" - Dialoge. Also rollten wir unsere eigenen. Es hat ein combo Laufwerk-Buchstaben (lokale Laufwerke nur), Ordner-Auswahl (beschränkt auf die zugelassenen Laufwerke), mit dem Namen-Auswahl und der Dateiname edit-box.
Für uns, diese wird, um alle active directory-Probleme, und hält mit Sicherheit glücklich. Und es hält auch die Benutzer aus, die versuchen, um drop von Dateien in unserem Dateisystem oder sehen Dinge, die Sie nicht sollte.
Wenn Sie nicht läuft in der sandbox, zeigen wir die normale windows-Datei-Dialoge. Eine wrapper-Funktion ermöglicht es uns, rufen Sie es von überall und lassen Sie die "Sandbox vs windows" - Entscheidung an einer Stelle.
Empfehle ich Ihnen, Process Explorer tool zum anzeigen der Eigenschaften des Prozesses. Überprüfen Sie, was genau DLLs geladen werden in beiden Fällen (Sie können es tun, indem Sie Ihren Prozess und die öffnung unteren Bereich in Module view).
Können Sie auch Process Monitor tool zum überwachen der Prozess-Start (wieder: in beiden Fällen) und finden Sie alle Verweise auf DLLs in Frage stellen.
Ihnen scheint eingegrenzt haben Ihr problem auf eine access-Problem irgendeiner Art, so dass die folgende Erklärung könnte dir nicht helfen. Aber es scheint noch ein problem mit popup-Fenstern auf RemoteApp-und ich könnte mir vorstellen, dass es führen könnte (zumindest theoretisch) zu einem ähnlichen problem, deshalb möchte ich es erwähnen:
http://social.technet.microsoft.com/Forums/en-US/winserverTS/thread/0a88919f-2d72-4340-abd7-fbe0e9545f25/
Anscheinend die Z-Reihenfolge der Fenster ist nicht immer richtig, wenn mithilfe von RemoteApp. In Ihrem Fall TOpenDialog sollte ein modales popup-Fenster. Aufgrund der Fehler, ich könnte mir vorstellen, dass TOpenDialog erscheinen könnte, in den hintergrund. Ihre Haupt-Fenster im Vordergrund bleiben würde aber deaktiviert werden, da TOpenDialog ist modal. Windows kann dann nicht wissen, wie zu zeichnen eine Behinderte-Fenster und ziehen Sie einfach ein weißes Feld.
Hatten wir Schwierigkeiten auf dem OpenDialog.Ausführen, aber nur auf einem Rechner und es schien zufällig zu sein
Ich fand, dass das hinzufügen der exe die Windows-Datenausführungsverhinderung kann das problem zu beheben
hatten wir noch keine Probleme, da es zu verändern
hier ist der link zum ändern der windows DEP-Einstellungen
http://www.itechtalk.com/thread3591.html
dies ist ein workaround - wenn jemand weiß, wie zu halten, der DEP glücklich, fügen Sie bitte einen Kommentar unten
Es die Z-Reihenfolge falsch ist (das sehe ich oft in Citrix, ohne eine passende Lösung für Sie) würden Sie trotzdem in der Lage sein, um das Formular zu schließen mit ctrl-F4 oder alt-f4. Außerdem würde die Anwendung nicht "reagiert nicht". Manchmal ist die Reihenfolge wird von selbst behoben, die beim wechseln zwischen Aufgaben