下面的代码工作得很好,感谢您使用一个 COM 客户端,但使用新客户端(同一软件的更新版本)string_array_to_bstr_safearray_variant
会引发访问冲突,一切都死了。
谁能告诉我我是否做错了我以前逃避的事情..?我没有正确分配内存吗?
#include "comutil.h"
void string_array_to_bstr_safearray_variant(long arraylength,char ** in_array,VARIANT *out_variant)
{
CComSafeArray<BSTR> out_array;
ATLENSURE_SUCCEEDED(out_array.Create(arraylength));
for (int i=0;i<arraylength;i++)
ATLENSURE_SUCCEEDED(out_array.SetAt(i,_com_util::ConvertStringToBSTR(in_array[i])));
CComVariant ccv(out_array);
HRESULT hr = ccv.Detach(out_variant);
ATLENSURE_SUCCEEDED(hr);
}
//names: output parameter to contain variant holding safearray of bstrs
STDMETHODIMP CCalculation::get_output_shortnames(VARIANT* names)
{
char** names_array = calc_get_short_output_names(calc); //this works fine
string_array_to_bstr_safearray_variant(output_length,names_array,names); //this fails before returning
return S_OK;
}
编辑:调试器信息
如果没有调试器,我会遇到访问冲突。
使用调试器单步执行此代码似乎可以工作。 output_length
设置正确;out_array
被正确创建和填充out_variant
,据我所知,通过变量观察也是如此。但是,COM 客户端仍然失败,说"lisp value has no coercion to VARIANT with this type: #<safearray...>"
(这很奇怪,因为客户端的先前版本解释返回值就好了)。然后它崩溃并抱怨它的内存不足。
在调试器中运行代码,但让它运行而不是单步执行,它在 的构造函数中失败CComVariant
,抱怨由于内部调用SafeArrayCopy
失败而引发了无效参数。
编辑:在最近的另一个步骤中,它在循环中失败了,所以问题可能出在@terriblememory 所暗示的 CComSafeArray 上?