MsiSourceListEnumSources互操作c#
下午好,我希望有人能帮助我,我正在尝试使用MsiSourceListEnumSources api调用从已安装的msi产品获取源位置 我总是得到一个无效的_参数返回,无法解决这个问题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
[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|网络上创建了一个组合