再谈CAB打包
在M8上进行开发,很多人之所以用Wince_cab_manager来进行CAB打包的 主要的原因 恐怕是为了在M8的桌面显示中文。
(Windows Mobile SDK自带的CAB打包工具:Cabwiz.exe;cabwiz.ddf,不能正确解析.inf文件包含的中文)
刚开始,我也是这样想的,但是后来发现,M8的MiniOneShell是通过读取注册表来遍历显示桌面上的应用程序与图标的,
所以我们只要修改我们自己的注册表信息即可。
#define KXYZDesktopDisplayName (TEXT("软件名称")) #define KXYZSoftWareAbb (TEXT("MYSW")) HKEY hKey; LPTSTR szSubKey = new TCHAR[MAX_PATH]; memset(szSubKey,0,sizeof(TCHAR)*MAX_PATH); wcscpy_s(szSubKey,MAX_PATH,_T("SOFTWARE\\Meizu\\MiniOneShell\\Main\\")); wcscat_s(szSubKey,MAX_PATH, KXYZSoftWareAbb ); LONG nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,szSubKey,0,0,&hKey); delete []szSubKey; szSubKey = NULL; if(ERROR_SUCCESS == nResult) { RegSetValueEx(hKey,_T("DisplayName"), 0, REG_SZ, (LPBYTE)KXYZDesktopDisplayName, wcslen(KXYZDesktopDisplayName)*sizeof(TCHAR)); RegCloseKey(hKey); }
除了以上修改的地方,还需要修改一个地方,否则在M8上用优化精灵查看应用程序或者卸载的时候,看到的软件的名称还是英文字符的:
//以下两个字段的内容来自.inf文件 //故修改inf文件中的以下内容 也需要同时修改该部分 /* * [Version] * Signature="$Windows NT$" * CESignature="$Windows CE$" * Provider="your corporation" */ #define KXYZProviderName (TEXT("your corporation")) // /* * [CEStrings] * AppName="ruanjianmingzi" */ #define KXYZAppName (TEXT("ruanjianmingzi")) LPTSTR szAppSubKey = new TCHAR[MAX_PATH]; memset(szAppSubKey,0,sizeof(TCHAR)*MAX_PATH); wcscpy_s(szAppSubKey,MAX_PATH,_T("SOFTWARE\\Apps\\")); wcscat_s(szAppSubKey,MAX_PATH,KXYZProviderName); wcscat_s(szAppSubKey,MAX_PATH,_T(" "));//space wcscat_s(szAppSubKey,MAX_PATH,KXYZAppName); HKEY hAppKey; nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szAppSubKey,0,0,&hAppKey); delete []szAppKey; szAppKey = NULL; if(ERROR_SUCCESS == nResult) { RegSetValueEx(hAppKey,_T("DisplayName"), 0, REG_SZ, (LPBYTE)KXYZDesktopDisplayName, wcslen(KXYZDesktopDisplayName)*sizeof(TCHAR)); RegCloseKey(hAppKey); }
将以上代码放在SetupDll中的Install_Exit函数的末尾。
当然如果你担心安装程序没有自动刷新桌面的话,在M8上可以使用如下的API:(本人觉得以下的API主要用于通过RAPI来安装程序什么的)
1 /**
2 * @brief 通知Shell重新刷新桌面上的图标,用于安装程序后图标
3 * 更新
4 * @return TRUE, 成功; FALSE, 失败
5 */
6 BOOL ReloadDesktopIcons();
推而广之,Windows Mobile上的快捷方式,也可以通过修改快捷方式即可。
当然你需要写一个Setupdll。