Odpalenie 64-bitowego programu z 32-bitowego.

0

Witam,
Może tym razem ja spróbuję zapytać zanim dokładnie przeszukam google.
Czy da rady odpalić za pomocą CreateProcess (ewentualne WinExec) 64-bitowy program z poziomu 32-bitowego programu.
Ten 32 bitowy to mój program w którym próbowałem:

WinExec('osk',SW_SHOW);

Osk.exe to standardowy program windowsowy - klawiatura ekranowa.
Jeżeli system jest 32-btowy - działa jak trzeba.
Jeżeli system jest 64-btowy XP - również działa jak trzeba.
Jeżeli system jest Win7-64 - to pojawia się komunikat (nie mój) nie da się uruchomić klawiatury ekranowej.
Może ktoś zna rozwiązanie?
PS
Próbowałem poprzez cmd - skutek ten sam.

Zauważyłem że jest dwa OSK.EXE w systemie, jeden w \System32\ drugi w \SystemWow64\ - na oba ta sama reakcja, więc chyba nie chodzi nawet o 64-bitowość.
ShellExecute - też nic nie daje.

OSK.EXE działa z poziomu menu systemu oraz z poziomu cmd.
Nie działa kiedy odpalam "osk", "osk.exe" lub "c:\windows\system32\osk.exe" jak na razie wykryłem takie "nie działanie" pod win7-64 z tym że już znalazłem inny taki sam win7-64 pod którym to działa.

Komunikat:
8ca6bb4509.png

0

na w8-64bit i d7-32bit działa - klawiatura się odpala

EDIT:
Na w7-64bit nie działa :/

1

Zauważyłem że jest dwa OSK.EXE w systemie, jeden w \System32\ drugi w \SystemWow64\ - na oba ta sama reakcja,

Ale wiesz o tym, że w 32-bitowym programie katalog system32 jest przekierowywany do syswow64 - czyli wydaje ci się że odwołujesz się do system32, a tak naprawdę odwołujesz się do syswow64.

Ale nie powinieneś się tym w ogóle przejmować, ilu bitowy program się uruchomi. Odpalaj po prostu osk.exe albo z pełną ścieżką c:\windows\system32\osk.exe (właściwą ścieżkę pobieraj z systemu, nie koduj na sztywno c:\windows)

Najważniejsze, to jaki komunikat ci się pojawia.

Próbowałem poprzez cmd - skutek ten sam.
A z menu start, po ludzku? Może klawiatura ekranowa w ogóle ci nie działa na tej instalacji, albo jej nie ma.

3

Jeżeli "normalne" włączenie tej aplikacji nie działa to coś jest nie tak z samym Windowsem.

Odnośnie uruchamiania 64bit aplikacji z 32bitowego to ponoć pomaga użycie Wow64DisableWow64FsRedirection.

1

U mnie pod Windowsem 7 64 bit P;rofessional mam to samo. Jakby nie uruchamiać osk.exe pokaże taki komunikat jak Tobie.

1

Podaje działającą wersje:

function Wow64DisableWow64FsRedirection(var Wow64FsEnableRedirection:LongBool):LongBool; stdcall; external 'Kernel32.dll' name 'Wow64DisableWow64FsRedirection';
function Wow64RevertWow64FsRedirection(Wow64FsEnableRedirection:LongBool):LongBool; stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection';

procedure CallOsk;
var Wow64FsEnableRedirection:LongBool;
begin
  Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
  ShellExecute(0,nil,'osk.exe',nil,nil,SW_SHOW);
  //WinExec('osk',SW_SHOW);
  Wow64RevertWow64FsRedirection(Wow64FsEnableRedirection);
end;

Jeżeli zaś kod ma działać również na 32 bitowych komputerach XP i starszych to:

procedure CallOsk;
var IsDisable:LongBool;
var WowHandle:THandle;
var Disable:function(var Wow64FsEnableRedirection:LongBool):LongBool;stdcall;
var Revert:function(Wow64FsEnableRedirection:LongBool):LongBool;stdcall;
begin
  Disable:=nil;
  Revert:=nil;
  WowHandle:=LoadLibrary('Kernel32.dll');
  try
    if WowHandle<>0 then
    begin
      @Disable:=GetProcAddress(WowHandle,'Wow64DisableWow64FsRedirection');
      @Revert:=GetProcAddress(WowHandle,'Wow64RevertWow64FsRedirection');
    end;
    if @Disable<>nil then Disable(IsDisable);
    ShellExecute(0,nil,'osk.exe',nil,nil,SW_SHOW);
    //WinExec('osk',SW_SHOW);
    if @Revert<>nil then Revert(IsDisable);
  finally
    FreeLibrary(WowHandle);
  end;
end;
0

@_13th_Dragon - działa pod Delphi na WinXP 32-bit bez problemu;


Najśmieszniejsze jest to, że przeportowanie tego kodu na Lazarusa sprawia trochę kłopotów - kod się w ogóle nie skompiluje, i nie chodzi tu wcale o inne moduły; Kompilator nie przypisze adresu funkcji przez operator @ - trzeba rzutować na Pointer we wszystkich trzech przypadkach; A tak poza tym to tylko inne typy są zalecane do użycia, ale nie są obowiązkowe;

Poniżej kod śmigający na Lazarusie, zarówno pod WinXP 32-bit, jak i Win7 64-bit:

uses
  {...} DynLibs, ShellAPI {...} ;

procedure CallOsk();
var
  libhKernel: TLibHandle = NilHandle;
  boolDisabled: LongBool = False;
var
  DisableFunc: function(var Wow64FsEnableRedirection: LongBool): LongBool; stdcall = nil;
  RevertFunc: function(Wow64FsEnableRedirection: LongBool): LongBool; stdcall = nil;
begin
  libhKernel := LoadLibrary('Kernel32.dll');
  try
    if libhKernel <> NilHandle then
    begin
      Pointer(DisableFunc) := GetProcedureAddress(libhKernel, 'Wow64DisableWow64FsRedirection');
      Pointer(RevertFunc)  := GetProcedureAddress(libhKernel, 'Wow64RevertWow64FsRedirection');
    end;

    if Pointer(DisableFunc) <> nil then
      DisableFunc(boolDisabled);

    ShellExecute(0, nil, 'osk.exe', nil, nil, 0);

    if Pointer(RevertFunc) <> nil then
      RevertFunc(boolDisabled);
  finally
    UnloadLibrary(libhKernel);
  end;
end;

Może się komuś przydać w przyszłości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1