Win32 : Utilisation des fichiers INF et des Setup API |
[Version] Signature="$Windows 95$" Provider=%Company% [DestinationDirs] MyDeleteFiles=65600 MyCopyFiles=65600 MyRenameFiles=65600 [Install] DelReg=DelRegistry AddReg=AddRegistry CopyFiles=MyCopyFiles UpdateInis=MajIni [UnInstall] DelReg=DelRegistry DelFiles=MyDeleteFiles [AddRegistry] HKLM,"Software\%Company%\Data Access" HKLM,"Software\%Company%\Data Access\SQL Server" HKLM,"Software\%Company%\Data Access\SQL Server","Database",FLG_ADDREG_TYPE_SZ ,"Default" [DelRegistry] HKLM,"Software\%Company%\Data Access\SQL Server\Database" HKLM,"Software\%Company%\Data Access\SQL Server" HKLM,"Software\%Company%\Data Access" HKLM,"Software\%Company%" [MyCopyFiles] source.txt dest.txt new.txt [MyDeleteFiles] source.txt dest.txt new.txt [MajIni] %65600%\cpicorp.ini,CORPORATION,,NAME="%Company%" %65600%\cpicorp.ini,CORPORATION,,REGISTERED="2000" [Strings] Company="CPI Corporation"
Le programme InstallFromInf est une application console:
// InstallFromInf.cpp : Defines the entry point for the console application. // //dans stdafx.h //#include//#include "setupapi.h" //#pragma comment(lib, "setupapi.lib") //#include #include "stdafx.h" void Usage() { printf("Usage:\n"); printf("InstallFromInf options\n"); printf("-i : Install\n"); printf("-u : UnInstall\n"); } int main(int argc, char* argv[]) { #define CPI_INF "D:\\dev\\cpi\\Tools\\InstallFromInf\\Release\\cpi.inf" #define DESTINATION_PATH "d:\\dev\\cpi\\tools\\install" #define SOURCE_PATH "d:\\dev\\cpi\\tools\\installfrominf\\release" BOOL bInstall = FALSE; if( argc == 2 ) { if( !strcmp(argv[1], "-i") ) bInstall = TRUE; else if( !strcmp(argv[1], "-u") ) bInstall = FALSE; else { Usage(); return 1; } } else { Usage(); return 1; } HINF hInfFile; UINT iError; hInfFile = SetupOpenInfFile(CPI_INF, NULL, INF_STYLE_WIN4, &iError); if( hInfFile == INVALID_HANDLE_VALUE ) { printf("SetupOpenInfFile failed\n"); return 1; } BOOL bResult = FALSE; bResult = SetupSetDirectoryId(hInfFile,(DWORD) 65600, DESTINATION_PATH); if( bResult == FALSE ) { printf("SetupSetDirectoryId failed\n"); return 1; } HSPFILEQ FileQueue; FileQueue = SetupOpenFileQueue(); if(!FileQueue || (FileQueue == INVALID_HANDLE_VALUE)) { printf("SetupOpenFileQueue failed\n"); return 1; } PVOID pData; pData = SetupInitDefaultQueueCallbackEx(NULL, NULL, 0, 0, NULL); if(!(pData)) { printf("SetupInitDefaultQueueCallbackEx failed\n"); SetupCloseFileQueue(FileQueue); SetupCloseInfFile(hInfFile); return 1; } if( bInstall ) bResult = SetupInstallFilesFromInfSection(hInfFile, NULL, FileQueue, "Install", SOURCE_PATH, SP_COPY_NEWER); else bResult = SetupInstallFilesFromInfSection(hInfFile, NULL, FileQueue, "UnInstall", SOURCE_PATH, SP_COPY_NEWER); if( bResult == FALSE ) { printf("SetupInstallFilesFromInfSection failed\n"); return 1; } bResult = SetupCommitFileQueue(NULL, FileQueue, (PSP_FILE_CALLBACK) SetupDefaultQueueCallback , pData); if( bResult == FALSE ) { printf("SetupCommitFileQueue failed\n"); return 1; } int iFlags = SPINST_REGISTRY | SPINST_INIFILES; if( bInstall ) bResult = SetupInstallFromInfSection(NULL, hInfFile, "Install", iFlags, NULL, NULL, NULL, NULL, NULL, NULL, NULL); else bResult = SetupInstallFromInfSection(NULL, hInfFile, "UnInstall", iFlags, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if( bResult == FALSE ) { printf("SetupInstallFromInfSection failed\n"); return 1; } SetupTermDefaultQueueCallback(pData); SetupCloseFileQueue(FileQueue); SetupCloseInfFile(hInfFile); return 0; }
© 2001 Christophe Pichaud. All rights reserved.