windows-nt/Source/XPSP1/NT/sdktools/iasinfdb/command.cpp
2020-09-26 16:20:57 +08:00

151 lines
5.5 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999, Microsoft Corp. All rights reserved.
//
// FILE
//
// command.cpp
//
// SYNOPSIS
//
// Process the command-line parameters of iasinfdb.exe
//
// MODIFICATION HISTORY
//
// 02/12/1999 Original version. Thierry Perraut
//
//////////////////////////////////////////////////////////////////////////////
#include "precomp.hpp"
#include "command.h"
using namespace std;
//////////////////////////////////////////////////////////////////////////////
//
// ProcessCommand
//
//
//////////////////////////////////////////////////////////////////////////////
HRESULT ProcessCommand(
int argc,
wchar_t * argv[],
HINF *ppHINF,
CDatabase& Database
)
{
_ASSERTE(ppHINF != NULL);
HRESULT hres;
if (argc != NUMBER_ARGUMENTS)
{
/////////////////////////////////////
// not the right number of arguments
/////////////////////////////////////
cerr << "inf2db Import an INF file into a Jet4 Database\n\ninf2db ";
cerr << "[drive:][path]template.mdb [drive:][path]filename.inf";
cerr << "[drive:][path]destination_database.mdb\n";
hres = E_INVALIDARG;
}
else
{
/////////////////////////////////////
// argv[1] = template database
/////////////////////////////////////
BOOL bCopyOk = CopyFileW(
argv[1],
TEMPORARY_FILENAME,
// here false means success even if file already exists
FALSE
);
if (!bCopyOk)
{
TracePrintf("Error: copy template %S -> new file %S failed ",
argv[1],
TEMPORARY_FILENAME
);
hres = E_FAIL;
}
else
{
///////////////////////////////////////////////////////
// suppress the read-only attribute from the new file
///////////////////////////////////////////////////////
BOOL bChangedAttributeOK = SetFileAttributesW(
TEMPORARY_FILENAME,
FILE_ATTRIBUTE_NORMAL
);
if(!bChangedAttributeOK)
{
TracePrintf("Error: change attribute (RW) on %S failed",
TEMPORARY_FILENAME
);
hres = E_FAIL;
}
else
{
///////////////////////////////////////////////////////
// three arg (argc = 4) Open the INF file for reading
// Open for read (will fail if file does not exist)
///////////////////////////////////////////////////////
UINT lErrorCode;
if( (*ppHINF = (HINF) SetupOpenInfFileW(
// name of the INF to open
argv[2],
// optional, the class of the INF file
NULL,
// specifies the style of the INF file
INF_STYLE_WIN4,
&lErrorCode
))
== INVALID_HANDLE_VALUE
)
{
//////////////////////////////////
// Error situation
//////////////////////////////////
LPVOID lpMsgBuf;
FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR) &lpMsgBuf,
0,
NULL
);
TracePrintf("Error: %S",(LPCWSTR)lpMsgBuf);
cerr << "Error: " << (LPCWSTR)lpMsgBuf << "\n";
/////////////////////
// Free the buffer.
/////////////////////
LocalFree(lpMsgBuf);
cerr << "ERROR: Can't open the INF file " << argv[1] <<"\n";
hres = E_INVALIDARG;
}
else
{
#ifdef DEBUG
TraceString("Info: inf file open\n");
#endif
////////////////////////////////////////////////
// argv[3] = destination path to the database
// call the initialize member function
////////////////////////////////////////////////
Database.InitializeDB(argv[3]);
hres = S_OK;
}
}
}
}
return hres;
}