Delphi-PRAXiS
Seite 3 von 3     123   

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 15. Nov 2010 07:35

AW: Windows 7 64Bit Redirection
 
@Dezipaitor:
Könntest Du mir mal Deine exe hier anbieten? Ich arbeitet derzeit ohne die Jedi-Komponenten und würde sicher gehen wollen, dass diese funktionieren, bevor ich sie mir installiere.

Ich habe bei den Jedi Komponenten sowieso keinen Überblick, welche ich da wann benötige. Aber das ist ein anderes Thema :-D

Dezipaitor 15. Nov 2010 09:45

AW: Windows 7 64Bit Redirection
 
Die JEDI API muss nicht installiert werden. Einfach die Pfade inkludieren.

Und hier gibt es eine Übersicht:
http://wiki.delphi-jedi.org/index.php?title=Main_Page

gore 15. Nov 2010 11:47

AW: Windows 7 64Bit Redirection
 
64Bit Redirection? Wieso immer gleich mit Kanonen auf Spatzen schießen? Die erste Antwort von jfheins ist Microsoft konform.

Zitat:

32-bit applications can access the native system directory by substituting %windir%\Sysnative for %windir%\System32. WOW64 recognizes Sysnative as a special alias used to indicate that the file system should not redirect the access. This mechanism is flexible and easy to use, therefore, it is the recommended mechanism to bypass file system redirection. Note that 64-bit applications cannot use the Sysnative alias as it is a virtual directory not a real one.

Solange man mit Delphi keine 64bit Programme erzeugen kann, reicht folgendes:
Delphi-Quellcode:
  if IsProcess32OnWin64(GetCurrentProcess) then Exe:='%WinDir%\Sysnative\osk.exe' else Exe:='%WinDir%\system32\osk.exe';


IsProcess32OnWin64 ist gleichbedeutend mit Deiner Is64BitViaRegistry (und ist auch Microsoft konform).
Delphi-Quellcode:
function IsProcess32OnWin64(ProcessHandle:THandle):boolean;
type
  TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall; // Type of IsWow64Process API fn
var
  IsWow64Result: BOOL;     // Result from IsWow64Process
  IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
begin
  result:=false;
  IsWow64Process := GetProcAddress( GetModuleHandle('kernel32.dll'), 'IsWow64Process' );
  if Assigned(IsWow64Process) then begin
    if IsWow64Process(ProcessHandle,IsWow64Result) AND IsWow64Result then result:=true;  
  end;                                                                                   // google: Running 32-bit Applications (Windows)
end;                                                                                    

function IsProcess64bit(ProcessHandle:THandle):boolean;
begin
  result:= IsWin64bit AND not IsProcess32OnWin64(ProcessHandle);
end;

amigage 15. Nov 2010 18:41

AW: Windows 7 64Bit Redirection
 
Liste der Anhänge anzeigen (Anzahl: 1)
@gore
Danke für den Hinweis, aber wenn ich das mit Sysnative umsetze, erhalte ich von Shellexecute() die Rückmeldung 3 (Datei nicht gefunden). Also rufe ich generell '%WinDir%\system32\osk.exe' auf.

@all
Aber - und jetzt wird es verrückt - ich habe eine nachvollziehbare, aber nicht praktikable Lösung gefunden.

Ich habe zwei Schaltflächen:
1. Schaltfläche ist Version 1 mit ChangeFSRedirection()
2. Schaltfläche ist Version 2 mit IsProcess32OnWin64 von gore
  • Klick auf Schaltfläche 2 -> Shellexecute = 5; Windows meldet: Could not start On-Screen Keyboard.
  • Klick auf Schaltfläche 1 -> Shellexecute = 42; Und plötzlich startet die Bildschirmtastatur :shock:
  • bei jedem weiteren Klick auf Schaltfläche 1 oder 2 startet die BST wieder mit 42

Danach schließe ich das kleine Testprogramm:
  • Ich starte mit Klick auf Schaltfläche 1 -> Shellexecute = 5; nichts passiert (so wie bisher)
  • Klick auf Schaltfläche 2 -> Shellexecute = 5; nichts passiert (so wie bisher)
  • bei jedem weiteren Klick auf Schaltfläche 1 oder 2 passiert nichts

Ich kann mir das Verhalten nicht erklären. Also habe ich versucht, eine Mischung von beidem zu erstellen, aber dann habe ich wieder Shellexecute() mit Rückgabe von 5.

Delphi-Quellcode:
  IsProcess32OnWin64(GetCurrentProcess); // von gore

  ChangeFSRedirection(true); // Redirect stoppen
  Path := CreateCorrectWinDir('%WinDir%\system32\osk.exe');
  Memo1.Lines.Add('start von ' + Path);
  isStarted := ShellExecute(0, 'open', PChar(Path), '', '', SW_SHOWNORMAL);
  Memo1.Lines.Add('isStarted : ' + IntToStr(isStarted));
  ChangeFSRedirection(false); // Redirect wieder starten
Ich bin echt am Verzweifeln. Langsam muss ich davon ausgehen, dass an meinen frisch installierten, englischen Windows 7 64 Bit irgendetwas nicht funktioniert.

Könntet Ihr daher bitte noch einmal mein Testprogramm (bereits kompiliert) probieren und mir Eure Ergebnisse unter Eurem Windows 7 64Bit durchgeben?

Dezipaitor 15. Nov 2010 18:59

AW: Windows 7 64Bit Redirection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Probier mal die angehängte Version

Assarbad 15. Nov 2010 19:59

AW: Windows 7 64Bit Redirection
 
Zitat:

Zitat von gore (Beitrag 1061591)
Solange man mit Delphi keine 64bit Programme erzeugen kann, reicht folgendes:
Delphi-Quellcode:
  if IsProcess32OnWin64(GetCurrentProcess) then Exe:='%WinDir%\Sysnative\osk.exe' else Exe:='%WinDir%\system32\osk.exe';

Auch bis zum Ende gelesen zum Thema SysNative? :zwinker:

Zitat:

Zitat von gore (Beitrag 1061591)
IsProcess32OnWin64 ist gleichbedeutend mit Deiner Is64BitViaRegistry (und ist auch Microsoft konform).

Leider nein. Ich habe auch auf 32bit-Systemen schon die Wow...Node gesehen. Da setzt man sich in die Nesseln. Lieber die Methode mit MSDN-Library durchsuchenIsWow64Process (wie in deinem Beitrag) oder MSDN-Library durchsuchenGetNativeSystemInfo (s.o.).

Dezipaitor 16. Nov 2010 00:40

AW: Windows 7 64Bit Redirection
 
Vergiß alles, ich hab mich gerade damit etwas beschäftigt.
Unter XE kann man Osk.exe einfach ausführen. Im 64bit Explorer geht es nicht.

Hier wird geraten, dass .NET mit abgeschalteten Redirection nicht funktioniert. Das Shell zeugs mit ShellExecute geht alles außerdem über COM, denn ich bekomme, wenn ich
Delphi-Quellcode:
CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
verwende, eine Prozedur wurde (im Modul) nicht gefunden. D.h. das alles ist in Windows ganz tief drin, denn osk.exe ist ja auch in der WhiteList für AutoElevation.
Delphi scheint da irgendetwas mit .NET inuts zu haben, damit es funktioniert.

amigage 16. Nov 2010 10:15

AW: Windows 7 64Bit Redirection
 
Also wieder Start bei 0 :pale:

Könntet Ihr bitte einmal meine osk.zip ausprobieren, ob ihr den o.g. Ablauf auch bei Euch bestätigen könnt.

Danke.

Dezipaitor 16. Nov 2010 16:42

AW: Windows 7 64Bit Redirection
 
Mit FreePascal eine kleine 64bit App bauen, die das für dich macht. Vielleicht gehts so.

Dezipaitor 29. Nov 2010 17:37

AW: Windows 7 64Bit Redirection
 
Wie man das 64Bit OnScreenKeyboard starten kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr.
Seite 3 von 3     123   

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