我在程序中遇到问题。我需要捕获一些关于不同MSI的信息,所以我使用msi.dll中的MSI数据库函数。
在循环中,我创建了一个对象列表(称为PackFile)。每个对象必须包含有关msi安装的每个文件的信息,每个列表包含给定msi安装的所有文件。
我有所需的所有数据的不同方法(如组件,组件代码,功能的安装级别等)。但所有方法都失败了。
以下是其中一种方法的示例,其目的是找到文件的组件代码:
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();
}
此函数处于循环中,以便查找每个文件的代码。
我的问题是,在某个时刻出现错误,MsiOpenDatabase函数返回110(open_failed),我无法理解为什么......并且每次它都在同一个msi的同一个文件中。 ..
有人能给我一个暗示吗?
PS:我是C#和.NET编程的新手......
答案 0 :(得分:0)
我假设你已经调试了这个,看到你正在获得本地包的完整路径。所以,如果一切正常,严格来说,最后一个参数是一个不是参考。所以试试:
IntPtr pHDatatabase; MsiOpenDatabase(filename,persist,out pHDatatabase);
那种东西 - 这就是我使用的东西。见:
http://www.pinvoke.net/default.aspx/msi.MsiOpenDatabase
我无法看到你的互操作定义,所以你可能需要发布它,如果它不像pinvoke.net描述的那样。