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
- is64Bit : true
- Abschaltung starten
- disabled : true
- start von osk.exe
- Abschaltung wieder einschalten
- enabled : true
wird mir folgende, unlogische Abfolge unter 64Bit angezeigt:
- is64Bit : true
- Abschaltung starten
- enabled : true
Kann mir jemand bei der Fehlersuche behilflich sein? Liegt es am Delphi 2009?
Vielen Dank im Voraus.
Amigage