2011-12-08 40 views
0

我遇到的這個問題很容易重現。創建文件擴展名的基本MFC MDI應用程序使用Visual Studio 2010中的應用程序的默認代碼容易寄存器通過調用文件關聯名爲.xyz:在MFC中註冊文件關聯不適用於Windows 7

// Enable DDE Execute open 
EnableShellOpen(); 
RegisterShellFileTypes(TRUE); 

的問題是,內部RegisterShellFileTypes(TRUE),呼叫失敗下方:

if (!_AfxSetRegKey(strFileTypeId, strFileTypeName)) 
    continue;  // just skip it 

該文件顯然沒有被註冊,它不採用應用程序分配的文件圖標。我想要的只是當雙擊註冊文件類型(在本例中爲.xyz)時,它應該在應用程序中打開,但它不會。什麼可能缺少..如何使這項工作?

+0

你有UAC嗎? –

+0

不知道!我的應用程序假設可以在任何Windows 7機器上運行,所以我寧願使用通用解決方案。 – zar

+0

註冊應用程序擴展需要管理員權限。如果您以管理員身份運行您的應用程序,它會工 –

回答

3

微軟多年來一直在改變註冊擴展的概念。從Vista開始,預計將在安裝時使用具有管理權限的安裝應用程序註冊擴展。將擴展映射到應用程序所需的註冊表鍵現在位於註冊表的受保護區域中。你要求的是不再可能的。

+0

您可能想提到UAC提升而不是管理員權限。作爲管理員是不夠的。 –

0

您需要管理員權限才能完成此操作。通常,你應該讓你的安裝程序註冊你的文件。然而,這是可以做到,如果你明確地提升(並重新運行)的文件類型註冊前處理:

// In your InitInstance, do the following: 
OSVERSIONINFOEX osvi; 
osvi.dwOSVersionInfoSize = sizeof OSVERSIONINFOEX; 
GetVersionEx((OSVERSIONINFO*)&osvi); 

if (osvi.dwMajorVersion >= 6) // XP or Vista/elevated? 
{ 
    TCHAR exePath[MAX_PATH]; 
    GetModuleFileName(NULL, exePath, MAX_PATH); 
    ShellExecute(NULL, _T("runas"), exePath, NULL, NULL, SW_SHOWNORMAL); 
    return FALSE; 
} 
+0

這會啓動我的應用程序的新實例,這是不可取的。我想用相同的實例註冊這些文件。 – zar

0

由於Parapura拉庫瑪提到的,如果你把這個代碼在您的初始化實例:

// Enable DDE Execute open 
EnableShellOpen(); 
RegisterShellFileTypes(TRUE); 

應用程序應至少運行一次admin(右鍵單擊並以管理員身份運行)以在Windows註冊表中註冊文件類型。

相關問題