2013-09-30 1 views
2

Sous Windows 8, j'ai essayé d'exécuter le code ci-dessous pour afficher l'ancien Windows 7 Picture Viewer, mais il renvoie une erreur. Sur Windows 8, je peux trouver C: \ Program Files (x86) \ Windows Photo Viewer \ PhotoViewer.dll mais je pense que c'est l'application de métro Windows 8 plus récente. Je pense que l'ancien Windows Picture Viewer est 'c: \ windows \ system32 \ shimgvw.dll. Je voudrais prévisualiser l'image avec le style d'application de bureau plutôt que Metro.Afficher Windows 7 Windows Picture Viewer sous Windows 8

J'ai essayé les deux, mais les deux retournent que le fichier n'a pas de programme associé? Qu'est-ce que je fais?

var 
SEInfo: TShellExecuteInfo; 
ExitCode: DWORD; 
ExecuteFile, ParamString, StartInString: string; 

ExecuteFile:='c:\windows\system32\shimgvw.dll'; 
FillChar(SEInfo, SizeOf(SEInfo), 0) ; 
SEInfo.cbSize := SizeOf(TShellExecuteInfo); 
with SEInfo do begin 
    fMask := SEE_MASK_NOCLOSEPROCESS; 
    Wnd := Application.Handle; 
    lpFile := PChar(ExecuteFile); 
    nShow := SW_SHOWNORMAL; 
    lpParameters := PChar('ImageView_Fullscreen'); 
end; 
if ShellExecuteEx(@SEInfo) then begin 
repeat 
    Application.ProcessMessages; 
    GetExitCodeProcess(SEInfo.hProcess, ExitCode) ; 
until (ExitCode <> STILL_ACTIVE) or Application.Terminated; 
    ShowMessage('Windows Picture Viewer terminated') ; 
end 
    else ShowMessage('Error starting Windows Picture Viewer') ; 

Je ne l'ai pas utilisé ShellExecuteEx avant donc la base du code est venu de here.

+0

Pouvez-vous être plus précis que "ça retourne une erreur"? Et si vous voulez prévisualiser une image, pourquoi êtes-vous en train de coder en dur l'application qui affichera l'image? Pourquoi ne transmettez-vous pas l'image à l'interpréteur de commandes et lui demandez de l'afficher en aperçu? –

+0

Windows affiche le message d'erreur à ShellExecuteEx (@SEInfo) et le code de sortie après le message dans le débogueur est 69627776. – Bill

+0

Lorsque je passe le nom de l'image à l'interpréteur de commandes, il exécute l'application de métro. – Bill

Répondre

6

shimgvw.dll est une DLL. Vous ne pouvez pas exécuter une DLL directement, vous devez charger la DLL et y appeler une fonction exportée.

Si vous regardez le Registre sur un système Windows 7, vous verrez c'est ce que l'explorateur fait pour appeler la visionneuse de photos:

%SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen %1 

rundll32.exe est un outil qui est fourni avec Windows qui existe uniquement à la charge une DLL et invoquer une fonction en son sein. Vous pouvez donc utiliser rundll32.exe pour cela, ou charger la DLL avec LoadLibrary(), trouver la fonction export avec GetProcAddress() et appeler la fonction vous-même.

(et notez aussi que sur Windows 7, c'est PhotoViewer.dll qui contient le Photo Viewer, pas shimgvw.dll Je ne sais pas quelle est la situation sur Windows 8).

Questions connexes