MsiSourceListEnumSources互操作c#

MsiSourceListEnumSources互操作c#,c#,windows-installer,interop,C#,Windows Installer,Interop,下午好,我希望有人能帮助我,我正在尝试使用MsiSourceListEnumSources api调用从已安装的msi产品获取源位置 我总是得到一个无效的_参数返回,无法解决这个问题 [DllImport(MSI_LIB, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.U4)] internal static extern MsiError MsiSourceListEnumSources( s

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

我总是得到一个无效的_参数返回,无法解决这个问题

[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_产品标志,必须设置sourcetype标志,网络风格才能正常工作

CharSet.Auto
更改为
CharSet.Unicode
。您是否对已包含所有这些内容的库感兴趣?始终对查看选项感兴趣。尝试将字符集更改为Unicode,但仍然得到无效参数,查看msdn文档-似乎是由于productCode或sid参数和安装上下文造成的?非常感谢您刚刚测试了这么多,现在正在工作,我不会让测试添加更多标志有点令人沮丧。为什么我总是觉得MS文档如此令人沮丧。仅针对其他用户,我在MSICOMBINE=MSICODE|PRODUCT | MSISOURCETYPE|网络上创建了一个组合