查询已注册的虚拟机时,VMware VIX API FindItems() 方法永远不会返回
题
我在 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 的下一个版本发布了。
不隶属于 StackOverflow