Odpalenie 64-bitowego programu z 32-bitowego.

Odpowiedz Nowy wątek
2014-07-28 13:16

Rejestracja: 15 lat temu

Ostatnio: 3 minuty temu

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 6x, ostatnio: _13th_Dragon, 2014-07-28 14:43

Pozostało 580 znaków

2014-07-28 14:12

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

0

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

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber, 2014-07-29 01:47

Pozostało 580 znaków

2014-07-28 14:17

Rejestracja: 16 lat temu

Ostatnio: 6 godzin temu

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.

edytowany 3x, ostatnio: Azarien, 2014-07-28 14:22
OSK.EXE działa z menu systemu oraz spod 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. - _13th_Dragon 2014-07-28 14:38
ale nadal nie wiemy jaki dostajesz komunikat albo kod błędu... - Azarien 2014-07-28 14:55

Pozostało 580 znaków

2014-07-28 14:31

Rejestracja: 6 lat temu

Ostatnio: 1 rok temu

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.

A jednak to było właśnie to, pierwsza próba nie przeszła z powodu błędnej deklaracji parametru. - _13th_Dragon 2014-07-29 02:34

Pozostało 580 znaków

2014-07-28 17:22
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Szczecin

1

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


No i jak to coś ugryźć ? - _13th_Dragon 2014-07-28 17:32
@GThoro dał wskazówkę. - Azarien 2014-07-28 18:27
@Azarien, owszem dał ale nie do tego problemu. - _13th_Dragon 2014-07-28 21:10
spróbuj to Wow64DisableWow64FsRedirection a potem dopiero marudź :) - Azarien 2014-07-28 21:48
Informację o użyciu Wow64DisableWow64FsRedirection znalazłem googlując na temat nie chcącego się uruchomić osk.exe i wyszło, że wielu ludzi ma problemy z tym i większości to pomagało. Jednakże, jeżeli sama appka nie włącza się "normalnie" to na cuda bym nie liczył. - GThoro 2014-07-28 22:45
Sama normalnie się włącza, pierwsze kilkaset linków też wygooglowałem zanim napisałem ten post. - _13th_Dragon 2014-07-28 23:13

Pozostało 580 znaków

2014-07-29 02:35

Rejestracja: 15 lat temu

Ostatnio: 3 minuty temu

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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2014-07-29 14:41
"Jeżeli zaś kod ma działać również na 32 bitowych komputerach" — nieścisłość: jeżeli kod ma działać na 32-bitowym XP (i starszych). funkcje te są normalnie dostępne pod 32-bitową Vistą i nowszymi (i nic nie robią) - Azarien 2014-07-29 10:32
Dopiszę to w poście. - _13th_Dragon 2014-07-29 14:41

Pozostało 580 znaków

2014-07-29 15:35
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Tuchów

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.


edytowany 4x, ostatnio: furious programming, 2014-07-29 15:47
Pokaż pozostałe 6 komentarzy
GetProcedureAddress jest "aliasem" funkcji GetProcAddress - ta druga zachowana jedynie dla kompatybilności z Delphi; Właśnie dlatego, że obie funkcje zwracają Pointer, konieczne jest to rzutowanie; Sprawdziłem wiele kombinacji - jedynie ta podana działa prawidłowo na różnych systemach z różną bitowością, no i przede wszytkim kompiluje się; - furious programming 2014-07-29 15:58
@furious programming: nazwałem program osk (od on-screen keyboard) odpaliłem go bez zastanowienia, że uruchamia osk.exe. system bomby nie wytrzymał. może jednak pobierz ścieżkę systemową i odpalaj osk.exe z pełną ścieżką... - Azarien 2014-07-29 16:18
U mnie być może działało dlatego, że na kompie rodziców (z Win7 64-bit) wyłączone jest UAC; Później się tym zajmę; @Azarien, ten kod i tak powinien działać - nawet na MSDN w przykładach wykorzystywane są same nazwy aplikacji, bez konieczności pobierania do nich ścieżek... Chyba że to problem ShellExecute lub tych ładujących funkcje z DLL - ciężko stwierdzić... :( - furious programming 2014-07-29 17:18
kod działa. po prostu nazwałem go osk.exe (tak samo jak odpalany proces) i zrobił się fork bomb. - Azarien 2014-07-29 17:41
Ach, teraz dopiero zakapowałem ;) - furious programming 2014-07-29 19:44

Pozostało 580 znaków

Odpowiedz

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