所以我试图在主机的来宾会话中执行一个进程,但我不断从它那里得到一个 0x8000FFFF (E_UNEXPECTED) HRESULT。由于我收到的是 COM 错误而不是 VBOX_E_IPRT_ERROR,因此我认为我的 SAFEARRAY 是问题所在,而不是实际参数(如果有意义的话)。我对 COM 不太熟悉,所以这可能只是我使用 SAFEARRAY 错误的情况。无论哪种方式,这是我现在正在尝试的代码:
SAFEARRAY *args_and_env, *creation_flags;
SAFEARRAYBOUND arrayDim[1];
arrayDim[0].lLbound= 0;
arrayDim[0].cElements= 1;
args_and_env = SafeArrayCreate(VT_LPWSTR,1,arrayDim);
SafeArrayPutElement(args_and_env, 0, L"");
creation_flags = SafeArrayCreate(VT_INT, 1, arrayDim);
int flag = ProcessCreateFlag_None;
SafeArrayPutElement(creation_flags, 0, &flag);
IGuestProcess *proca;
rc = guestSession->ProcessCreate(proc, args_and_env, args_and_env, creation_flags, 0, &proca);
IGuestSession::ProcessCreate 的文档如下:
IGuestProcess IGuestSession::processCreate(
[in] wstring executable,
[in] wstring arguments[],
[in] wstring environmentChanges[],
[in] ProcessCreateFlag flags[],
[in] unsigned long timeoutMS)
函数声明如下:
HRESULT STDMETHODCALLTYPE ProcessCreate(
/* [in] */ BSTR aExecutable,
/* [in] */ SAFEARRAY * aArguments,
/* [in] */ SAFEARRAY * aEnvironmentChanges,
/* [in] */ SAFEARRAY * aFlags,
/* [in] */ ULONG aTimeoutMS,
/* [retval][out] */ IGuestProcess **aGuestProcess)
我也尝试将 NULL 传递给 arguments 和 environmentChanges,因为我不想使用它们中的任何一个,但结果相同。