MsiSourceListEnumSources 互操作 c#

MsiSourceListEnumSources interop c#

下午好,我希望有人能帮助我我正在尝试使用 MsiSourceListEnumSources api 调用从已安装的 msi 产品中获取源位置。

我总是得到一个 invalid_parameter return 并且无法解决这个问题。

[DllImport(MSI_LIB, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.U4)]
    internal static extern MsiError MsiSourceListEnumSources(
        string szProductOrPatchCode,
        string szUserSid,
        MsiInstallContext dwContext,
        MsiCode dwOptions,
        int dwIndex,
        [Out] StringBuilder szSource,
        ref int pcchSource);


[Flags]
public enum MsiInstallContext :int
{
    MsiinstallcontextNone = 0,
    MsiinstallcontextUsermanaged = 1,
    MsiinstallcontextUserunmanaged = 2,
    MsiinstallcontextMachine = 4,

    MsiinstallcontextAll =
        (MsiinstallcontextUsermanaged | MsiinstallcontextUserunmanaged | MsiinstallcontextMachine),

    MsiInstallContext_AlluserManaged = 8
}


[Flags]
public enum MsiCode : int
{
    MSICODE_PRODUCT = 0,
    MSISOURCETYPE_NETWORK = 1,
    MSISOURCETYPE_URL = 2
}

 var productCode = "{E636F802-3504-4DE0-92AD-2A47138974FA}";
 var counter = 0;
 int MAX_PATH = 260;
 var strOutPut = new StringBuilder(MAX_PATH);
 int sizeOf = MAX_PATH;
 string EveryOne = "s-1-1-0";
 string sid = UserPrincipal.Current.Sid.ToString();

 var success = MsiInterop.MsiSourceListEnumSources(
            productCode, null, MsiInstallContext.MsiinstallcontextMachine , MsiCode.MSICODE_PRODUCT , counter,  strOutPut, ref sizeOf );

我不知道我做错了什么,我尝试过或感觉有一百零一种不同的组合。

如有任何帮助,我们将不胜感激。

谢谢

这对我有用:

[DllImport("msi", CharSet = CharSet.Unicode)]
    public static extern int MsiSourceListEnumSourcesW(string pc,string sid, MsiInstallContext ctx, MsiCode opts, int index,  [Out] StringBuilder szResult, ref int len);
}

连同您的枚举和此调用:

int len = 16384;
StringBuilder thing = new StringBuilder(null, len); 
int rf = MsiInvoke.MsiSourceListEnumSourcesW(ProdCode, null, 
                MsiInvoke.MsiInstallContext.MsiinstallcontextMachine,
                MsiInvoke.MsiCode.MsiProdN,
                0, 
                thing,
                ref len);

你的代码中的错误似乎是你不能只设置 MSICODE_PRODUCT 标志,你必须设置一个 sourcetype 标志,并且网络风格有效。