基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
我们进行Windows编程的时候,经常需要开发程序,使程序进行自动安装。
具体如何实现呢,请见代码实现与注释分析。
**************************************//* 头文件 */#include #include #include /* 库 */#pragma comment (lib, "shell32.lib")#pragma comment (lib, "Setupapi.lib")/************************************** VOID GetSourceDirectory(LPSTR szPath)* 功能 获得当前路径* szPath,返回路径**************************************/VOID GetSourceDirectory(LPSTR szPath){ int i; GetModuleFileName(NULL,szPath,MAX_PATH); i=strlen(szPath); while ((i>0)&&(szPath[i-1]!='\\')) { szPath[--i]=0; }}/************************************** WinMain* 功能 调用相关Setup API进行安装**************************************/INT WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ HINF hInf; // INF文件句柄 CHAR szSrcPath[MAX_PATH];// 源路径 CHAR szDisPath[MAX_PATH];// 目的路径 BOOL bResult; PVOID pContext; // 与本程序在同一目录下的Setup.inf GetSourceDirectory(szSrcPath); lstrcat(szSrcPath,"setup.inf"); // 打开 inf 文件 hInf = SetupOpenInfFile(szSrcPath, NULL, INF_STYLE_WIN4, NULL); // 是否成功 if (hInf == INVALID_HANDLE_VALUE) { MessageBox(NULL, "Error: Could not open the INF file.", "ERROR", MB_OK|MB_ICONERROR); return FALSE; } // 获得Program Files的路径 SHGetSpecialFolderPath(NULL, szDisPath, CSIDL_PROGRAM_FILES , FALSE); // 构造目的路径 lstrcat(szDisPath,"\\MyInstall"); // 给inf配置文件中的路径ID赋值,使用路径替换路径ID bResult = SetupSetDirectoryId(hInf, 32768, szDisPath); if (!bResult) { MessageBox(NULL, "Error: Could not associate a directory ID with the destination directory.", "ERROR", MB_OK|MB_ICONERROR); SetupCloseInfFile(hInf); return FALSE; } // 设置默认callback函数的参数 pContext=SetupInitDefaultQueueCallback(NULL); // 进行安装 bResult=SetupInstallFromInfSection( NULL, // 父窗口句柄 hInf, // INF文件句柄 "Install", // INF文件中,配置了安装信息的节名 SPINST_FILES | SPINST_REGISTRY , // 安装标志 NULL, // 安装键值 NULL, // 源文件和路径,可以在INF文件中配置 0, // 复制时的动作 (PSP_FILE_CALLBACK)SetupDefaultQueueCallback, // 回调函数 pContext, // 回调函数的参数 NULL, // 设备信息 NULL // 设备信息 ); // 安装是否成功 if (!bResult) { // 失败,输出错误信息 MessageBox(NULL, "SetupInstallFromInfSection", "ERROR", MB_OK|MB_ICONERROR); //关闭 SetupTermDefaultQueueCallback(pContext); SetupCloseInfFile(hInf); return FALSE; } // 关闭 SetupTermDefaultQueueCallback(pContext); SetupCloseInfFile(hInf); return TRUE;}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~