现在的位置: 首页 > 综合 > 正文

基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装

2013年08月18日 ⁄ 综合 ⁄ 共 2932字 ⁄ 字号 评论关闭

我们进行Windows编程的时候,经常需要开发程序,使程序进行自动安装。

具体如何实现呢,请见代码实现与注释分析。

  1. **************************************/  
  2. /* 头文件 */  
  3. #include <Windows.h>  
  4. #include <Setupapi.h>  
  5. #include <shlobj.h>  
  6. /* 库 */  
  7. #pragma comment (lib, "shell32.lib")  
  8. #pragma comment (lib, "Setupapi.lib")  
  9.   
  10. /************************************* 
  11. * VOID GetSourceDirectory(LPSTR szPath) 
  12. * 功能 获得当前路径 
  13. * szPath,返回路径 
  14. **************************************/  
  15. VOID GetSourceDirectory(LPSTR szPath)  
  16. {  
  17.     int i;  
  18.   
  19.     GetModuleFileName(NULL,szPath,MAX_PATH);  
  20.   
  21.     i=strlen(szPath);  
  22.     while ((i>0)&&(szPath[i-1]!='\\'))  
  23.     {  
  24.         szPath[--i]=0;  
  25.     }  
  26. }  
  27.   
  28. /************************************* 
  29. * WinMain 
  30. * 功能 调用相关Setup API进行安装 
  31. **************************************/  
  32. INT WinMain(  
  33.             HINSTANCE hInstance,  
  34.             HINSTANCE hPrevInstance,  
  35.             LPSTR lpCmdLine,  
  36.             int nCmdShow  
  37.             )  
  38. {  
  39.     HINF hInf; // INF文件句柄  
  40.     CHAR szSrcPath[MAX_PATH];// 源路径  
  41.     CHAR szDisPath[MAX_PATH];// 目的路径  
  42.     BOOL bResult;  
  43.     PVOID pContext;  
  44.     // 与本程序在同一目录下的Setup.inf  
  45.     GetSourceDirectory(szSrcPath);  
  46.     lstrcat(szSrcPath,"setup.inf");  
  47.     // 打开 inf 文件  
  48.     hInf = SetupOpenInfFile(szSrcPath, NULL, INF_STYLE_WIN4, NULL);  
  49.     // 是否成功  
  50.     if (hInf == INVALID_HANDLE_VALUE)  
  51.     {  
  52.         MessageBox(NULL,  
  53.             "Error: Could not open the INF file.",  
  54.             "ERROR",  
  55.             MB_OK|MB_ICONERROR);  
  56.         return FALSE;  
  57.     }  
  58.     // 获得Program Files的路径  
  59.     SHGetSpecialFolderPath(NULL,   
  60.         szDisPath, CSIDL_PROGRAM_FILES , FALSE);  
  61.     // 构造目的路径  
  62.     lstrcat(szDisPath,"\\MyInstall");  
  63.   
  64.     // 给inf配置文件中的路径ID赋值,使用路径替换路径ID  
  65.     bResult = SetupSetDirectoryId(hInf, 32768, szDisPath);  
  66.     if (!bResult)  
  67.     {  
  68.         MessageBox(NULL,  
  69.             "Error: Could not associate a directory ID with the destination directory.",  
  70.             "ERROR",  
  71.             MB_OK|MB_ICONERROR);  
  72.         SetupCloseInfFile(hInf);  
  73.         return FALSE;  
  74.     }  
  75.   
  76.     // 设置默认callback函数的参数  
  77.     pContext=SetupInitDefaultQueueCallback(NULL);  
  78.   
  79.     // 进行安装  
  80.     bResult=SetupInstallFromInfSection(  
  81.         NULL, // 父窗口句柄  
  82.         hInf, // INF文件句柄  
  83.         "Install"// INF文件中,配置了安装信息的节名  
  84.         SPINST_FILES | SPINST_REGISTRY , // 安装标志  
  85.         NULL, // 安装键值  
  86.         NULL, // 源文件和路径,可以在INF文件中配置  
  87.         0, // 复制时的动作  
  88.         (PSP_FILE_CALLBACK)SetupDefaultQueueCallback, // 回调函数  
  89.         pContext, // 回调函数的参数  
  90.         NULL, // 设备信息  
  91.         NULL // 设备信息  
  92.         );  
  93.     // 安装是否成功  
  94.     if (!bResult)  
  95.     {  
  96.         // 失败,输出错误信息  
  97.         MessageBox(NULL,  
  98.             "SetupInstallFromInfSection",  
  99.             "ERROR",  
  100.             MB_OK|MB_ICONERROR);  
  101.         //关闭  
  102.         SetupTermDefaultQueueCallback(pContext);  
  103.         SetupCloseInfFile(hInf);  
  104.         return FALSE;  
  105.     }  
  106.   
  107.     // 关闭  
  108.     SetupTermDefaultQueueCallback(pContext);  
  109.     SetupCloseInfFile(hInf);  
  110.   
  111.     return TRUE;  
  112. }  

抱歉!评论已关闭.