我在 Windows Vista x64 上使用 VMware Workstation 6.5。我正在尝试编写一些 C# 代码,使用 VMware Vix v1.6.1 COM API 来获取已注册虚拟机的列表。

我使用的代码如下:

using System;
using VixCOM;

namespace ConsoleApplication48
{
    internal class Program
    {
        private static void Main()
        {
            var lib = new VixLibClass();
            object results = null;

            var job = lib.Connect(Constants.VIX_API_VERSION, Constants.VIX_SERVICEPROVIDER_VMWARE_WORKSTATION, null, 0,
null, null, 0, null, null);

            var err = job.Wait(new[] {Constants.VIX_PROPERTY_JOB_RESULT_HANDLE}, ref results);

        if (lib.ErrorIndicatesFailure(err))
            Console.WriteLine("Error: " + err);

        var host = (IHost)((object[])results)[0];

        job = host.FindItems(Constants.VIX_FIND_REGISTERED_VMS, null, -1, new DiscoveryCallback(lib));
        job.WaitWithoutResults();

        host.Disconnect();
    }
}

internal class DiscoveryCallback : ICallback
{
    protected VixLibClass lib;

    public DiscoveryCallback(VixLibClass lib)
    {
        this.lib = lib;
    }

    #region ICallback Members

    public void OnVixEvent(IJob job, int eventType, IVixHandle moreEventInfo)
    {
        // this method is never called
    }

    #endregion
    }
}

我知道 COM dll 是 32 位的,因此我确保测试应用程序被编译为 32 位。我还确保所有 VMware 服务都在运行。

没有抛出异常,没有返回错误(据我所知),也没有事件写入事件日志。

奇怪的是,当我尝试使用常量 VIX_FIND_RUNNING_VMS 获取正在运行的虚拟机列表时,上面的代码有效。

关于可能导致这种情况的原因有什么想法吗?

谢谢,

阿尼

有帮助吗?

解决方案

快速更新情况。

我仔细观察了 官方文档 对于 FindItems() 方法。常量 VIX_FIND_REGISTERED_VMS 未列为受支持的参数 - 只有常量 VIX_FIND_RUNNING_VMS 被列为受支持的参数。

我的猜测是,这意味着当前 VIX API 无法获取在 VMware Workstation 实例上注册的虚拟机列表。

这也可以解释为什么 vmrun.exe 命令行实用程序无法提供获取注册虚拟机的方法。

我想我只能等到 VIX API 的下一个版本发布了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top