毎度すみません・・・
COMの関数を用いてある値を取得しようと思っています。
返ってくる値はVARIANT型なのですが・・・
vt = VT_BSTR
の時は、問題なくchar型に変換して値を取ることができたのですが、
vt = VT_BSTR | VT_ARRAY
とString ARRAYで返ってきた場合にchar型に変換したいのですが・・・
流れとしては
VARIANT v;
char c[適当な長さ];
int n;
VARIANTを返す関数(&v);
if(v.vt==VT_BSTR | VT_ARRAY)
{
ARRAYの要素数を返す関数(n); //←SafeArrayGetDim()??
for(int x = 0; x < n; x++)
{
ARRAY→charに取り込む関数(c);
MessageBox(NULL, c, "結果", MB_OK);
}
}
といった感じです(とりあえずは・・・)。
SAFEARRAYの取り扱い方が全くわからなくて・・・。
この中の文字列はワイド文字?マルチバイト?そんなところからわかっていないです・・・。
どなたかご教授いただけないでしょうか?
参考ページなどでもかまいません。
どなたか教えてください(^^;
よろしくお願いします。
COleSafeArray でググるといいかも。
MFC 使わない場合でも, これのソース見れば大体分かると思います。
forty-five さん
レスありがとうございます。
あれから色々と調べてみて、こんな感じの関数を作ってみました。
int read_array(VARIANT& vstr,char *ptr, int szptr)
{
VARIANT args = vstr;
VARTYPE vt = V_VT(&args);
if (vt == (VT_VARIANT | VT_BYREF))
{
args = *args.pvarVal;
vt = V_VT(&args);
}
int bArray = vt & VT_ARRAY;
if(!bArray)// not array
{
return 0;
}
SAFEARRAY *psa = NULL;
HRESULT hr;
LONG cElements, lLBound, lUBound;
WCHAR *pdata;
psa = V_ARRAY(&args);
if(SafeArrayGetDim(psa) != 1)
{
return 0;
}
hr = SafeArrayGetLBound(psa, 1, &lLBound);
if (FAILED(hr))
{
return 0;
}
hr = SafeArrayGetUBound(psa, 1, &lUBound);
if (FAILED(hr))
{
return 0;
}
hr = SafeArrayAccessData(psa, (LPVOID*)&pdata);
if (FAILED(hr))
{
return 0;
}
cElements = lUBound-lLBound + 1;
WideCharToMultiByte(CP_ACP, 0, pdata, -1, ptr, szptr, NULL, NULL);
hr = SafeArrayUnaccessData(psa);
return cElements;
}
一部エラー処理は抜いているところがありますが・・・。
結局値がうまく取れません。
この関数のなかでウオッチしても、やっぱり取得できていないようでした・・・。
どなたかご存じの方、アドバイスをお願いします。
とりあえず pdata の型がおかしいです。
文字列の配列なら, BSTR* にしないとダメです。
forty-fiveさん
ありがとうございます!!
下記ソースで解決です!!
本当にありがとうございました!!!!
後は、必要なエラー処理などを追加して・・・
形が見えてきました。
本当にありがとうございました。
int read_array(VARIANT& vstr,char *ptr, int szptr)
{
VARIANT args = vstr;
VARTYPE vt = V_VT(&args);
// check VARIANT REFERENCE
if (vt == (VT_VARIANT | VT_BYREF))
{
args = *args.pvarVal;
vt = V_VT(&args);
}
int bArray = vt & VT_ARRAY;
if(!bArray)// not array
{
return 0;
}
SAFEARRAY *psa = NULL;
HRESULT hr;
LONG cElements, lLBound, lUBound;
BSTR *pdata;
psa = V_ARRAY(&args);
// Check dimensions of the array.
if(SafeArrayGetDim(psa) != 1)
{
return 0;
}
// Get array bounds.
hr = SafeArrayGetLBound(psa, 1, &lLBound);
if (FAILED(hr))
{
return 0;
}
hr = SafeArrayGetUBound(psa, 1, &lUBound);
if (FAILED(hr))
{
return 0;
}
// Get a pointer to the elements of the array.
hr = SafeArrayAccessData(psa, (LPVOID*)&pdata);
if (FAILED(hr))
{
return 0;
}
// element count.
cElements = lUBound-lLBound + 1;
// put array data
WideCharToMultiByte(CP_ACP, 0, *pdata, -1, ptr, szptr, NULL, NULL);
// *ptr = pdata;
hr = SafeArrayUnaccessData(psa);
return cElements;
}
ツイート | ![]() |