4

デスクトップアプリケーションは、Windows XP、Windows Vista、Windows 7などで実行されています(これはCOBOLで記述されていますが、この場合は関係ないと思います)。

ソースコードでは、を使用ShellExecuteExして呼び出しますopen
この後、呼び出されたプログラムの終了を待つために、を使用して呼び出しWaitForSingleObjectますinfinite

それは問題なく動作していますが、Windows-7でのみ動作します-画像とデフォルトの画像ビューアを備えたマシンで問題が発生します。

jpgまたはtifファイルShellExecuteExに対してが呼び出され、マシンにデフォルトのWindowsイメージ/フォトビューアーしかない場合、エラーが発生します。WaitForSingeObject戻っWAIT_FAILEDGetLastError()言う:INVALID_HANDLE

これは、Picasa Photo Viewer、Evince Windowsバージョン、JPEGViewなどの別の画像ビューアがあるWindows7では発生しません。

Windows7およびのデフォルトの画像ビューアのどこに問題があるのか​​わかりませんShellExecuteExShellExecuteExエラーコードを返しません!

よろしくお願いします。

更新:ご回答ありがとうございます。

@David Heffernan:あなたが言ったように、それが機能しない場合、ShellExecuteExのリターンコード(hInstApp)は42(ok!)であり、hProcessはNULLです!(開始された唯一の新しいプロセスはdllhost.exeでした。)

しかし、私は別のWindows7マシンですべてをテストしました。この場合、私は次のことを行いました
。-このマシンでは、Picasaがデフォルトのビューアでした。
-デフォルト(Windowsフォトビューアー)に戻しました。
- 機能した!
-次に、フォトビューアを閉じずに、アプリケーションで[表示]をもう一度押しました。-Windowsフォトビューアーが既に実行されている場合でも、機能しました(ビューアーの新しいインスタンスがポップアップしました)。

4

1 に答える 1

5

最新のWindowsバージョンの画像の動詞のデフォルトハンドラーはopen、新しいプロセスを呼び出さない場合があります。すでに実行中のシェルプロセスで画像が表示されるだけかもしれません。その場合、返されるプロセスハンドルはですNULL。それがここで起こっていることであり、それがWaitForSingleObjectあなたが説明した方法でへの呼び出しが失敗する理由です。

のドキュメントSHELLEXECUTEINFOはこれをカバーしています:

fMaskがSEE_MASK_NOCLOSEPROCESSに設定されている場合でも、プロセスが起動されていない場合、hProcessはNULLになります。たとえば、起動するドキュメントがURLであり、Internet Explorerのインスタンスがすでに実行されている場合、ドキュメントが表示されます。新しいプロセスは起動されず、hProcessはNULLになります。

これが意味することは、プログラムのその部分の設計が欠陥のある仮定に基づいているということです。つまり、呼び出しShellExecuteExによって、終了を待つことができるプロセスハンドルが常に生成されるという仮定です。問題を解決する他の方法を見つける必要があります。

于 2013-03-19T13:09:03.060 に答える