ShellExecute (Ex) с глаголом ‘properties’

Я пытаюсь написать программу, которая открывает свойства файла, из командной строки. Я прочитал, что это можно сделать, используя любую из функций ShellExecute и ShellExecuteEx, с глаголом ‘properties’.

Я написал такую программу на C++ в Visual Studio для Windows 10. Это та программа:

#include <windows.h>
#include <iostream>
void ShowFileProperties(char *);
int main(int argc, char **argv)
{
    if (argc >= 2)
    {
        std::cout << argv[1] << std::endl;
        ShowFileProperties(argv[1]);
    }
    std::cout << GetLastError();
    return 0;
}

void ShowFileProperties(char *szPathName)
{
    HRESULT result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    SHELLEXECUTEINFO Sei;
    ZeroMemory(&Sei,sizeof(SHELLEXECUTEINFO));
    Sei.cbSize = sizeof(SHELLEXECUTEINFO);
    Sei.lpFile = szPathName;
    Sei.nShow = SW_SHOW;
    Sei.fMask = SEE_MASK_INVOKEIDLIST;
    Sei.lpVerb = "properties";
    ShellExecuteEx(&Sei);
    if (result == S_OK || result == S_FALSE)
        CoUninitialize();
}

Если я запускаю программу из командной строки с допустимым именем файла (например . или имя самого исполняемого файла), все это выводит имя файла и ноль (ошибки не было), но свойства файла не открываются.

Теперь, я видел, что у других людей есть эта проблема, т. е. что’ properties ‘ глагол ничего не делает или что они получают messagebox говоря, что filetype не имеет связанной программы для операции, но я не смог найти исправление.

Здесь есть кто-нибудь, кто может мне помочь?

Спасибо заранее.

1 ответ

  1. Передайте флаг SEE_MASK_NOASYNC (0x00000100) в SHELLEXECUTEINFO, чтобы сообщить ShellExecuteEx, что вы вызываете его без цикла сообщений, и не возвращаться, пока он не закончит.

    См. примечания в документах SHELLEXECUTEINFO на MSDN.

    Sleep() не является ни необходимым, ни рекомендуемым.