VB调用msi.dll中的MsiLocateComponent函数

时间:2014-04-18 21:23:01

标签: vb.net winapi windows-installer

我试图获得this microsoft kb article建议的Office程序的安装路径(因为Office开始菜单快捷方式不再指向路径;谢谢Microsoft)。

当然,KB示例使用C ++和本机库,我试图在VB.NET中使用以下代码进行复制

<Runtime.InteropServices.DllImport("msi.dll")> Public Shared Function MsiLocateComponent(szComponent As String, ByRef lpPathBuf As Char(), ByRef pcchBuf As Integer)
End Function

我从下面调用此函数,我希望返回一个至少包含点的消息框(如果其余的失败)。相反,我什么都没得到,所以我认为代码会遇到某种错误(虽然因为我没有例外,但它是沉默的。)

Shared Function DealWithWinInstallerPath(ProgramPath As String) As String
    Dim sPath(300) As Char
    Dim sSize As Integer = 300
    Dim state As Integer = MsiLocateComponent("{019C826E-445A-4649-A5B0-0BF08FCC4EEE}", sPath, sSize)
    MsgBox(state & ".")
End Function

(请注意,该函数有一个将在未来使用的参数,但其内容仅用于测试目的。)

我是否错误地宣布了该功能?传递错误的论点? msi.dll不是库的正确名称吗? msdn database也无济于事。

2 个答案:

答案 0 :(得分:2)

对于托管代码,Windows Installer XML(WiX)部署工具基础(DTF)中的Microsoft.Deployment.WindowsInstaller互操作程序集是可行的方法。 DTF的ComponentInstallation类有一个名为Path的只读属性,它封装了对MsiLocateComponent()的调用

安装完成后,您可以在C:\ Program Files(x86)\ WiX Toolset v3.8 \ SDK中找到DLL。

您还可以阅读源代码,了解有关如何进行P / Invoke MSI API调用的指针。

答案 1 :(得分:1)

如果您阅读MSDN文档,则首选MsiGetComponentPath,此处有一个互操作示例:

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