错误110(open_failed)MsiOpenDatabase - 循环错误

时间:2015-09-03 08:54:59

标签: c# .net windows-installer

我在程序中遇到问题。我需要捕获一些关于不同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编程的新手......

1 个答案:

答案 0 :(得分:0)

我假设你已经调试了这个,看到你正在获得本地包的完整路径。所以,如果一切正常,严格来说,最后一个参数是一个不是参考。所以试试:

IntPtr pHDatatabase; MsiOpenDatabase(filename,persist,out pHDatatabase);

那种东西 - 这就是我使用的东西。见:

http://www.pinvoke.net/default.aspx/msi.MsiOpenDatabase

我无法看到你的互操作定义,所以你可能需要发布它,如果它不像pinvoke.net描述的那样。