Einzelnen Beitrag anzeigen

amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
270 Beiträge
 
Delphi 11 Alexandria
 
#1

Windows 7 64Bit Redirection

  Alt 10. Nov 2010, 16:26
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
  Mit Zitat antworten Zitat