#$K+MsiVolume Object
	Msi Objects	Database Tables
The MsiVolume object represents a disk drive or server share. It is not normally created independently by the installer, but as needed by the MsiPath objects during resolution of the volume information from the remainder of their path. To avoid duplication, a pool of Msi volume objects is maintained by the services object, such that the CreateVolume function will return the existing MsiVolume object if present.
Properties
ClusterSize
DiskNotInDrive
DriveType
FileSystem
FileSystemFlags
FreeSpace
Path
SerialNum
SupportsLFN
TotalSpace
UNCServer
VolumeID
VolumeLabel

#$+KPath Property
	MsiVolume Object	Msi Objects	Database Tables
String representing the path to the volume. In cases where both a drive letter and an UNC path are obtainable, the form preferred by the network type is used (currently only Novell NetWare servers prefer drive letter mapping). Default property, read-only.
Syntax
object.Path
object
Required. The MsiVolume object.
#$+KVolumeID Property
	MsiVolume Object	Msi Objects	Database Tables
Integer representing the volume. For Windows this maps to the driver letter, from A=1 to Z=26, with 0 used to indicate that the volume is not mapped to a drive letter. For Mac, this ID is the volume reference number (vRefNum) of the mounted volume. Read-only.
Syntax
object.VolumeID
object
Required. The MsiVolume object.
#$+KDriveType Property
	MsiVolume Object	Msi Objects	Database Tables
Integer enumeration describing the physical type of the volume. Read-only.
Syntax
object.DriveType
object
Required. The MsiVolume object.
Drive Type Enumeration
idtUnknown   = 0    Drive type cannot be determined
idtAllDrives = 1    Never returned, used for enumerating drives
idtRemovable = 2    Drive contains removable media
idtFixed     = 3    Hard disk drive
idtRemote    = 4    Network server share
idtCDROM     = 5    CD_ROM drive
idtRAMDisk   = 6    RAM disk
idtFloppy    = 2    Eventually, floppies should be distinguished from other removables
#$+KSupportsLFN Property
	MsiVolume Object	Msi Objects	Database Tables
Boolean indicating whether the volume supports long file names. If False is returned, only 8.3 file names may be used. The value is always False for the Mac. Read-only.
Syntax
object.SupportsLFN
object
Required. The MsiVolume object.
#$+KFreeSpace Property
	MsiVolume Object	Msi Objects	Database Tables
The amount of free space on the volume in units of 512 bytes. For a compressed drive, this is the expected uncompressed size. Read-only.
Syntax
object.FreeSpace
object
Required. The MsiVolume object.
#$+KTotalSpace Property
	MsiVolume Object	Msi Objects	Database Tables
The total capacity of the volume, in units of 512 bytes. For a compressed drive, this is the expected uncompressed size. Read-only.
Syntax
object.TotalSpace
object
Required. The MsiVolume object.
#$+KClusterSize Property
	MsiVolume Object	Msi Objects	Database Tables
The number of bytes in a cluster, the basic unit of allocation for the volume. This is a physical parameter and may not be appropriate to use for compressed volumes or directories. Read-only.
Syntax
object.ClusterSize
object
Required. The MsiVolume object.
#$+KFileSystem Property
	MsiVolume Object	Msi Objects	Database Tables
Returns a string designating the type of file system used on the volume. On the Mac, an empty string is always returned. Read-only.
Syntax
object.FileSystem
object
Required. The MsiVolume object.
Returned File System Types
FAT
NTFS
HPFS

#$+KFileSystemFlags Property
	MsiVolume Object	Msi Objects	Database Tables
Returns an bitfield integer value with various flags about the filesystem.   Read Only.
Syntax
object.FileSystemFlags
object
Required. The MsiVolume object.
Returned File System Flags
0x00000001: Volume uses case sensitive filenames
0x00000002: Volume preserves case on filenames
0x00000004: Volume stores data as UNICODE
0x00000008: Volume supports security
0x00000010: Volume supports compression
0x00008000: Volume is compressed

#$+KVolumeLabel Property
	MsiVolume Object	Msi Objects	Database Tables
Returns a string representing the disk label associated with the volume. On the Mac, the volume name is always returned. Read-only.
Syntax
object.VolumeLabel
object
Required. The MsiVolume object.
#$+KUNCServer Property
	MsiVolume Object	Msi Objects	Database Tables
String representing the UNC path for the volume. For local drives and networks that do not support UNC, an empty string will be returned. For the Mac, an empty string is always returned. Read-only.
Syntax
object.UNCServer
object
Required. The MsiVolume object.
#$+KSerialNum Property
	MsiVolume Object	Msi Objects	Database Tables
A long integer representing the unique ID for the physical volume. For the Mac, 0 is always returned. Read-only.
Syntax
object.SerialNum
object
Required. The MsiVolume object.
#$+KDiskNotInDrive Property
	MsiVolume Object	Msi Objects	Database Tables
DiskNotInDrive returns True if the volume media is removable (CDROM, Floppy, removable HD), AND there is no disk in the drive. Read-only.
Syntax
object.DiskNotInDrive
object
Required. The MsiVolume object.
#$K+MsiPath Object
	Msi Objects	Database Tables
The MsiPath object represents a full path to a directory on a disk volume. Internally, MsiPath creates an MsiVolume object to represent the volume associated with the full path.
 
Windows Path and Filename Syntax
 For Windows, the path supplied when creating an MsiPath object must either  include a drive letter indicating the volume, or a UNC path.  For example,  the following are valid paths:

    C:\MyDocs\SubDocs
    \\MyServer\MyShare\MyDocs

When specifying filenames to MsiPath methods such as GetFullFilePath, the following reserved characters are not allowed, and will generate an error if found anywhere in the supplied name:
 '\' (backslash)
 '/' (forward slash)
 ':' (colon)
 '"' (double-quote)
 '|' (pipe)
 '?' (question mark)
 '*' (asterisk)
 '<' (less-than sign)
 '>' (greater-than sign)

Multiple consecutive directory seperators are allowed in a path.  For example, the following are valid paths:

    C:\MyDocs\\SubDocs\\\Personal
    \\MyServer\MyShare\\MyDocs

Note that multiple directory seperators may not follow a drive letter, though they may follow a \\Server\Share pair.

Properties
EndSubPath
Exists
Path
RelativePath
Volume
Writable

Methods
AppendPiece
BindImage
CheckFileVersion
CheckLanguageIDs
Child
ChopPiece
ClusteredFileSize
Compare
ComputeFileChecksum
EnsureExists
FileDate
FileExists
FileInUse
FileSize
FileWritable
FindFile
GetFileAttribute
GetFileChecksum
GetFileOriginalChecksum
GetFileVersionString
GetFullFilePath
GetFullUNCFilePath
GetImportModulesEnum
GetLangIDStringFromFile
GetSelfRelativeSD
SubFolders
ReadResource
Remove
RemoveFile
SetFileAttribute
SetVolume
SupportsLFN
TempFileName
UpdateResource
VerifyFileChecksum

#$+KPath Property
	MsiPath Object	Msi Objects	Database Tables
Returns a string representing the path. Read-only.
Syntax
object.Path
object
Required. The MsiPath object.
Remarks
The returned string contains the full path represented by the path object, including the volume designation.  See the description of the MsiPath object for a full description of the path syntax.
#$+KRelativePath Property
	MsiPath Object	Msi Objects	Database Tables
Returns a string representing the path without the volume. Read-only.
Syntax
object.RelativePath
object
Required. The MsiPath object.
Remarks
The returned string contains the path represented by the path object, without the volume designation.  See the description of the MsiPath object for a full description of the path syntax.
#$+KVolume Property
	MsiPath Object	Msi Objects	Database Tables
Returns the MsiVolume object representing the root of this path. Read-only.
Syntax
object.Volume
object
Required. The MsiPath object.
#$+KSetVolume method
	MsiPath Object	Msi Objects	Database Tables
Assigns a new MsiVolume object to this MsiPath object. The path (as returned by the Path property) will be updated to reflect the new root volume.
Syntax
object.SetVolume(volume)
object
Required. The MsiPath object.
volume
The MsiVolume object to be assigned to this MsiPath object. 
#$+KExists Property
	MsiPath Object	Msi Objects	Database Tables
Boolean indicating whether the directory tree associated with the path object currently exists on the associated volume. Read-only.
Syntax
object.Exists
object
Required. The MsiPath object.
Remarks
None.
#$+KWritable Property
	MsiPath Object	Msi Objects	Database Tables
Boolean indicating whether the directory represented by the path is writable (i.e. file-creation privileges are available in this directory). Read-only.
Syntax
object.Writable
object
Required. The MsiPath object.
Remarks
If the directory associated with the path does not exist, a run-time error will be generated.
#$+KEndSubPath Property
	MsiPath Object	Msi Objects	Database Tables
Returns a string representing the last sub-path of the path. Read-only.
Syntax
object.EndSubPath
object
Required. The MsiPath object.
Remarks
The returned string will not contain any directory separator characters,
#$+KAppendPiece Method
	MsiPath Object	Msi Objects	Database Tables
The AppendPiece methods appends the given string to the current path, delimiting appropriately with directory separator characters.
Syntax
object.AppendPiece(subDir)
object
Required. The MsiPath object.
subDir
Required. The name of the subdirectory to append. See the MsiPath main topic for filename syntax.
Remarks
AppendPiece allows multiple subdirectories to be appended at once.  Also, a leading and/or trailing directory separator is optional.  Thus, the following examples are  all legal, and functionally identical:
 
services.AppendPiece("subdir1\subdir2")
services.AppendPiece("\subdir1\subdir2")
services.AppendPiece("subdir1\subdir2\")
services.AppendPiece("\subdir1\subdir2\")

#$+KChopPiece Method
	MsiPath Object	Msi Objects	Database Tables
The ChopPiece method removes the last subdirectory segment from the current path.
Syntax
object.ChopPiece
object
Required. The MsiPath object.
Remarks
None.
#$+KFileExists Method
	MsiPath Object	Msi Objects	Database Tables
The FileExists method returns True if a file of the specified name exists in the directory associated with the path object.
Syntax
object.FileExists(file)
object
Required. The MsiPath object.
file
Required. The name of the file to check for.  See the MsiPath main topic for filename syntax.
Remarks
None.
#$+KGetFullFilePath Method
	MsiPath Object	Msi Objects	Database Tables
The GetFullFilePath method takes a file name as an argument, and returns a string that represents the full path to that file,  incorporating the path associated with the path object and the given file name.
Syntax
object.GetFullFilePath(strFile)
object
Required. The MsiPath object.
strFile
Required. The name of the file to append to the current path. See the MsiPath main topic for filename syntax.  If an empty string is passed in strFile, just the path itself (terminated  with a backslash) will be returned.
Remarks
None.
#$+KGetFullUNCFilePath Method
	MsiPath Object	Msi Objects	Database Tables
The GetFullUNCFilePath method takes a file name as an argument, and returns a string that represents the full path to that file, incorporating the path associated with the path object and the given file name.  If the volume associated with the path object represents a network connection, the UNC name of the volume will be used in the returned full path (even if the path object was originally created using a mapped drive letter designation).
Syntax
object.GetFullUNCFilePath(strFile)
object
Required. The MsiPath object.
strFile
Required. The name of the file to append to the current path. See the MsiPath main topic for filename syntax.  If an empty string is passed in strFile, just the path itself (terminated  with a backslash) will be returned.
Remarks
None.
#$+KGetFileAttribute Method
	MsiPath Object	Msi Objects	Database Tables
The GetFileAttribute method returns the Boolean state of a specified attribute for a file or directory.
Syntax
object.GetFileAttribute(file, attribute)
object
Required. The MsiPath object.
file
Required. The name of the file or directory. See the MsiPath main topic for filename syntax. If the file name is null, the attribute of the directory will be used.
attribute
Required. An integer enumeration value specifying the attribute to queried. See the remarks below for a list of acceptable values.
Remarks
The following attributes can be queried by the GetFileAttribute method:

ifaArchive    = 0 	The file is an archive file (Windows only).
ifaDirectory  = 1 	The "file or directory" is an directory.
ifaHidden     = 2 	The file is hidden.  (Note: For Macintosh, this attribute
		is True if the 'fInvisible' Finder flag is set).
ifaNormal     = 3 	True only if no other attribute is set (Windows only).
ifaReadOnly   = 4 	The file is read-only. Applications can read the file but cannot
 		write to it or delete it.  (Note: For Macintosh, this attribute is True if the 
 		file is locked).
ifaSystem     = 5 	The file is part of the operating system or is used exclusively
 		by it (Windows only).
ifaTemp       = 6 	The file is being used for temporary storage (Windows only).
ifaCompressed = 7 	The file or directory is compressed. For a file, this means that all
 		of the data in the file is compressed. For a directory, this means that
 		compression is the default for newly created files and subdirectories.
 		(Windows only).

If any attribute enumeration value other than one of those listed is specified , a run-time error will be generated. 

 See also:  SetFileAttribute
#$+KSetFileAttribute Method
	MsiPath Object	Msi Objects	Database Tables
The SetFileAttribute method sets or clears a specified attribute for a file or directory.
Syntax
object.SetFileAttribute(file, attribute, state)
object
Required. The MsiPath object.
file
Required. The name of the file. See the MsiPath main topic for filename syntax. If the file name is null, the attribute of the directory will be set.
attribute
Required. An integer enumeration value specifying the attribute to be set or cleared. See the remarks below for a list of acceptable values.
state
Required. Boolean indicating whether the attribute is to be set or cleared.
Remarks
The following attributes can be set or cleared by the SetFileAttribute method:

ifaArchive    = 0 	The file is an archive file (Windows only).
ifaHidden     = 2 	The file is hidden.  (Note: For Macintosh, setting this attribute
		sets the 'fInvisible' Finder flag).
ifaReadOnly   = 4 	The file is read-only. Applications can read the file but cannot
 		write to it or delete it.  (Note: For Macintosh, setting or clearing this 
 		attribute locks or unlocks the file).
ifaSystem     = 5 	The file is part of the operating system or is used exclusively
 		by it (Windows only).
ifaTemp       = 6 	The file is being used for temporary storage (Windows only).
ifaCompressed = 7 	This is a read-only attribute, and cannot be set by SetFileAttribute.

If the specified file does not exist, or if any attribute enumeration value other than one of those listed is specified, a run-time error will be generated. 

  See also:  GetFileAttribute
#$+KFileSize Method
	MsiPath Object	Msi Objects	Database Tables
The FileSize method retrieves the size, in bytes, of the specified file.
Syntax
object.FileSize(file)
object
Required. The MsiPath object.
file
Required. The name of the file. See the MsiPath main topic for filename syntax.
Remarks
The returned byte count represents the logical size of the file; it does not account for the number of physical clusters (Mac: allocation blocks) allocated for the file.
#$+KFileDate Method
	MsiPath Object	Msi Objects	Database Tables
Retrieves the date and time that the specified file was created (Mac) or last written to (Windows). 
Syntax
object.FileDate(file)
object
Required. The MsiPath object.
file
Required. The name of the file. See the MsiPath main topic for filename syntax.
Remarks
The value returned by the FileDate method is compatible with the VBA Date data type.
#$+KRemoveFile Method
	MsiPath Object	Msi Objects	Database Tables
The RemoveFile method deletes a file existing in the directory associated with the MsiPath object.
Syntax
object.RemoveFile(file)
object
Required. The MsiPath object.
file
Required. The name of the file to be deleted. See the MsiPath main topic for filename syntax.
Remarks
If the specified file does not exist, RemoveFile does nothing (no error is generated).
#$+KEnsureExists Method
	MsiPath Object	Msi Objects	Database Tables
The EnsureExists method attempts to create the full path associated with the path object. Returns the number of folders actually created.
Syntax
object.EnsureExists
object
Required. The MsiPath object.
Remarks
EnsureExists attempts to create each subdirectory associated with the path object, if it doesn't already exist. For example, if the path is  "c:\dirA\dirB\dirC\", the directory "dirA" will be created on the "c:" drive, then "c:\dirA\dirB" will be created, and so on, until the entire  directory tree exists.  If any subdirectory cannot be created, a  run-time error will be generated.
#$+KRemove Method
	MsiPath Object	Msi Objects	Database Tables
The Remove method attempts to delete the empty directory associated with the path object.  If the directory is not empty, however, Remove does nothing. If the directory is empty but still cannot be deleted, a run-time error occurs.
Syntax
object.Remove
object
Required. The MsiPath object.
Remarks
Currently, Remove attempts to delete only the "outermost" directory; none of the parent directories associated with the path are deleted.

#$+KFileWritable Method
	MsiPath Object	Msi Objects	Database Tables
The FileWritable method returns True if the specified file exists, AND that file can be opened for write-access.
Syntax
object.FileWritable(file)
object
Required. The MsiPath object.
file
Required. The name of the file. See the MsiPath main topic for filename syntax.
Remarks
None.
#$+KFileInUse Method
	MsiPath Object	Msi Objects	Database Tables
The FileInUse method returns True if a file with the given name exists in the directory associated with the Path object, AND that file is 'in use' by another process.
Syntax
object.FileInUse(file)
object
Required. The MsiPath object.
file
Required. The name of the file. See the MsiPath main topic for filename syntax.
Remarks
Returns an error record if the specified file doesn't exist.
#$+KGetFileChecksum Method (C++ interface)
	MsiPath Object	Msi Objects	Database Tables
The GetFileChecksum method computes the checksum of the specified file, and also returns the original checksum stored in the Portable Executable (PE) header of the file (if the file is of the PE format).
Syntax
object.GetFileChecksum(const ICHAR* szFileName,DWORD* pdwHeaderSum, DWORD* pdwComputedSum)
object
Required. The IMsiPath object.
szFileName
Required. A string containing the name of the file. See the MsiPath main topic for filename syntax.
pdwHeaderSum
Required. A pointer to the variable that receives the original checksum stored in the file header, or zero if the file cannot be identified as an executable.
pdwComputedSum
Required. A pointer to the variable that receives the computed checksum.
Remarks
Returns an error record only if an unexpected error occurs.  If the specified file does not have a PE header section (i.e. is not a PE .exe or .dll file), zero will be returned in pdwHeaderSum, but no error record will be returned.
#$+KComputeFileChecksum Method
	MsiPath Object	Msi Objects	Database Tables
The ComputeFileChecksum method computes and returns the checksum of the specified file.
Syntax
object.ComputeFileChecksum(strFileName)
object
Required. The IMsiPath object.
strFileName
Required. A string containing the name of the file. See the MsiPath main topic for filename syntax.
Returns
The computed checksum is returned as the function result.
#$+KGetFileOriginalChecksum Method
	MsiPath Object	Msi Objects	Database Tables
The GetFileOriginalChecksum method returns the original checksum stored in the Portable Executable (PE) header of the specified file.
Syntax
object.GetFileOriginalChecksum(strFileName)
object
Required. The IMsiPath object.
strFileName
Required. A string containing the name of the file. See the MsiPath main topic for filename syntax.
Returns
The original checksum stored in the PE header of the file is returned as the function result.  If the file is not an executable (i.e. has no PE header, or the header is corrupt), then zero is returned.
#$+KVerifyFileChecksum Method
	MsiPath Object	Msi Objects	Database Tables
The GetFileChecksum method computes the checksum of the specified file, and also returns the original checksum stored in the Portable Executable (PE) header of the file (if the file is of the PE format).
Syntax
object.GetFileChecksum(const ICHAR* szFileName,DWORD* pdwHeaderSum, DWORD* pdwComputedSum)
object
Required. The IMsiPath object.
szFileName
Required. A string containing the name of the file. See the MsiPath main topic for filename syntax.
pdwHeaderSum
Required. A pointer to the variable that receives the original checksum stored in the file header, or zero if the file cannot be identified as an executable.
pdwComputedSum
Required. A pointer to the variable that receives the computed checksum.
Remarks
Returns an error record only if an unexpected error occurs.  If the specified file does not have a PE header section (i.e. is not a PE .exe or .dll file), zero will be returned in pdwHeaderSum, but no error record will be returned.
#$+KUpdateResource Method
	MsiPath Object	Msi Objects	Database Tables
The UpdateResource method enables the caller to modify an existing resource in a specified file.
Syntax
object.UpdateResource(file, resType, resID, data)
object
Required. The MsiPath object.
file
Required. The name of the file to be modified. See the MsiPath main topic for filename syntax.
resType
Required. An integer value representing the resource type to be modified.  See the remarks below for additional details.
resID
Required. An integer value representing the ID of the resource to be modified.
data
Required. A string containing the data to be written to the specified resource.  Note that although this parameter is a string, resource data is not limited to printable characters; any values that can fit in each byte of the string are permissible.
Remarks
The integer representing the resource type can be any user-defined value desired; alternatively, to update a "standard" resource type, the following enumeration values are available:
 
RT_ACCELERATOR:	Accelerator table
RT_BITMAP:	Bitmap resource
RT_DIALOG:	Dialog box
RT_FONT:	Font resource
RT_FONTDIR:	Font directory resource
RT_MENU:	Menu resource
RT_RCDATA:	Application-defined resource (raw data)
RT_STRING:	String-table entry
RT_MESSAGETABLE:	Message-table entry
RT_CURSOR:	Hardware-dependent cursor resource
RT_GROUP_CURSOR:	Hardware-independent cursor resource
RT_ICON:	Hardware-dependent icon resource
RT_GROUP_ICON:	Hardware-independent icon resource
RT_VERSION:	Version resource

UpdateResource cannot be used to create new resource entries within a file; it can only update existing resources.  If a resource of the specified type and ID does not exist in the file, a run-time error will be generated.
 
See also:  ReadResource
#$+KReadResource Method
	MsiPath Object	Msi Objects	Database Tables
The ReadResource method enables the caller to read from a file the contents of a specified resource.  The data from the resource is returned to the caller as a string.
Syntax
object.ReadResource(file, resType, resID)
object
Required. The MsiPath object.
file
Required. The name of the file to read. See the MsiPath main topic for filename syntax.
resType
Required. An integer value representing the resource type to be read.  See the remarks below for additional details.
resID
Required. An integer value representing the ID of the resource to be read.
Remarks
The integer representing the resource type can be any user-defined value desired; alternatively, to read a "standard" resource type, the following enumeration values are available:
 
RT_ACCELERATOR:	Accelerator table
RT_BITMAP:	Bitmap resource
RT_DIALOG:	Dialog box
RT_FONT:	Font resource
RT_FONTDIR:	Font directory resource
RT_MENU:	Menu resource
RT_RCDATA:	Application-defined resource (raw data)
RT_STRING:	String-table entry
RT_MESSAGETABLE:	Message-table entry
RT_CURSOR:	Hardware-dependent cursor resource
RT_GROUP_CURSOR:	Hardware-independent cursor resource
RT_ICON:	Hardware-dependent icon resource
RT_GROUP_ICON:	Hardware-independent icon resource
RT_VERSION:	Version resource

If a resource of the specified type and ID does not exist in the file, a run-time error will be generated.

See also:  UpdateResource
#$+KClusteredFileSize Method
	MsiPath Object	Msi Objects	Database Tables
Rounds a file size, in bytes, to a multiple of the volume cluster size,  to indicate the amount of disk space required. The returned value is expressed in units of 512 bytes. (!!Compressed volumes??.!!
Syntax
object.ClusteredFileSize(size)
object
Required. The MsiPath object.
size
Required. The size of the file in bytes.
Remarks
!!Additional notes!! 
#$+KGetFileVersionString Method
	MsiPath Object	Msi Objects	Database Tables
Returns a string representation of a file's version. If a file with the given name does not exist in the directory associated with the path object, or that file has no version information, an empty string will be returned.
Syntax
object.GetFileVersionString(file)
object
Required. The MsiPath object.
file
Required. The name of the file. See the MsiPath main topic for filename syntax.
Remarks
The format of the returned version string depends on the platform:

Windows:
The version string will be of the form "a.b.c.d", where each letter represents the string equivalent of an integer ranging from 0 to 65535.

Mac:
The version string will be of the form:
 <majorRev>.<minorRev>.<bugFixRev>.<stage>.<nonRelRev>
See the CheckFileVersion function for further explanation of each version field.
#$+KCheckFileVersion Method
	MsiPath Object	Msi Objects	Database Tables
Checks a file against supplied version and language strings and returns an enumeration indicating whether the actual file's version is newer, older or the same as the supplied version.
Syntax
object.CheckFileVersion(strFilename, strVersion, strLanguage)
object
Required. The MsiPath object.
strFilename
Required. The name of the file. CheckFileVersion will look for a file of this name in the directory associated with the MsiPath object, and check that file's version against the string supplied in the 'version' parameter. See the MsiPath main topic for filename syntax.
strVersion
Required. Version string to compare against the existing file. This string must be of the form "a.b.c.d",  with each field containing a 16-bit numeric value. Omitted fields are assumed to be the least significant (eg d then c then b then a) and are parsed as zeros. Thus, "2.1" is equivalent to "2.1.0.0". If this string is empty, a version number of "0.0.0.0" (i.e. an unversioned file) is assumed.
strLanguage
Required.  A string containing containing identifiers as decimal numbers. If more than one language is supported,  the identifiers should be separated by commas.  See GetLangIDStringFromFile for more information about the language string format.
Return Types
icfvNoExistingFile:	No existing file with the specified name was found in the directory
		associated with the path object.
icfvExistingLower:	The existing file's version is lower than the given version.
icfvExistingEqual:	The existing file's version is equal to the given version.
icfvExistingHigher:	The existing file's version is higher than the given version.
icfvVersStringError:	A syntax error was found in the version string.

Remarks
If the strVersion parameter is an empty string, and the existing file is versioned, icfvExistingHigher will always be returned.
If a valid string is supplied in strVersion, and the existing file is unversioned, icfvExistingLower will always be returned.
If a valid string is supplied in strVersion, and the existing file is of the same version, the languages specified in the strLanguage parameter will be compared against the languages supported by the existing file.  If the existing file supports the same set of languages as those specified in strLanguage (or if strLanguage is an empty string, and the existing file has no language information either), icfvExistingEqual will be returned.  If strLanguage specifies any languages that the existing file does not support, icfvExistingLower will be returned.
If strVersion is an empty string, and the existing file is also unversioned, the 'LastModified' and 'Created' dates of the existing file will be compared.  If they differ by more than two seconds (i.e. the file has been modified since it was installed), icfvExistingHigher will be returned.  Otherwise, icfvExistingLower will be returned.
#$+KGetImportModulesEnum Method
	MsiPath Object	Msi Objects	Database Tables
This method is undocumented.
#$+KGetLangIDStringFromFile Method
	MsiPath Object	Msi Objects	Database Tables
Returns a string containing a file's language identifiers as decimal numbers. If more than one language is supported, the identifiers will be separated by commas.
Syntax
object.GetLangIDStringFromFile(file)
object
Required. The MsiPath object.
file
Required. The name of the file.  GetLangIDStringFromFile will look for a file of this name in the directory associated with the MsiPath object.  See the MsiPath main topic for filename syntax.
Remarks
On the Win32 platform, The language IDs returned by GetLangIDStringFromFile are 16-bit values, expressed as a decimal number.  Each ID consists of the combination of a primary language ID in bits 0-9, and a sublanguage ID in bits 10-15.  For example, the primary language ID for German is 0000000111 (binary), with a sublanguage ID of 000001 (binary). Thus, the full LANGID is:

	000001 + 0000000111 = 0x0407, or 1031 decimal.

Similarly, the LANGID for U.S. English works out to be 1033, so for a file that supports U.S. English and German, GetLangIDStringFromFile will return "1033, 1031".

On the Macintosh platform, the language ID returned by GetLangIDStringFromFile is the 'region code' found in the version resource of the file.
#$+KGetSelfRelativeSD Method
	MsiPath Object	Msi Objects	Database Tables
This method is undocumented.
#$+KCheckLanguageIDs Method
	MsiPath Object	Msi Objects	Database Tables
Checks a file against a set of language IDs, and returns an enumeration indicating the relationship between the file languages and the supplied languages.
Syntax
object.CheckLanguageIDs(file, ids)
object
Required. The MsiPath object.
file
Required. The name of the file. CheckLanguageIDs will look for a file of this name in the directory associated with the MsiPath object, and check that file's supported languages against the languages specified in the "ids" parameter.  See the MsiPath main topic for filename syntax.
ids
Required. A string specifying the list of integer language IDs to check for. If more than one ID is supplied, they must be separated by commas.  For example: "1031, 1033, 2057"
Return Types
iclExistNoFile:	No existing file with the specified name in the directory
		associated with the path object.
iclExistNoLang:	The existing file has no language information.
iclExistSubset:	The specified language set encompasses every language
		supported in the existing file, plus additional languages
		not supported by the existing file.
iclExistEqual:	The specified language set is identical to the language
		set supported by the existing file.
iclExistIntersect:	The specified language set and the language set
		supported by the existing file have at least one language
		in common, and each set also encompasses at least one 
		language not supported by the other.
iclExistSuperset:	The existing file supports at least one language not
		encompassed by the specified language set.
iclExistNullSet:	The specified language set and the language set supported
		by the existing file have no languages in common.
iclExistLangNeutral:	The existing file returns a language-neutral LANGID, 
		but the specified language set supports one or more 
		specific languages.
iclNewLangNeutral:	The specified language set contains a language-neutral
		LANGID, but the existing file supports one or more specific
		languages.
iclExistLangSetError:	The existing file returns a language-neutral LANGID,
		but also contains one or more non-neutral IDs.
iclNewLangSetError:	The specified language set contains a language-neutral
		LANGID, but also contains one or more non-neutral IDs.
iclLangStringError:	The specified language set string contains a syntax 
		error.  Possible errors include non-numeric characters,
		empty fields between comma separators, etc.

Remarks
A LANGID value is "language-neutral" if the primary language ID (the lower 10 bits) portion of the value is all zeros.  If either the existing file or the language set string passed in the ids parameter contains a language-neutral LANGID, no other LANGIDs are allowable in the set.

If both the existing file and the given language set are "language-neutral", iclExistEqual will be returned.

If an empty string is passed in "ids", and the existing file supports at least one language, iclExistNullSet will be returned.

#$+KCompare Method
	MsiPath Object	Msi Objects	Database Tables
The Compare method compares the path associated with the object passed as an argument to the path of the current object. An enumeration describing the relationship between the two path objects is returned.
Syntax
object.Compare(path)
object
Required. The MsiPath object.
path
Required. Another MsiPath object that will supply the path for comparison.
Return Types
ipcEqual:	The paths of the two objects are equal.
ipcParent:	The path of the object passed as an argument is a parent
		directory of the current object's path.
ipcChild:	The current object's path is a parent directory of the path of
		the object passed as an argument.
ipcNoRelation	The paths of the two objects are unrelated (i.e. the root
		directory of each is different).
#$+KChild Method
	MsiPath Object	Msi Objects	Database Tables
The Child method compares the path associated with the object passed as an argument (the "parent" path) to the path of the current object, and returns a string that  contains the portion of the current object's path not encompassed by the parent path,  i.e. the "child" path.
Syntax
object.Child(parent)
object
Required. The MsiPath object.
parent
Required. An MsiPath object which represents a path that is a parent of the current object's path.
Remarks
The child path returned will always contain a trailing directory separator. For example,if the path of the current object is:
"c:\Windows\System\Drivers\"

and the path of the parent object is:
"c:\Windows\"

the string returned by the Child method will be:
"System\Drivers\"

If the paths of the two MsiPath objects are equal, an empty string will be returned.  If the "parent object" represents a path that is not actually a parent of the current object's path, a run-time error (1344: "Not a parent") will be thrown.
#$+KTempFileName Method
	MsiPath Object	Msi Objects	Database Tables
Creates a temporary file in this object's directory, and returns the full path to the temporary file.  An optional prefix and/or extension may be supplied for use when generating the file name.  The generated file name is of the 8.3 form where the characters in the file name not used by the prefix are random hexidecimal numbers.
Syntax
object.TempFileName(prefix, extension, fileNameOnly)
object
Required. The MsiPath object.
prefix
Optional. The prefix for the file name.  At most the first 8 characters of this string are used.  If this argument is not supplied, no prefix is given to the file name (the file name will consist entirely of random hexidecimal digits.
extension
Optional. The extension for the file name.  At most the first 3 characters of this string are used.  If this argument is not supplied, the default extension "tmp" is used.
fileNameOnly
Optional. True to return the temporary file name only.  False to return the full path of the temporary file.
Remarks
 None.
#$+KFindFile Method
	MsiPath Object	Msi Objects	Database Tables	Signature Table
The FindFile method attempts to find a match for the file signature passed in, and returns True if a file of the specified filter exists. If found, the path is changed to the location of the file.
Syntax
object.FindFile(record, depth)
object
Required. The MsiPath object.
record
Required. The file signature filter. Must be of the same form as a record from the Signature table MINUS the key Signature column.
depth
Optional. The depth to which the file signature is to be searched.
#$+KSubFolders Method
	MsiPath Object	Msi Objects	Database Tables
Returns a collection of strings containing the names of all the sub-folders of the path.
Syntax
object.SubFolders
object
Required. The MsiPath object.
Remarks
!!Additional notes!! 
#$+KBindImage Method
	MsiPath Object	Msi Objects	Database Tables
Binds an executable import address table to the functions imported from DLLS. 
Syntax
object.BindImage(file, dllPath)
object
Required. The MsiPath object.
file
Required. the executable filename string.
dllPath
Optional. A string representing the set of ;  separated paths where to get the import DLLS. The function prefixes the dllPath string with the path of the executable and appends it with the system path.
Remarks
Applicable only on Windows systems. The service does nothing on Mac.
#$+KSupportsLFN Property
	MsiVolume Object	Msi Objects	Database Tables
Boolean indicating whether the volume this path is on supports long file names. If False is returned, only 8.3 file names may be used. Read-only.
Syntax
object.SupportsLFN
object
Required. The MsiVolume object.
#$K+MsiFileCopy Object
	Msi Objects	Database Tables
The MsiFileCopy object is used to copy files from a specified source directory to a specified destination directory.  The MsiFileCopy object is created by calling the  CreateCopier function.
Methods
CopyTo
ChangeMedia

#$+KCopyTo Method
	MsiFileCopy Object	Msi Objects	Database Tables
Copies a file from a source path to a destination path. File parameters are supplied as an MsiRecord object.
Syntax
object.CopyTo(srcPath, destPath, paramRec)
object
Required. The MsiFileCopy object.
srcPath
Required. The MsiPath object representing the source directory.
destPath
Required. The MsiPath object representing the destination directory. This directory must exist. If it does not, a run-time error will be generated.
paramRec
Required. An MsiRecord object containing file parameters as follows:
  Field 1: For compressed files, the Diamond cabinet identifier.  For uncompressed files,
      the source file name.
  Field 2: The destination file name.
  Field 3: The file attributes to set - an integer containing bit flags:
    Bit 0:	Read Only
    Bit 1:	Hidden
    Bit 2:	System
    (all other bits are ignored)
  Field 4: Unclustered size of file, in bytes.
Remarks
When uncompressing files from cabinets, note that the ChangeMedia method must first be called to designate the proper source cabinet before calling CopyTo.
 
 (Windows Only)
 New files created by the CopyTo function will always have the archive bit set, which is the standard  for new files created by any application.  Thus, there is no separate bit in field 3 of the record  passed to CopyTo for setting the archive bit.
#$+KChangeMedia Method
	MsiFileCopy Object	Msi Objects	Database Tables
The method is used to request a change in source media. For compressed files in particular, this method signals that the source of compressed data (as used by the CopyTo method) needs to change from one cabinet file to another.
Syntax
object.ChangeMedia(srcPath, keyFileName)
object
Required. The MsiFileCopy object.
srcPath
Required. The MsiPath object representing the media source directory.
keyFileName
Required. The name of a 'key' file on the source media. See the remarks below.
Remarks
After a cabinet Copier object has been created (via the MsiServices CreateCopier method), ChangeMedia must be called to designate the source cabinet file before the CopyTo method is called, and again each time a file compressed in a cabinet other than the current cabinet is to be copied.  Also, note that for files that are split across cabinets, the CopyTo method will return with an error record (imsgNeedNextCabinet, error number 1390) when the file data contained in the current cabinet has finished copying.  In this case, the ChangeMedia method should be called with the name of the next cabinet, and then CopyTo should be called again with the same file, to allow the second part of the split file to finish copying (this procedure should be repeated as necessary to complete copying of files that may be split across more than two cabinets).

When copying files from cabinets, the name supplied in the keyFileName parameter MUST be the name of the cabinet file to be opened.  If a valid cabinet file with this name is not found in the directory specified by the srcPath object, an error will be returned. 
 If ChangeMedia is being called for a non-cabinet MsiFileCopy object, the keyFileName is ignored. 
Cabinets stored in a Database stream
 If the keyFileName name is preceded by a '#' character, this indicates that the source media is a a cabinet  that is stored in a stream within the .MSI database. In this case, ChangeMedia will attempt to open  and copy from a stream within the MsiStorage object that was passed to the CreateCopier method.  The  name of the stream is the value in keyFileName (without the leading '#').
Cabinets stored in a Launcher resource
 If the keyFileName name is preceded by an '@'character, this indicates that the source media  is a cabinet stored within a resource of the launching executable file. In this case, ChangeMedia will  attempt to find and load the cabinet from a resource whose resource name is the same as the value in  keyFileName (without the leading '@'), and whose integral resource type is RT_INSTALL_DIMCAB (42).
  
 NOTE!  The functionality of copying files from cabinets within a module resource is not available via  automation.  This is because there is no standard way for an automation controller to initialize an  MsiFileCopier object with a valid module handle, which is required by ChangeMedia to be able to locate  module resources.  Thus, this functionality is only available when running the Installer via a  host launcher that has direct access to the Installer COM interfaces.
#$K+MsiFilePatch Object
	Msi Objects	Database Tables
The MsiFilePatch object is used to patch existing files in place. The MsiFilePatch object is created by calling the  CreatePatcher function.
Methods
ApplyPatch
ContinuePatch
CancelPatch
CanPatchFile

#$+KApplyPatch Method
	MsiFilePatch Object	Msi Objects	Database Tables
This method applies a patch to a target file, producing an output file.
Syntax
object.ApplyPatch(targetPath,targetFile,outputPath,outputFile,patchPath,patchFile,perTick)
object
Required. The MsiFilePatch object.
targetPath
Required. An MsiPath object specifying the location of the file to be patched.
targetName
Required. The name of the target file.
outputPath
Required. An MsiPath object specifying the location of the output file.
outputName
Required. The name of the output file.
patchPath
Required. An MsiPath object specifying the location of the patch file.
patchName
Required. The name of the patch file.
perTick
Optional. The number of bytes to patch. This method will return control to the caller after these number of bytes have been patched, or the file is completely patched, whichever occurs first.  Note that the actual patch application will continue in a seperate thread after this method returns, if necessary.  This method may return after more than the given number of bytes has been patched.  If this method completes before the file has been patched, an error is thrown indicating how many bytes have been patched. The caller should call ContinuePatch to resume the patch application. If the file has been compeletely patched and no errors have occured, no error is thrown. Ommitting or passing 0 for this value causes this method to patch the entire file before returning.
Remarks

#$+KContinuePatch Method
	MsiFilePatch Object	Msi Objects	Database Tables
This method continues a patch application initiated by ApplyPatch.
Syntax
object.ContinuePatch()
object
Required. The MsiFilePatch object.
Remarks
This method will patch at least as many bytes as specified in the perTick parameter to ApplyPatch, or the remainder of the file, whichever is less. If the entire file is not patched and error is thrown indicating the number of bytes patched.  In this case, this method should be called again to resume the patch application.
#$+KCancelPatch Method
	MsiFilePatch Object	Msi Objects	Database Tables
This method cancels a patch application initiated by ApplyPatch.
Syntax
object.CancelPatch()
object
Required. The MsiFilePatch object.
Remarks

#$+KCanPatchFile Method
	MsiFilePatch Object	Msi Objects	Database Tables
This method determines if an existing file can be patched.  
Syntax
object.CanPatchFile(targetPath,targetName,patchPath,patchName)
object
Required. The MsiFilePatch object.
targetPath
Required. An MsiPath object representing the location of the file being checked.
targetFile
Required. The name of the file being checked.
patchPath
Required. An MsiPath object representing the location of the patch file.
patchFile
Required. The name of the patch file.
Return Types
icpCanPatch:	Can patch file to update.
icpCannotPatch:	File cannot be patched.
icpUpToDate:	File is already up-to-date. Patch is unecessary.