winapishellexecutefileopendialog

How to open a default dialog for window if ShellExecute fails due to no file association in C++?


I can use the windows ShellExecute function to open a file with no problems so long as the file has a correct association.

If no association exists i would like to use the default windows dialog to open the file:

image

Is this possible? If so how?


Solution

  • The documented way to show that dialog is to use the openas verb.

    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);
    

    If you check under HKEY_CLASSES_ROOT\Unknown\shell\openas you see that this is the same as calling the (undocumented) OpenAs_RunDLL export in shell32.