确定你已经会制作微软CAB格式的安装包
这里就不用我多说了,在微软的帮助文件,MSDN中,大量地介绍如何编写.inf,如何打包等等。比如EVC helps里面搜索 cabwiz 或 .inf 关键词就可以找到相关方法。
比如现在你已经做好了一个Sample.CAB安装包。
安装了WINRAR
这个可以去网上下载,记得用正版。当然,也可以用WINZIP或任何能制作自解压(SFX)的压缩软件。
编写一个.INI文件
文件的内容很简单,用记事本写好后,保存为Sample.ini
[CEAppManager]
Version = 1.0
Component = Sample
[Sample]
Description =
安装包示例
Uninstall = Sample
CabFiles = ./Sample.CAB
准备好 InstallPackage.exe
InstallPackage.exe 是我写的一个小程序,原理是通过查找注册表中CEAPPMGR.EXE 文件的位置,这个文件就是ActiveSync中用来安装程序的组件,然后以参数方式执行安装。程序源码如下,编译环境是VC6.0,不过使用源代码的朋友要注意,我用的是UNICODE,而不是VC默认的MBCS宏,所以,记得在工程C/C++选项中去掉
MBCS,改为 _UNICODE,UNICODE 替代。当然,不喜欢的朋友可以自行修改源代码,如果需要编译好的文件,请发到我的邮箱
nbcool@yeah.net 索取。这里要提醒下大家,带参数执行 InstallPackage.exe ./xxx.ini 中,”./” 当前路径符号是必不可少的。
// InstallPackage.cpp : Defines the entry point for the application.
//
#include <windows.h>
#include <tchar.h>
LRESULT GetCeAppMgrPath(LPTSTR * lpszPath);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
TCHAR szlpFile[MAX_PATH + 1];
DWORD dwLen = strlen(lpCmdLine); //.ini file full path
LPTSTR lpszCeAppMgr = NULL;
if(dwLen > 0)
{
if(MultiByteToWideChar(CP_ACP,0, lpCmdLine, -1, szlpFile, MAX_PATH) != FALSE)
{
if(SUCCEEDED(GetCeAppMgrPath(&lpszCeAppMgr)))
{
SHELLEXECUTEINFO execInf;
ZeroMemory (&execInf, sizeof (execInf));
execInf.cbSize = sizeof (execInf);
execInf.fMask = SEE_MASK_NOCLOSEPROCESS;
execInf.lpFile = lpszCeAppMgr;
execInf.lpVerb = TEXT("open");
execInf.lpParameters = szlpFile;
if(ShellExecuteEx (&execInf) != FALSE)
{
//do nothing
//
}
else
{
MessageBox(NULL, _T("
安装程序启动失败
!
"), _T("Setup Wizard"), MB_OK|MB_ICONERROR);
}
}
else
{
MessageBox(NULL, _T("
组件丢失
,
安装失败
!
"), _T("Setup Wizard"), MB_OK|MB_ICONERROR);
}
}
}
if(lpszCeAppMgr != NULL)
{
LocalFree((HLOCAL)lpszCeAppMgr);
}
return 0;
}
LRESULT GetCeAppMgrPath(LPTSTR * lpszPath)
{
HKEY hKey = NULL;
DWORD dwLength = 0;
DWORD dwRegType = 0;
LRESULT lr = S_FALSE;
LPTSTR lpszBuf = NULL;
lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE//Microsoft//Windows//CurrentVersion//App Paths//CEAPPMGR.EXE"),
0, KEY_QUERY_VALUE, &hKey);
if (lr != ERROR_SUCCESS)
{
goto Exit;
}
dwLength = 0;
lr = RegQueryValueEx(hKey, _T(""), NULL, &dwRegType, NULL, &dwLength);
if (lr != ERROR_SUCCESS)
{
goto Exit;
}
lpszBuf = (LPTSTR)LocalAlloc(LMEM_FIXED, dwLength * sizeof(TCHAR));
if(lpszBuf != NULL)
{
lr = RegQueryValueEx(hKey, _T(""), NULL, &dwRegType, (LPBYTE)(lpszBuf), &dwLength);
if (lr != ERROR_SUCCESS)
{
goto Exit;
}
}
Exit:
if (hKey != NULL)
{
RegCloseKey(hKey);
}
*lpszPath = lpszBuf;
return lr;
}
准备一个安装文件的图标
这是用了cesetup.ico,看自己的需要了。
开始制作安装包
首先以上文件放入同一文件夹,名字随意。
Sample.CAB
Sample.ini
cesetup.ico
InstallPackage.exe
选取文件,并选择添加到压缩文件

选择创建自解压格式压缩文件

设置自解压选项




其后选择确定完成生成安装包

至此,本文已结束,大家有关于制作过程的疑问,可以在嵌入式板块 WINCE开发中提出。