I'm facing a problem in my program. I need to catch some infos about different MSIs, so I'm using the MSI Database functions from msi.dll.
In a loop, I'm creating a list of objects (called PackFile). Each object must contains infos about each file installed by the msi, and each list contains all the files installed by a given msi.
I have differents methods for all the data I need to have (like the component, componentcode, installlevel of the feature, etc.). But all the methods fail.
Here's a sample of one of those methods, this one's purpose is to find the component code of the file:
public string findComponentCode(string productCode, string ComponentName)
{
int pathLen = 512;
StringBuilder path = new StringBuilder(pathLen);
IntPtr phDatabase = IntPtr.Zero;
IntPtr hView = IntPtr.Zero;
IntPtr hRecord = IntPtr.Zero;
int componentCodeLen = 512;
StringBuilder componentCode = new StringBuilder(componentCodeLen);
MsiGetProductInfo(productCode, "LocalPackage", path, ref pathLen);
MsiOpenDatabase(path.ToString(), IntPtr.Zero, ref phDatabase);
MsiDatabaseOpenView(phDatabase, "SELECT * FROM `Component`", ref hView);
MsiViewExecute(hView, hRecord);
while (MsiViewFetch(hView, ref hRecord) != 259)
{
int bufferLen = 512;
StringBuilder buffer = new StringBuilder(bufferLen);
MsiRecordGetString(hRecord, 1, buffer, ref bufferLen);
if (String.Compare(buffer.ToString(), ComponentName) == 0)
{
MsiRecordGetString(hRecord, 2, componentCode, ref componentCodeLen);
break;
}
}
MsiViewClose(hView);
MsiCloseHandle(hRecord);
MsiCloseHandle(phDatabase);
return componentCode.ToString();
}
This function is in a loop, in order to find the code for every files.
My problem is that at a moment there is an error, the MsiOpenDatabase function return 110 (open_failed), and I can't understand why... And every time it is at the same file of the same msi...
Can someone give me a hint ?
PS: I'm quite a newbie in C# and .NET programming...