1

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

我正在使用的代码如下:

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 获取正在运行的 VM 列表时,上面的代码有效。

关于可能导致这种情况的任何想法?

谢谢,

阿尼

4

1 回答 1

1

快速更新情况。

我仔细查看了 FindItems() 方法的官方文档。常量 VIX_FIND_REGISTERED_VMS 未列为受支持的参数 - 只有常量 VIX_FIND_RUNNING_VMS 是。

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

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

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

于 2008-12-21T17:18:27.557 回答