ShellExecute(Ex)带有'properties'动词

时间:2016-11-08 15:56:35

标签: c++ visual-studio properties windows-10 shellexecute

我正在尝试编写一个程序,它从命令行打开文件的属性。我读到可以使用ShellExecute和ShellExecuteEx中的任何一个函数和'properties'动词。

所以,我在Visual Studio for Windows 10中编写了这样一个C ++程序。这就是程序:

#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();
}

如果我使用有效的文件名(例如。或者可执行文件本身的名称)从命令行运行程序,它输出的全部是文件名和零(没有错误),但是属性是文件无法打开。

现在,我已经看到其他人有这个问题,即'属性'动词没有做任何事情或他们得到一个消息框说文件类型没有关联的程序操作,但我一直无法找到解决办法。

这里有人可以帮助我吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在SHELLEXECUTEINFO中传递SEE_MASK_NOASYNC(0x00000100)标志,告诉ShellExecuteEx您在没有消息循环的情况下调用它,并且在完成之前不要返回。

请参阅MSDN上SHELLEXECUTEINFO文档中的评论。

Sleep()既不必要也不推荐。