VC实现程序自动安装

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值