2015-11-02 76 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

首先獲取適用於簡單案例的代碼。 –