Visual C++に基づくWindowsコアプログラミングコード分析(3)プログラム自動インストールを実現


Windowsのプログラミングを行うときは、プログラムを開発して自動的にインストールする必要があります.
具体的にどのように実現するかは、コード実装と注釈分析を参照してください.
**************************************/
/*     */
#include <Windows.h>
#include <Setupapi.h>
#include <shlobj.h>
/*   */
#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;
}