2015-11-02 66 views
5

对话框我有这个小PROGRAMM,这是intened显示Windows文件/文件夹属性对话框中指定的info.lpFile打开Windows文件/文件夹的属性由C

#include <windows.h> 

main() { 
    SHELLEXECUTEINFO info = {0}; 

    info.cbSize = sizeof(SHELLEXECUTEINFO); 
    info.lpFile = "C:\\test.txt"; 
    info.nShow = SW_SHOW; 
    info.fMask = 0x00000000; 
    info.lpVerb = "properties"; 

    ShellExecuteEx(&info); 
} 

当我编译并执行它,我得到以下错误信息:

Error message

我使用Win7和MinGW的gcc编译器。有人知道我的代码有什么问题吗?我错过了什么吗?

+0

您可能会为'fMask'尝试'SEE_MASK_INVOKEIDLIST'。 – alk

+0

我试过了,但程序只是挂着这个面具。 – polis

+0

你的代码未能初始化(其余)'info' – alk

回答

4

所示的第一个代码没有正确初始化info

要修正这种变化

SHELLEXECUTEINFO info; 

SHELLEXECUTEINFO info = {0}; 

2ndly使用SEE_MASK_INVOKEIDLISTSHELLEXECUTEINFO的构件fMask

供您参考:https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784%28v=vs.85%29.aspx

请注意,以查看属性窗口打开,调用代码必须不会立即结束。所以添加如

Sleep(10000); 

到您的测试代码的末尾,如图所示。


完整的代码,对我的作品:

#include <windows.h> 

int main(void) 
{ 
    SHELLEXECUTEINFO info = {0}; 

    info.cbSize = sizeof info; 
    info.lpFile = L"C:\\tmp\\tmp.txt"; 
    info.nShow = SW_SHOW; 
    info.fMask = SEE_MASK_INVOKEIDLIST; 
    info.lpVerb = L"properties"; 

    ShellExecuteEx(&info); 

    Sleep(10000); 
} 

编译选项:

/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\SOxyzConsoleEmpty.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /TC /analyze- /errorReport:queue 

(测试用VS2010,运行Windows 7)

+0

你的意思是它用这个面具为你工作?对我来说,它会挂起,而没有别的。 – polis

+0

太棒了!谢谢。 – polis

+0

如果用户关闭了打开的文件属性对话框,C程序仍会执行,因为长时间的Sleep()。如何在属性对话框关闭时终止C程序的执行? – polis

-1

我开始通过初始化信息:

SHELLEXECUTEINFO info = {0}; 

然后,我想尝试下HKEY_CLASSES_ROOT\txtfile\shell

info.lpVerb = "open"; 

我强烈怀疑会工作,实际上在注册表中存在一个动词。问题是,explorer不会启动应用程序来显示文件的属性 - 它的内置功能。文件上下文菜单中的每一项功能都不是可以通过ShellExecute调用的动词。

如果你想调用的特性上下文菜单项的文件 - 您将需要查询表示文件夹的IShellFolder,叫GetUIObjectOf得到IContextMenu的文件,然后你就可以调用InvokeCommand上。

有关信息,请参阅MSDN上的Getting Information About the Contents of a Folder

+1

这个人想打开文件的属性(对话)而不是文件本身。 – alk

+0

首先获取适用于简单案例的代码。 –