C# から MsiEnumRelatedProducts を呼び出すのに問題はありません。p/invoke 定義でいくつかのバリエーションを試しましたが、うまくいきませんでした (out と ref)。問題は、39 文字の長さの文字列を指すことになっている LPTSTR である最後のパラメーターだと思います。
ピンボークと呼び出しは次のとおりです。
public static string EnumRelatedProducts(string UpgradeCode, int Index)
{
string ProductCode;
UInt32 rc = MsiEnumRelatedProducts(UpgradeCode, 0, Index, out ProductCode);
Console.WriteLine("Returned");
if (rc != 0)
{
return string.Empty;
}
return ProductCode;
}
[DllImport("msi.dll", CharSet = CharSet.Auto)]
private static extern UInt32 MsiEnumRelatedProducts(string UpgradeCode, int reserved, int Index, out string ProductCode);
クラッシュは、渡された UpgradeCode に少なくとも 1 つの製品がインストールされている場合にのみ発生することに注意してください。