Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows 7 64Bit Redirection (https://www.delphipraxis.net/155861-windows-7-64bit-redirection.html)

amigage 10. Nov 2010 16:26

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:
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;
Die Funktion ChangeFSRedirection() habe ich hier aus dem Forum und nur um die Meldungen erweitert.

Delphi-Quellcode:
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;
Statt
  1. is64Bit : true
  2. Abschaltung starten
  3. disabled : true
  4. start von osk.exe
  5. Abschaltung wieder einschalten
  6. enabled : true

wird mir folgende, unlogische Abfolge unter 64Bit angezeigt:
  1. is64Bit : true
  2. Abschaltung starten
  3. enabled : true

Kann mir jemand bei der Fehlersuche behilflich sein? Liegt es am Delphi 2009?

Vielen Dank im Voraus.
Amigage

jfheins 10. Nov 2010 16:53

AW: Windows 7 64Bit Redirection
 
Versuch mal, ob es vielleicht mit einem verändertem Pfad klappt:
Zitat:

%windir%\Sysnative\osk.exe
http://msdn.microsoft.com/en-us/libr...87(VS.85).aspx

Assarbad 10. Nov 2010 17:46

AW: Windows 7 64Bit Redirection
 
Moin,

also erstmal solltest du nicht die alten Funktionen verwenden, sondern die neuen: MSDN-Library durchsuchenWow64RevertWow64FsRedirection und MSDN-Library durchsuchenWow64DisableWow64FsRedirection.

Zitat:

Wow64EnableWow64FsRedirection Function

Enables or disables file system redirection for the calling thread.

This function may not work reliably when there are nested calls. Therefore, this function has been replaced by the MSDN-Library durchsuchenWow64DisableWow64FsRedirection and MSDN-Library durchsuchenWow64RevertWow64FsRedirection functions.
Und wenn du ein kleines Beispielprojekt anhängst, kann ich oder jemand anderes auch gern mal live auf einem x64 testen ;)

Zitat:

Zitat von jfheins (Beitrag 1060809)

Nur um es hervorzuheben, denn es muß ja nicht zwangsläufig spezifisch Windows 7 sein, auch wenn's im Thementitel steht:

Zitat:

Windows Server 2003 and Windows XP: The Sysnative alias was added starting with Windows Vista.

shmia 10. Nov 2010 19:18

AW: Windows 7 64Bit Redirection
 
Zitat:

wird mir folgende, unlogische Abfolge unter 64Bit angezeigt:
1.is64Bit : true
2.Abschaltung starten
6.enabled : true
Sieht für mich logisch aus - mit der Abschaltung von 32Bit FS werden wohl auch Bildschirmausgaben mit ShowMessage gestört.
Deshalb fehlen dann die Punkte 3. bis 5.

amigage 11. Nov 2010 17:51

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.

Assarbad 11. Nov 2010 18:22

AW: Windows 7 64Bit Redirection
 
Du benutzt es aber so wie du es schriebst, oder? Also nicht innerhalb verschiedener Threads oder ähnliches?

amigage 11. Nov 2010 19:08

AW: Windows 7 64Bit Redirection
 
Nein, ganz normal bei Klick auf eine Schaltfläche. Keine Threads!

Assarbad 11. Nov 2010 19:15

AW: Windows 7 64Bit Redirection
 
Zitat:

Zitat von amigage (Beitrag 1061040)
Nein, ganz normal bei Klick auf eine Schaltfläche. Keine Threads!

Okay, gucke nachher mal drüber.

Bummi 11. Nov 2010 19:50

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

Assarbad 11. Nov 2010 20:03

AW: Windows 7 64Bit Redirection
 
Zitat:

Zitat von Bummi (Beitrag 1061056)
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

Schließe mich an. Getestet auf Win 7 x64.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr.
Seite 1 von 3  1 23   

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