次のコードは、1 つの 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 にあるのでしょうか?