Windows 7 64Bit Redirection
Hallo liebe Gemeinde,
ich versuche mit einem 32 Bit Programm unter 64 Bit ein Systemprogramm aufzurufen, z.B. die Bildschirmtastatur. Ich habe mich in die Problematik der 64Bit Redirection hier im Forum eingelesen und einige gute Ansätze gefunden. Leider funktionieren die bei mir nicht? Debuggen kann ich leider nur über Meldungen, da mein Delphi 2009 nicht auf dem 64Bit System installiert ist.
Delphi-Quellcode:
Die Funktion ChangeFSRedirection() habe ich hier aus dem Forum und nur um die Meldungen erweitert.
procedure TFormDlg.BitBtn1Click(Sender: TObject);
var is64Bit : boolean; begin is64Bit := Is64BitViaRegistry; showmessage('is64Bit : ' + BoolToStr(is64Bit)); if (is64Bit = true) then ChangeFSRedirection(true); // Redirect stoppen showmessage ('start von osk.exe'); ShellExecute(handle, 'open', PChar('%WinDir%\system32\') + 'osk.exe'), NIL, NIL, SW_SHOW); if (is64Bit = true) then ChangeFSRedirection(false); // Redirect wieder starten end;
Delphi-Quellcode:
Statt
function ChangeFSRedirection(bDisable: Boolean): Boolean;
type TWow64DisableWow64FsRedirection = Function(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall; TWow64EnableWow64FsRedirection = Function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall; var hHandle: THandle; Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection; Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection; Wow64FsEnableRedirection: LongBool; begin Result := false; try hHandle := GetModuleHandle('kernel32.dll'); @Wow64EnableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64EnableWow64FsRedirection'); @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection'); if bDisable then begin if (hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil) then begin showmessage('Abschaltung starten'); Result := Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection); showmessage('disabled : ' + BoolToStr(Result)); end; end else begin if (hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) then begin showmessage('Abschaltung wieder einschalten'); Result := Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection); showmessage('enabled : ' + BoolToStr(Result)); Result := True; end; end; Except end; end;
wird mir folgende, unlogische Abfolge unter 64Bit angezeigt:
Kann mir jemand bei der Fehlersuche behilflich sein? Liegt es am Delphi 2009? Vielen Dank im Voraus. Amigage |
AW: Windows 7 64Bit Redirection
Versuch mal, ob es vielleicht mit einem verändertem Pfad klappt:
Zitat:
|
AW: Windows 7 64Bit Redirection
Moin,
also erstmal solltest du nicht die alten Funktionen verwenden, sondern die neuen: Wow64RevertWow64FsRedirection und Wow64DisableWow64FsRedirection. Zitat:
Zitat:
Zitat:
|
AW: Windows 7 64Bit Redirection
Zitat:
Deshalb fehlen dann die Punkte 3. bis 5. |
AW: Windows 7 64Bit Redirection
Liste der Anhänge anzeigen (Anzahl: 1)
@Assarbad:
Besten Dank für den Hinweis, bezüglich Wow64RevertWow64FsRedirection, jedoch besteht ja bei mir das Problem bereits bei Wow64DisableWow64FsRedirection, denn da scheint ja schon irgendwie etwas schief zu laufen. Ich habe trotzdem mal eine Änderung vorgenommen. The same procedure. :cry: Ich habe mal ein Beispielprojekt angelegt. Eine kompilierte Exe ist auch beigelegt. Würde mich freuen, wenn ihr das mal testen und über den Quellcode schauen könntet (speziell die Funktion ChangeFSRedirection() ). @shmia: Für mich ist die Schlussfolgerung nicht ganz nachzuvollziehen, denn dann hätte ja zumindest die Bildschirmtastatur starten müssen, oder? Ich danke Euch im Voraus für jede Hilfe und jeden Hinweis. |
AW: Windows 7 64Bit Redirection
Du benutzt es aber so wie du es schriebst, oder? Also nicht innerhalb verschiedener Threads oder ähnliches?
|
AW: Windows 7 64Bit Redirection
Nein, ganz normal bei Klick auf eine Schaltfläche. Keine Threads!
|
AW: Windows 7 64Bit Redirection
Zitat:
|
AW: Windows 7 64Bit Redirection
Ich denke shima hat recht
nimm statt showmessage mal Memo1.lines.add is64Bit : true Abschaltung starten disabled : true start von osk.exe Abschaltung wieder einschalten enabled : true OSK öffnet sich |
AW: Windows 7 64Bit Redirection
Zitat:
|
AW: Windows 7 64Bit Redirection
Kleiner Nachtrag.
Du solltest meines Erachtens nach nicht extra testen ob du auf x64 läufst und vor allem nicht via Registry sondern via GetNativeSystemInfo. Wie gesagt, testen ist aber m.E.n. unnötig, weil auf einem 32bit-System die Funktionen nicht von kernel32.dll exportiert werden ;) |
AW: Windows 7 64Bit Redirection
Also dieser Code startet bei mir osk 64bit. Ohne Wow64DisableWow64FsRedirection wollte osk garnicht erst starten. Die 32Bit funkz wohl nicht unter 64bit (oder will nicht).
Delphi-Quellcode:
ShowMessage funktioniert nur dann, wenn es mindestens einmal vor Wow64DisableWow64FsRedirection aufgerufen wurde. Sonst sind nicht alle DLLs geladen und es wird versucht eine 64bit DLL in einen 32bit Prozess zu laden. Zumindest ich bekomme eine generische Exception C0FB007E, was wohl vom Delphi delay loader Mechanismus stammt. $7E = 126d ist übrigens der Win32 Code für Modul nicht gefunden.
uses
JwaWindows, SysUtils; function GetNativeWindowsDirectory : String; var P : array[0..MAX_PATH] of Char; begin SHGetFolderPath(0, CSIDL_SYSTEM, 0, SHGFP_TYPE_DEFAULT, @P); result := P; end; var oldValue : Pointer; Path : String; begin Path := GetNativeWindowsDirectory + '\osk.exe'; if not Wow64DisableWow64FsRedirection(oldValue) then RaiseLastOSError; ShellExecuteW(0, 'open', PChar(Path), '', '', SW_SHOWNORMAL); Wow64RevertWow64FsRedirection(oldValue); end. |
AW: Windows 7 64Bit Redirection
Ich danke Euch für die rege Teilnahme an meinem Problem :roll:
Leider wird das irgendwie nichts bei mir. Showmessage habe ich durch Memo.Lines.Add ersetzt und jetzt werden auch die Ausgaben gemacht.
Aber osk.exe startet immer noch nicht. Also habe ich mir den Rückgabewert von Shellexecute ausgeben lassen. Der sollte über 32 sein, aber es wird eine 5 ausgegeben. Und die besagt "Der Zugriff wurde auf die angegebene Datei verweigert." Ich weiß nicht warum... Kann mir das jemand erklären? Danke. |
AW: Windows 7 64Bit Redirection
auch wenn Du die Anwendung als Administrator startest?
|
AW: Windows 7 64Bit Redirection
Zusammen mit Thomas' Vorschlag würde ich noch vorschlagen, daß du Process Monitor von (Sysinternals/MS Technet) mal ne Chance gibst. Wenn du dann so filterst, daß nur dein Programm und osk.exe angezeigt werden und es auf Dateiaktionen beschränkst, kannste den gefilterten Dump (PML!) hier mal anhängen und dann können wir alle miträtseln ;)
|
AW: Windows 7 64Bit Redirection
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe einmal das Log vom Process Monitor angehangen. Ich hoffe, ihr könnt erkennen, wo das Problem ist. Das 64 Bit System ist übrigens in Englisch, was aber nicht das Problem sein sollte, oder?
@Bummi: Dasselbe passiert auch, wenn ich das Programm als Admin ausführe. Ich wünsche Euch allen einen schönen Sonntag. |
AW: Windows 7 64Bit Redirection
Hast du mal meinen Code ausprobiert oder machst du eine neue EXE zum testen, weil die alte Exe funktioniert bei mir nicht.
|
AW: Windows 7 64Bit Redirection
Zitat:
Zitat:
Zitat:
|
AW: Windows 7 64Bit Redirection
Wie gesagt, sein Code funktioniert bei mir nicht, meiner jedoch schon.
Vielleicht mal testen? Solange das nicht geschehen ist, werde ich auch nicht mehr weiter raten. |
AW: Windows 7 64Bit Redirection
Zitat:
|
AW: Windows 7 64Bit Redirection
@Dezipaitor:
Könntest Du mir mal Deine exe hier anbieten? Ich arbeitet derzeit ohne die Jedi-Komponenten und würde sicher gehen wollen, dass diese funktionieren, bevor ich sie mir installiere. Ich habe bei den Jedi Komponenten sowieso keinen Überblick, welche ich da wann benötige. Aber das ist ein anderes Thema :-D |
AW: Windows 7 64Bit Redirection
Die JEDI API muss nicht installiert werden. Einfach die Pfade inkludieren.
Und hier gibt es eine Übersicht: http://wiki.delphi-jedi.org/index.php?title=Main_Page |
AW: Windows 7 64Bit Redirection
64Bit Redirection? Wieso immer gleich mit Kanonen auf Spatzen schießen? Die erste Antwort von jfheins ist Microsoft konform.
Zitat:
Solange man mit Delphi keine 64bit Programme erzeugen kann, reicht folgendes:
Delphi-Quellcode:
if IsProcess32OnWin64(GetCurrentProcess) then Exe:='%WinDir%\Sysnative\osk.exe' else Exe:='%WinDir%\system32\osk.exe';
IsProcess32OnWin64 ist gleichbedeutend mit Deiner Is64BitViaRegistry (und ist auch Microsoft konform).
Delphi-Quellcode:
function IsProcess32OnWin64(ProcessHandle:THandle):boolean;
type TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall; // Type of IsWow64Process API fn var IsWow64Result: BOOL; // Result from IsWow64Process IsWow64Process: TIsWow64Process; // IsWow64Process fn reference begin result:=false; IsWow64Process := GetProcAddress( GetModuleHandle('kernel32.dll'), 'IsWow64Process' ); if Assigned(IsWow64Process) then begin if IsWow64Process(ProcessHandle,IsWow64Result) AND IsWow64Result then result:=true; end; // google: Running 32-bit Applications (Windows) end; function IsProcess64bit(ProcessHandle:THandle):boolean; begin result:= IsWin64bit AND not IsProcess32OnWin64(ProcessHandle); end; |
AW: Windows 7 64Bit Redirection
Liste der Anhänge anzeigen (Anzahl: 1)
@gore
Danke für den Hinweis, aber wenn ich das mit Sysnative umsetze, erhalte ich von Shellexecute() die Rückmeldung 3 (Datei nicht gefunden). Also rufe ich generell '%WinDir%\system32\osk.exe' auf. @all Aber - und jetzt wird es verrückt - ich habe eine nachvollziehbare, aber nicht praktikable Lösung gefunden. Ich habe zwei Schaltflächen: 1. Schaltfläche ist Version 1 mit ChangeFSRedirection() 2. Schaltfläche ist Version 2 mit IsProcess32OnWin64 von gore
Danach schließe ich das kleine Testprogramm:
Ich kann mir das Verhalten nicht erklären. Also habe ich versucht, eine Mischung von beidem zu erstellen, aber dann habe ich wieder Shellexecute() mit Rückgabe von 5.
Delphi-Quellcode:
Ich bin echt am Verzweifeln. Langsam muss ich davon ausgehen, dass an meinen frisch installierten, englischen Windows 7 64 Bit irgendetwas nicht funktioniert.
IsProcess32OnWin64(GetCurrentProcess); // von gore
ChangeFSRedirection(true); // Redirect stoppen Path := CreateCorrectWinDir('%WinDir%\system32\osk.exe'); Memo1.Lines.Add('start von ' + Path); isStarted := ShellExecute(0, 'open', PChar(Path), '', '', SW_SHOWNORMAL); Memo1.Lines.Add('isStarted : ' + IntToStr(isStarted)); ChangeFSRedirection(false); // Redirect wieder starten Könntet Ihr daher bitte noch einmal mein Testprogramm (bereits kompiliert) probieren und mir Eure Ergebnisse unter Eurem Windows 7 64Bit durchgeben? |
AW: Windows 7 64Bit Redirection
Liste der Anhänge anzeigen (Anzahl: 1)
Probier mal die angehängte Version
|
AW: Windows 7 64Bit Redirection
Zitat:
Zitat:
|
AW: Windows 7 64Bit Redirection
Vergiß alles, ich hab mich gerade damit etwas beschäftigt.
Unter XE kann man Osk.exe einfach ausführen. Im 64bit Explorer geht es nicht. Hier wird geraten, dass .NET mit abgeschalteten Redirection nicht funktioniert. Das Shell zeugs mit ShellExecute geht alles außerdem über COM, denn ich bekomme, wenn ich
Delphi-Quellcode:
verwende, eine Prozedur wurde (im Modul) nicht gefunden. D.h. das alles ist in Windows ganz tief drin, denn osk.exe ist ja auch in der WhiteList für AutoElevation.
CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
Delphi scheint da irgendetwas mit .NET inuts zu haben, damit es funktioniert. |
AW: Windows 7 64Bit Redirection
Also wieder Start bei 0 :pale:
Könntet Ihr bitte einmal meine osk.zip ausprobieren, ob ihr den o.g. Ablauf auch bei Euch bestätigen könnt. Danke. |
AW: Windows 7 64Bit Redirection
Mit FreePascal eine kleine 64bit App bauen, die das für dich macht. Vielleicht gehts so.
|
AW: Windows 7 64Bit Redirection
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz