在魅族M8手机(WinCE6.0系统)上设置文件关联,需生成以下注册表项:
HKEY_CLASSES_ROOT/.xxx
defaultvalue: xxxfile
HKEY_CLASSES_ROOT/FileAssociate/xxxfile/shell
defaultvalue: <path_of_exe>
HKEY_CLASSES_ROOT/FileAssociate/xxxfile
DefaultIcon: <path_of_icon>
其中 xxx 指代欲关联的文件名后缀,<path_of_exe> 指代欲关联到的EXE文件,<path_of_icon> 为被关联文件的默认显示图标。
此外,<path_of_exe> 启动后应读取进程命令行,GetCommandLine()返回值(如果非空)即为其欲打开的关联文件。
以下是设置文件关联的代码:
bool RegisterJarFile() { bool bOK = false; HKEY hKeyJar = 0; DWORD dwDisposition = 0; RegCreateKeyEx(HKEY_CLASSES_ROOT, L".jar", 0, NULL, 0, 0, NULL, &hKeyJar, &dwDisposition); if(hKeyJar) { if(RegSetValueEx(hKeyJar, NULL, 0, REG_SZ, (const BYTE*)L"jarfile", wcslen(L"jarfile")*sizeof(WCHAR)) == ERROR_SUCCESS) { HKEY hKeyJarFile = 0; const WCHAR* szJarFile = L"FileAssociate//jarfile"; RegCreateKeyEx(HKEY_CLASSES_ROOT, szJarFile, 0, NULL, 0, 0, NULL, &hKeyJarFile, &dwDisposition); if(hKeyJarFile) { WCHAR buffer[256] = {0}; GetFullPathFileName(buffer, 256, L"jar.png"); RegSetValueEx(hKeyJarFile, L"DefaultIcon", 0, REG_SZ, (const BYTE*)buffer, wcslen(buffer)*sizeof(WCHAR)); HKEY hKeyShell = 0; RegCreateKeyEx(hKeyJarFile, L"shell", 0, NULL, 0, 0, NULL, &hKeyShell, &dwDisposition); if(hKeyShell) { GetFullPathFileName(buffer, 256, L"m8jad.exe"); bOK = (RegSetValueEx(hKeyShell, NULL, 0, REG_SZ, (const BYTE*)buffer, wcslen(buffer)*sizeof(WCHAR)) == ERROR_SUCCESS); RegCloseKey(hKeyShell); } RegCloseKey(hKeyJarFile); } } RegCloseKey(hKeyJar); } return bOK; }
以下是处理命令行的代码:
virtual BOOL OnInitDialog() { //...... WCHAR* szCommandLine = GetCommandLine(); if(szCommandLine && szCommandLine[0]) { CreateJad(szCommandLine); } //...... }
强调几点:xxxfile 位于 HKEY_CLASSES_ROOT/FileAssociate 之下,而非 HKEY_CLASSES_ROOT,其下的 "shell" 而非 "shell/open/command",shell 的键值是 "<path_of_exe>" 而非 "<path_of_exe> %1",GetCommandLine()返回值即是系统传入的命令行参数(不包括本进程文件名)。以上几点与桌面PC编程有较大不同。