下面的代碼一個SAFEARRAY工作就好了謝謝你一個COM客戶端,但隨着新的客戶端(相同的軟件的更新版本)string_array_to_bstr_safearray_variant
引發訪問衝突,一切都死了。COM:訪問衝突使得BSTRs
誰能告訴我,如果我這樣做,我與前越來越遠一些錯誤..?我沒有正確地分配內存嗎?
#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_variant
也是如此。但是,COM客戶端仍然失敗,說"lisp value has no coercion to VARIANT with this type: #<safearray...>"
(這很奇怪,因爲先前版本的客戶端解釋返回值就好)。然後它崩潰抱怨它已經沒有了記憶。
在調試器內運行代碼,但讓它運行而不是步進,它在CComVariant
的構造函數中失敗,抱怨由於對SafeArrayCopy
的內部調用失敗而拋出無效參數。
編輯:另一個近期逐步通過它在循環失敗了,所以也許這個問題是CComSafeArray爲@terriblememory建議?
COM,SafeArrays&BSTR ......哦,我的! –
烏雲分割,閃電雷擊,給* output_length *變量一個值。它的邊緣肯定會有點脆。不要編寫返回不返回*數組長度*的數組的函數。他們從根本上是不安全的。矢量<>是一個明顯的選擇。 –
Lol :)是的,'output_length'是一個類成員,並且在get_output_shortnames()被調用的時候有效。 'calc_get_short_output_names'是一個C接口。這不是錯誤。 –