shellexecuteがC ++のファイル関連のために失敗した場合、ウィンドウのデフォルトダイアログを開く方法?

StackOverflow https://stackoverflow.com/questions/6364879

質問

Windows ShellexeCute関数を使用して、ファイルに正しい関連付けがある限り、問題なくファイルを開くことができます。

関連付けが存在しない場合は、デフォルトのWindowsダイアログを使用してファイルを開きたいと思います。

image

これは可能ですか?もしそうなら?

役に立ちましたか?

解決

文書化 仕方 ダイアログを示すことは、Openas動詞を使用することです。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.fMask = SEE_MASK_NOASYNC;
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = "openas";
sei.lpFile = "C:\\yourfile.ext";
ShellExecuteEx(&sei);

下をチェックする場合 HKEY_CLASSES_ROOT\Unknown\shell\openas これは、shell32で(文書化されていない)openas_rundllエクスポートを呼び出すことと同じであることがわかります。

他のヒント

実行する RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open

明示的な動詞を使用しないでください。 「オープン」のような特定の動詞を使用することは大きな間違いです。

  • 「Open」はデフォルトの動詞ではない場合があります(たとえば、「プレイ」、「編集」、「実行」)
  • 「オープン」は存在しない場合があります

それはより正しい方法です 動詞としてnullを渡すだけです. 。システムは、最も適切な動詞を自動的に選択します。

  • 設定されている場合、デフォルトの動詞が使用されます
  • デフォルトの動詞が設定されていない場合、「開く」動詞が使用されます
  • デフォルトと「開いた」動詞が利用できない場合、最初の動詞が使用されます
  • 動詞が割り当てられていない場合 - システムは「オープン」ダイアログをもたらします

言い換えれば、シンプルです

ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);

「Open with」ダイアログが表示されます。

aのみを使用します 明確な 動詞aが必要な場合 明確な アクション。たとえば、「印刷」、「探検」、「ranas」。それ以外の場合は、nilを渡すだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top