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;
}