无法从Pascal脚本获取注册到Visual Studio 17及更高版本实例的程序包引用

夜行者

我需要定义是否在Visual Studio 2017中安装了特定的扩展名。我可以使用Microsoft.VisualStudio.Setup.Configuration.InteropC#获取注册到VS实例的包引用这是工作代码的示例:

var query = (ISetupConfiguration2) new SetupConfiguration();
var e = query.EnumInstances();
int fetched;
var instances = new ISetupInstance[1];
do
{
    e.Next(1, instances, out fetched);
    if (fetched <= 0) continue;

    ISetupInstance2 instance = instances[0] as ISetupInstance2;
    if (instance == null)
        continue;

    var temp = instance.GetPackages();
    var temp2 = temp.Select(p => p.GetId());

} while (fetched > 0);

问题是我必须使用Inno Setup及其Pascal脚本来执行此操作。目前,我有以下代码:

const
  CLSID_SetupConfiguration = '{177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D}';
type
  ISetupPackageReference = interface(IUnknown)
    '{DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5}'
    function GetId(out result: WideString): HResult;
  end;

  packageReference = array[0..10] of ISetupPackageReference;

  ISetupInstance2 = interface(IUnknown)
    '{89143C9A-05AF-49B0-B717-72E218A2185C}'
    function GetPackages(out pack: packageReference): HResult;
  end;

  arrISetupInstance2 = array[1..1] of ISetupInstance2;

  IEnumSetupInstances = interface(IUnknown)
    '{6380BCFF-41D3-4B2E-8B2E-BF8A6810C848}'
    function Next(celt: Integer; var rgelt: arrISetupInstance2; out pceltFetched: Integer): HResult;
    function Skip(celt: Integer): HResult;
    function Reset: HResult;
    function Clone(out pEnumSetupInstances: IEnumSetupInstances): HResult;
  end;

  ISetupConfiguration = interface(IUnknown)
    '{42843719-DB4C-46C2-8E7C-64F1816EFD5B}'
    function EnumInstances(out pEnumSetupInstances: IEnumSetupInstances): HResult;
  end;

  ISetupConfiguration2 = interface(IUnknown)
    '{26AAB78C-4A60-49D6-AF3B-3C35BC93365D}'
    function EnumInstances(out pEnumSetupInstances: IEnumSetupInstances): HResult;
  end;

procedure GetArrayOfVSExtensions;
var
  MyResult: String;
  obj: IUnknown;
  setupConfiguration: ISetupConfiguration2;
  setupInstances: IEnumSetupInstances;
  instances: arrISetupInstance2;
  instance: ISetupInstance2;
  fetched: Integer;
  hr: HResult;
  MyPackages: packageReference;
  FirstInstance: ISetupPackageReference;
  NameOfExtension: WideString;

begin
  obj := CreateComObject(StringToGUID(CLSID_SetupConfiguration));
  setupConfiguration := ISetupConfiguration2(obj);
  hr := setupConfiguration.EnumInstances(setupInstances);
   fetched := 0;

  hr := setupInstances.Next(1, instances, fetched); 
  instance := instances[1];
  hr := instance.GetPackages(MyPackages);

  FirstInstance := MyPackages[3];
  hr := FirstInstance.GetId(NameOfExtension); { Here I get null pointer exception }
end;

GetPackages()在我的情况下,方法似乎无法正常工作,结果MyPackages为空。

有谁知道我如何获得有效的扩展数组并使此方法起作用?

提前致谢。

夜行者

感谢马丁·普里克里Martin Prikryl)的评论,我设法解决了这个问题(再次感谢您)。

GetPackages()方法在ISetupInstance2继承自接口中声明ISetupInstance因此,ISetupInstance在声明时必须声明from的方法ISetupInstance2

ISetupInstance2为了使用该GetPackages()方法接口的声明必须如下所示:

ISetupInstance2 = interface(IUnknown)
    '{89143C9A-05AF-49B0-B717-72E218A2185C}'
    { Inherited methods from ISetupInstance }
    function GetInstanceId(out id: WideString): HResult;
    procedure Dummy2;
    function GetInstallationName(out installationName: WideString): HResult;
    function GetInstallationPath(out installationName: WideString): HResult;
    function GetInstallationVersion(out installationVersion: WideString): HResult;
    function GetDisplayName(lcid: Integer; out displayName: WideString): HResult;
    function GetDescription(lcid: Integer; out description: WideString): HResult;
    function ResolvePath(pwszRelativePath: WideString; out result: WideString): HResult;
    { Own methods of ISetupInstance2 }
    procedure Dummy3;
    function GetPackages(out pack: packageReference): HResult;
    procedure Dummy4;
    procedure Dummy5;
    procedure Dummy6;
    procedure Dummy7;
    procedure Dummy8;
    procedure Dummy9;
    procedure Dummy10;
  end;

也许这会帮助某人解决类似的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我的Visual Studio代码应用程序不断删除导入的程序包

Visual Studio 2017无法更新Microsoft.NETCore.App程序包(“被项目阻止”)

无法在Visual Studio 2015中安装任何程序包

如何下载没有nuget.exe或Visual Studio扩展名的Nuget程序包?

Visual Studio 2012的NuGet程序包将无法在MonoDevelop 5.0.1中还原

无法通过Visual Studio Cordova构建签名的android程序包

在Visual Studio中的程序包管理器控制台上更新多个程序包

Visual Studio 2015程序包扩展,未复制引用的dll

使用Visual Studio 2017调试NuGet程序包

如何使用Visual Studio 2017创建Nuget程序包

SBT发布到Visual Studio Team Services(Web)程序包插件存储库

DSVM-Visual Studio-R-无法使用已安装的程序包

无法使Visual Studio定位到正确的Android版本

从Visual Studio中的“管理NuGet程序包”功能安装iCal.NET时出现“错误:无法安装程序包”

生成代理无法在Visual Studio Team Service上看到NuGet程序包

如何从Visual Studio for Mac中删除NuGet程序包?

SSIS无法保存程序包并重新启动Visual Studio

在Visual Studio Code for Unity中安装Nuget程序包

如何在Visual Studio项目中更改NuGet程序包引用以使用Nuget.config

Visual Studio Code pylint仅在站点程序包中查看插件

如何自动导入FLUTTER程序包Visual Studio代码版本:1.51.1 Windows 10

Visual Studio中的程序包和程序集之间有什么联系?

使用Visual Studio 2012创建Windows Phone程序包

使用nuget程序包自动配置VSIX的Visual Studio

无法在Visual Studio 2015中还原作用域Angular 2程序包

Visual Studio扩展程序包是否支持异步操作

Visual Studio程序包安装错误:“无法初始化PowerShell主机。”

Visual Studio Code 添加特定版本的包引用

Visual Studio UWP 应用程序目标版本:缺少新的 Windows 版本(v2009 及更高版本)