﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Do What You think !!-文章分类-Windows Mobile </title><link>http://www.cppblog.com/kuronca/category/3941.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 07:35:32 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 07:35:32 GMT</pubDate><ttl>60</ttl><item><title>Windows Moible 打包过程2</title><link>http://www.cppblog.com/kuronca/articles/21818.html</link><dc:creator>零宇</dc:creator><author>零宇</author><pubDate>Fri, 13 Apr 2007 10:21:00 GMT</pubDate><guid>http://www.cppblog.com/kuronca/articles/21818.html</guid><wfw:comment>http://www.cppblog.com/kuronca/comments/21818.html</wfw:comment><comments>http://www.cppblog.com/kuronca/articles/21818.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cppblog.com/kuronca/comments/commentRss/21818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuronca/services/trackbacks/21818.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 离第一篇文章有些日子了，由于我的失误，不少朋友都没看到图片。在这期间，有不少朋友来信说，有没有方法做一个桌面的安装程序？运行程序前， 必须还要装其他程序（比如SqlMobile， .NetCompactFrameWork等等），有没有方法能把它们做到一个安装包中？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好， 让我们开始。首先， 让我们看看有几种方案。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实， 大家到网上随便一艘就能搜到第一种方案，手把手教大家怎么做桌面安装程序，这是直接用vs2005，不过我好像没看到C++版的（全是vb.net和C#的）。<br>&nbsp;&nbsp;&nbsp;&nbsp; 第二种方案就是利用现有的打包工具，这个我没试过；<br>&nbsp;&nbsp;&nbsp;&nbsp; 第三种方案和第一种差不多。不过比第一种简单，都是先要写一个安装的INI文件， 然后调用CEAppMgr.exe程序，把INI文件传给它。不过这用方案不能定制自己的安装界面。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而且，某些朋友还需要和自己程序安装的时候同时安装其他程序。最好的方法是，在用户点击我们桌面安装程序的时候， 把所有的需要的程序都安装好。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，我们来考虑解决以上问题的方案。这种方案必须能满足以下几点：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1） 安装程序用vc++写；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2） 能够定制界面；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3） 能够同时安装多个.cab程序；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，我们必须知道Win Mobile 上怎么安装程序的。在Win Mobile 上，有个安装程序的程序叫 wceload.exe，它的用法是：把你要安装的程序包路径传给它做参数即可（有点必须注意：必须在你的参数字符串两边加上双引号，具体用法见demo）。为实现远程安装， 我们可以先把安装Cab包拷贝PDA上，然后远程调用安装程序，实现安装。</p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二，既然我们想定制界面，做安装程序最简单的就是用 CPropertySheet 和 CPropertyPage 。为了简单，我们在demo中就采取这种方法；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三，要实现多个cab安装，也很简单。记得，我们在上篇文章中记得那个安装DLL吗？我们可以利用那个实现多个cab安装。我们先可以把我们要安装的包做为文件增加到的&#8220;应用程序文件&#8221;项，然后在dll中调用安装程序进行安装。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK,&nbsp;&nbsp; 现在这种方案都能满足以上要求。大家思路有点印象没，如果还不清楚，请继续跟我往下走。我们开始写程序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们打开vs2005, 新建一个基于MFC对话框程序名为SetupOnPC，注意选中静态链接。我们就可以向其中加入我们要定制界面的CPropertySheet 和 CPropertyPage 的继承类。具体过程，我省略。请查看源码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们要在 头文件 stdafx.h&nbsp; 中加入 #include &lt;rapi.h&gt;&nbsp;&nbsp;&nbsp;//远程API头文件， 其次还要把它们.H和.lib文件引用路径加入到vs2005中。路径为：安装路径\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Activesync\Inc(Lib)。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面，我们开始写代码， 过程省略（请看源码）。由于，我们需要把多个包一起安装，所以我们要改进上次写的CabSample的setupdll的代码。主要是流程如下：先检测已安装的程序（组件），然后选择未安装的安装。具体代码参见demo。今天的例子，我们以sqlmobile为例，怎么让它和我们一起安装。鉴于，sqlmobile的安装包名字太长， 我给它们重命名。（一共三个，分别叫：SqlMobile1，SqlMobile2，SqlMobile3）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK ， 全部结束。不懂的地方参见源码，下面是运行图。<br><img height=291 alt="" src="http://www.cppblog.com/images/cppblog_com/kuronca/1.JPG" width=441 border=0><br><br>检测PDA连接情况（未连上），如果点第二个框框再检测 如下图<br><img height=294 alt="" src="http://www.cppblog.com/images/cppblog_com/kuronca/2.JPG" width=441 border=0><br>检测到后， 下一步才能继续， 如下图<br><img height=292 alt="" src="http://www.cppblog.com/images/cppblog_com/kuronca/3.JPG" width=441 border=0><br>拷贝安装文件<br><img height=292 alt="" src="http://www.cppblog.com/images/cppblog_com/kuronca/4.JPG" width=440 border=0><br>安装成功， 如下图<br><img height=294 alt="" src="http://www.cppblog.com/images/cppblog_com/kuronca/5.JPG" width=439 border=0><br>PC端，全部执行完毕。你看你的pda或者模拟器已经在安装程序或者安装好了。<br>到此，全过程结束。需要说明下就是， 我们的程序最好选用静态+release 编译，生成的程序直接可以考到客户PC运行，无须再打包。另外，由于本程序用刀ce RAPI 所以，在我们的程序文件中，当然要包括以下2个dll 文件：rapi.dll 和 ceutil.dll 。这两个文件一般装过ActinveSync就会在系统文件中有。另外，我们的程序文件夹中，要包括你要安装的.cab文件。OK, 现在全部结束。由于，demo超过2 M大小，想要源码的留下Email。<br>请大家到下面这个网址去下载demo吧 <br><a href="http://www.winbile.net/BBS/1016029/ShowPost.aspx" target=_new><font color=#2e9ce9>http://www.winbile.net/BBS/1016029/ShowPost.aspx</font></a><br>
<img src ="http://www.cppblog.com/kuronca/aggbug/21818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuronca/" target="_blank">零宇</a> 2007-04-13 18:21 <a href="http://www.cppblog.com/kuronca/articles/21818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Mobile 打包过程</title><link>http://www.cppblog.com/kuronca/articles/21118.html</link><dc:creator>零宇</dc:creator><author>零宇</author><pubDate>Mon, 02 Apr 2007 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/kuronca/articles/21118.html</guid><wfw:comment>http://www.cppblog.com/kuronca/comments/21118.html</wfw:comment><comments>http://www.cppblog.com/kuronca/articles/21118.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/kuronca/comments/commentRss/21118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuronca/services/trackbacks/21118.html</trackback:ping><description><![CDATA[<p>博客刚开，思绪比较乱，一时想不起来写什么！就把最近搞的关于如何将ppc应用打包的心得写出来，共享给各位朋友！其实，我想有很多高手都知道怎么建立一个完整的打包程序，只是由于各种原因没人写一篇完整的文章，故小弟在研究几天之后做到功能基本完善。使我辈朋友少走弯路，<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emwink.gif" align=absMiddle border=0>&nbsp;！我说的功能基本完善是指：<br>&nbsp;&nbsp;&nbsp;1）在ppc今日屏幕中， 有你的程序快捷方式（今日插件）；<br>&nbsp;&nbsp;&nbsp;2）能够建立中文快捷方式；&nbsp;&nbsp;&nbsp;<br>哈哈，其实就这么多！再多，我也讲不出来！其实没啥技术含量， 大家别见笑！ok，让我们开始，你可以按照我说的步骤一步一步建立工程写代码，也可以直接下载Demo源码查看（建议前一种）！<br><br>第一步：建立应用程序。我们打开VS2005，新建一个SmartDevice的应用程序工程项目，我们暂且叫做：CabSample。然后一直往下，直到建立程序，最后编译生成执行程序。ok,&nbsp;第一步完成。（图略&nbsp;）<br><br>第二步：建立今日插件。关于怎么写今日插件，我不想多说。网上的代码也比较多，在此我给个链接，它比较详细阐述了今日插件。<a href="http://www.codeguru.com/cpp/w-p/ce/pocketpc/article.php/c9269__1/"><font color=#5d5d5d>http://www.codeguru.com/cpp/w-p/ce/pocketpc/article.php/c9269__1/</font></a><br><br>&nbsp;下面是具体步骤：1）在刚才新建的项目中，新建一个工程。该工程是基于SmartDevice的dll项目，我们把工程名定为：MyToday 。如下图所示：<br><br><br>然后一直向下，一直到工程设置选项，在工程类型中选择 dll ， 点击完成即可。如图：<br>下面我们来完成今日插件代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先，我们向 今日插件 工程中加入一个图标(ID_ICON1)，表示你的应用程序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后，我们在工程的source文件夹中加入.def文件，名字任取，例如：MyToday.def<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并在刚才所加文件中写下如下内容：<br>EXPORTS<br>&nbsp;InitializeCustomItem&nbsp;&nbsp;@240<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再然后，我们完善插件执行代码。我贴出主要代码，具体见demo。注意，在写代码前一定要加入 &lt;todaycmn.h&gt; 头文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后编译，生成&nbsp;MyToday.dll<br><br>MyToday主要源码：<br>LRESULT CALLBACK WndProc (HWND hWnd, UINT uimessage, WPARAM wParam, LPARAM lParam) <br>{<br>&nbsp;switch (uimessage)<br>&nbsp;{&nbsp;&nbsp;&nbsp; <br>&nbsp;case WM_TODAYCUSTOM_QUERYREFRESHCACHE: <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;TODAYLISTITEM *ptli = (TODAYLISTITEM *)wParam;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;if (NULL == ptli)<br>&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;if (0 == ptli-&gt;cyp)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;ptli-&gt;cyp = PLUG_HEIGHT;<br>&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;break;&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;case WM_CREATE: &nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;<br>&nbsp;case WM_LBUTTONUP: <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;// 1 判断是否在 有效区域，2 查询注册表， 得到程序路径， 3 启动程序<br>&nbsp;&nbsp;&nbsp;RECT rect;<br>&nbsp;&nbsp;&nbsp;POINT point;<br>&nbsp;&nbsp;&nbsp;point.x = LOWORD(lParam);<br>&nbsp;&nbsp;&nbsp;point.y = HIWORD(lParam);<br>&nbsp;&nbsp;&nbsp;::GetClientRect(hWnd, &amp;rect);<br>&nbsp;&nbsp;&nbsp;if(PtInRect(&amp;rect, point))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hOpenKey;<br>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;lResult&nbsp;&nbsp;= 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;iValueType&nbsp;= 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;iLen&nbsp;&nbsp;= 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;PROCESS_INFORMATION&nbsp;&nbsp;procInfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szPath[MAX_PATH] = {'\0'};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;keyName&nbsp;&nbsp;= _T("Software\\CabSample");&nbsp;&nbsp;//此注册表存放你应用程序的执行路径<br>&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR csAppPath&nbsp;= _T("AppPath");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;lResult = ::RegOpenKeyEx(HKEY_CURRENT_USER, keyName, 0, 0, &amp;hOpenKey);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(lResult == ERROR_SUCCESS);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(lResult != ERROR_SUCCESS)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hWnd, _T("读注册表失败"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MessageBox(hWnd, _T("Open Regedit Faild"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;iLen = MAX_PATH * sizeof(TCHAR);<br>&nbsp;&nbsp;&nbsp;&nbsp;lResult = ::RegQueryValueEx(hOpenKey, csAppPath, 0, &amp;iValueType, (BYTE*)szPath, &amp;iLen);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(lResult != ERROR_SUCCESS)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hWnd, _T("读注册表失败"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MessageBox(hWnd, _T("Read Regedit Faild"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;::RegCloseKey(hOpenKey);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;BOOL bSuc&nbsp; = ::CreateProcess(szPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &amp;procInfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(bSuc)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CloseHandle(procInfo.hThread);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CloseHandle(procInfo.hProcess);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hWnd, _T("启动程序失败"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MessageBox(hWnd, _T("start App Failed"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MessageBox(hWnd, szPath, _T("提示"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;<br>&nbsp;case WM_PAINT: <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;HDC hdc;<br>&nbsp;&nbsp;&nbsp;PAINTSTRUCT ps;<br>&nbsp;&nbsp;&nbsp;hdc = BeginPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp;&nbsp;PaintAll(hWnd, hdc);<br>&nbsp;&nbsp;&nbsp;EndPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;break;<br>&nbsp;&nbsp;<br>&nbsp;case WM_ERASEBKGND:<br>&nbsp;&nbsp;return TRUE;</p>
<p>&nbsp;case WM_TODAYCUSTOM_RECEIVEDSELECTION:<br>&nbsp;&nbsp;g_bSelected = TRUE;<br>&nbsp;&nbsp;return TRUE;</p>
<p>&nbsp;case WM_TODAYCUSTOM_USERNAVIGATION:<br>&nbsp;&nbsp;break;<br>&nbsp;&nbsp;<br>&nbsp;case WM_TODAYCUSTOM_ACTION:<br>&nbsp;&nbsp;break;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return DefWindowProc (hWnd, uimessage, wParam, lParam) ;<br>}<br><br>第三步：建立安装dll。现在，我们进入第三步。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先，和第二步类似，我们为项目新增一个名为setupdll的dll工程。在此工程中同样也要加一个.def文件，并且在其中加入如下内容：<br>EXPORTS<br>&nbsp;Install_Init<br>&nbsp;Install_Exit<br>&nbsp;Uninstall_Init<br>&nbsp;Uninstall_Exit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后， 我们完善setupdll的执行代码。我贴出主要代码，具体见demo。注意，在写代码前一定要加入"ce_setup.h" 和&lt;shellapi.h&gt;头文件，其中"ce_setup.h"在demo里面包含。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后编译，生成&nbsp;Setupdll.dll<br><br>Setupdll主要源码：<br>codeINSTALL_EXIT Install_Exit(HWND hwndparent,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPCTSTR pszinstalldir,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD cfaileddirs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD cfailedfiles,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD cfailedregkeys,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD cfailedregvals,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD cfailedshortcuts)<br>{<br>&nbsp;HKEY&nbsp;hOpenKey&nbsp;&nbsp;&nbsp;&nbsp;= NULL;<br>&nbsp;long&nbsp;lResult&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0;<br>&nbsp;DWORD&nbsp;dwOpenStyle&nbsp;&nbsp;&nbsp;&nbsp;= 0;<br>&nbsp;DWORD&nbsp;iValueType&nbsp;&nbsp;&nbsp;&nbsp;= 0;<br>&nbsp;DWORD&nbsp;iLen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0;<br>&nbsp;DWORD&nbsp;iTemp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0;<br>&nbsp;TCHAR&nbsp;szPath[MAX_PATH]&nbsp;&nbsp;= {'\0'};<br>&nbsp;TCHAR&nbsp;szLinkPath[MAX_PATH]&nbsp;= {0};<br>&nbsp;TCHAR&nbsp;szAppPath[MAX_PATH]&nbsp;&nbsp;= {0};<br>&nbsp;<br>&nbsp;LPCTSTR&nbsp;keyName&nbsp;&nbsp;= _T("Software\\CabSample");<br>&nbsp;LPCTSTR csAppPath&nbsp;= _T("AppPath");<br>&nbsp;LPCTSTR&nbsp;csTodaykey&nbsp;= _T("Software\\Microsoft\\Today\\Items\\\"打包示例\"");<br>&nbsp;LPCTSTR csPlugName&nbsp;= _T("MyToday.dll");&nbsp;&nbsp;// 你的插件名<br>&nbsp;LPCTSTR csAppName&nbsp;= _T("CabSample.exe");&nbsp;&nbsp;// 你的程序名</p>
<p>&nbsp;if(cfaileddirs || cfailedfiles || cfailedregkeys<br>&nbsp;&nbsp;|| cfailedregvals || cfailedshortcuts)<br>&nbsp;&nbsp;goto Failed;</p>
<p>&nbsp;//获取主程序安装路径<br>&nbsp;_tcscpy(szPath, pszinstalldir);<br>&nbsp;_tcscat(szPath, _T("\\"));<br>&nbsp;_tcscat(szPath, csAppName);</p>
<p>&nbsp;//设置主程序快捷方式的执行路径<br>&nbsp;_tcscpy(szAppPath, _T("\""));<br>&nbsp;_tcscat(szAppPath, szPath);<br>&nbsp;_tcscat(szAppPath, _T("\""));</p>
<p>&nbsp;//&nbsp;将主程序安装路径写入注册表<br>&nbsp;<br>&nbsp;lResult = ::RegCreateKeyEx(HKEY_CURRENT_USER, keyName, 0, _T(""), REG_OPTION_NON_VOLATILE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,NULL,&amp;hOpenKey, &amp;dwOpenStyle);<br>&nbsp;if(lResult != ERROR_SUCCESS)<br>&nbsp;&nbsp;goto Success;<br>&nbsp;::RegSetValueEx(hOpenKey, csAppPath, 0, REG_SZ, (BYTE*)&amp;szPath, sizeof(TCHAR) * _tcslen(szPath));<br>&nbsp;::RegCloseKey(hOpenKey);</p>
<p>&nbsp;memset(szPath, 0x00, sizeof(TCHAR) * MAX_PATH);&nbsp;<br>&nbsp;_tcscpy(szPath, pszinstalldir);<br>&nbsp;_tcscat(szPath, _T("\\"));<br>&nbsp;_tcscat(szPath, csPlugName);<br>&nbsp;::CopyFile(szPath, _T("<a href="file://Windows//MyToday.dll"><font color=#5d5d5d>\\Windows\\MyToday.dll</font></a>"), FALSE);</p>
<p>&nbsp;// 安装 &#8220;今日插件&#8221;<br>&nbsp;hOpenKey&nbsp;= NULL;<br>&nbsp;lResult = ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, csTodaykey, 0, _T(""), REG_OPTION_NON_VOLATILE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0, NULL, &amp;hOpenKey, &amp;dwOpenStyle);</p>
<p>&nbsp;if(lResult != ERROR_SUCCESS)<br>&nbsp;&nbsp;goto Success;&nbsp;//如果读写注册表失败， 放弃安装 &#8220;今日插件&#8221;</p>
<p>&nbsp;</p>
<p>&nbsp;//&nbsp;注册插件<br>&nbsp;iTemp&nbsp;&nbsp;= 0;<br>&nbsp;::RegSetValueEx(hOpenKey, _T("Flags"), 0, REG_DWORD, (BYTE*)&amp;iTemp, sizeof(iTemp));<br>&nbsp;::RegSetValueEx(hOpenKey, _T("Options"), 0, REG_DWORD, (BYTE*)&amp;iTemp, sizeof(iTemp));<br>&nbsp;iTemp&nbsp;&nbsp;= 1;<br>&nbsp;::RegSetValueEx(hOpenKey, _T("Enabled"), 0, REG_DWORD, (BYTE*)&amp;iTemp, sizeof(iTemp));<br>&nbsp;::RegSetValueEx(hOpenKey, _T("Order"), 0, REG_DWORD, (BYTE*)&amp;iTemp, sizeof(iTemp));<br>&nbsp;::RegSetValueEx(hOpenKey, _T("Selectability"), 0, REG_DWORD, (BYTE*)&amp;iTemp, sizeof(iTemp));<br>&nbsp;iTemp&nbsp;&nbsp;= 4;<br>&nbsp;::RegSetValueEx(hOpenKey, _T("Type"), 0, REG_DWORD, (BYTE*)&amp;iTemp, sizeof(iTemp));<br>&nbsp;::RegSetValueEx(hOpenKey, _T("DLL"), 0, REG_SZ, (BYTE*)_T("<a href="file://Windows//MyToday.dll"><font color=#5d5d5d>\\Windows\\MyToday.dll</font></a>"), sizeof(TCHAR) * _tcslen(szPath));<br>&nbsp;// 发送系统消息<br>&nbsp;::SendMessage(HWND_BROADCAST, WM_WININICHANGE, (WPARAM)0xF2, 0);<br>&nbsp;::RegCloseKey(hOpenKey);<br>&nbsp;<br>&nbsp;//创建快捷方式<br>&nbsp;if(SHGetSpecialFolderPath(NULL, szLinkPath, CSIDL_PROGRAMS,FALSE))<br>&nbsp;{<br>&nbsp;&nbsp;_tcscat(szLinkPath, _T("\\"));<br>&nbsp;&nbsp;_tcscat(szLinkPath, _T("打包示例.lnk"));</p>
<p>&nbsp;&nbsp;if(SHCreateShortcut(szLinkPath, szAppPath) == FALSE)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;MessageBox(NULL, _T("安装快捷方式失败"), _T("提示"), MB_OK);<br>&nbsp;&nbsp;}</p>
<p>&nbsp;}<br>&nbsp;else<br>&nbsp;&nbsp;MessageBox(NULL, _T("获取系统文件路径失败"), _T("提示"), MB_OK);</p>
<p>&nbsp;//return value<br>Success:<br>&nbsp;return codeINSTALL_EXIT_DONE;</p>
<p>Failed:<br>&nbsp;return codeINSTALL_EXIT_UNINSTALL;<br>}<br><br>第四步：制作完整打包程序。在项目中新增一个工程，名为CabSampleCab。具体参照下图：<br><br>点击ok, 下面咱们进入cab打包阶段。(&nbsp;我只写步骤，更详细信息，请参考微软msdn)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先：在&#8220;视图&#8221;菜单上单击&#8220;属性窗口&#8221;，或打开&#8220;属性&#8221;窗口。<br>&nbsp;在属性网格的&#8220;ProductName&#8221;字段中，将值更改为&#8220;CabSample&#8221;。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后：在&#8220;本地文件系统&#8221;浏览器下，选择&#8220;应用程序文件夹&#8221;，右击选中 &#8220;新怎&#8221;，继续点击 &#8220;项目主输出&#8221;菜单，在弹出对话框的工程下拉框中，选中 &#8220;CabSample&#8221;, 重复上面步骤，依次把前面三个工程主输出都加进来。如下图：<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再然后：在 方案浏览器中， 选择cab项目工程，查看属性栏。点击属性栏中的 &#8220;CE Setup Dll&#8221;属性，在弹出下拉框中选择浏览，然后在弹出对话框中点击进入&#8220;应用程序</p>
文件夹&#8221;选项，选者 安装 dll 的主输出， 点击 ok 如图所示：<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再再然后，想cab项目中加入一个注册表项，保存 你的应用程序执行路径。该注册表字符串初始为空，在setupdll中填写正确的路径。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，我们就不要为程序创建快捷方式拉，因为我们在setupdll中，已经创建。那为什么不让cab自动创建呢？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、自动创建的快捷方式，由于某种原因不能创建中文快捷方式；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、自动创建的快捷方式，有时候卸载程序的时候， 它没被删除；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、前面我们自己已经创建快捷方式，就不必再麻烦cab拉！！:-)<br><br>第五步：编译整个安装方案，生成cab包，下在到ppc上安装， 运行界面如下：<br><br><br><br>ok,&nbsp; 大功告成！！不懂的，下在demo回去研究！！什么？？我的打包过程不完整？？你还要能够在pc上通过ActiveSync自动安装， 我晕， 今晚累死，这个大家自己上msdn看吧。第一次写帖子，有不成熟的地方还请各位朋友海涵！！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于demo太大，上传不上去，所以想要demo的，把Email留下来！ 或者去<a href="http://www.winbile.net/BBS/1015441/ShowPost.aspx">http://www.winbile.net/BBS/1015441/ShowPost.aspx</a>&nbsp;下载 
<img src ="http://www.cppblog.com/kuronca/aggbug/21118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuronca/" target="_blank">零宇</a> 2007-04-02 21:42 <a href="http://www.cppblog.com/kuronca/articles/21118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>