掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VC6のDLLからVB6に文字列の配列を渡すには? (ID:64946)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
1次元の文字型配列であればSafeArrayCreateVectorとSafeArrayAccessData を使うほうがコードが簡単になります。 HRESULT WINAPI Sample(LPSAFEARRAY* ppsa) { HRESULT hr = S_OK; if (!ppsa) return E_INVALIDARG; // 引数エラー if (!*ppsa) { // 既存配列の削除 hr = ::SafeArrayDestroy(*ppsa); if (FAILED(hr)) return hr; } static const LPCSTR Foot_bola[3] = {"中村俊輔", "松井大輔", "高原直泰"}; const long size = sizeof(Foot_bola) / sizeof(Foot_bola[0]); /* // 配列の再確保 hr = ::SafeArrayAllocDescriptor(1, ppsa); if (FAILED(hr)) return hr; // 要素のサイズを設定 (*ppsa)->cbElements = sizeof(BSTR); (*ppsa)->fFeatures = FADF_STATIC; // 配列のサイズを設定 (*ppsa)->rgsabound[0].lLbound = 0; (*ppsa)->rgsabound[0].cElements = size; // 格納領域の確保 hr = ::SafeArrayAllocData(*ppsa); if (FAILED(hr)) { ::SafeArrayDestroyDescriptor((*ppsa)); return hr; } // 要素の設定 ::SafeArrayLock(*ppsa); BSTR item; for (long index = 0; index < size; ++index) { ::SafeArrayGetElement(*ppsa, &index, &item); ::SysFreeString(item); // 文字列配列の場合マルチバイト文字列として格納する item = ::SysAllocStringByteLen(Foot_bola[index], strlen(Foot_bola[index])); ::SafeArrayPutElement(*ppsa, &index, &item); } ::SafeArrayUnlock(*ppsa); */ *ppsa = ::SafeArrayCreateVector(VT_BSTR, 0L, size); if (!*ppsa) return E_OUTOFMEMORY; // メモリ不足 // 要素の設定 BSTR* items; ::SafeArrayAccessData(*ppsa, (LPVOID*)&items); for (long index = 0; index < size; ++index) { ::SysFreeString(items[index]); // 文字列配列の場合マルチバイト文字列として格納する items[index] = ::SysAllocStringByteLen(Foot_bola[index], strlen(Foot_bola[index])); } ::SafeArrayUnaccessData(*ppsa); return hr; } それとこのコードは、からの配列を渡す分にはきちんと格納されるようですけど、 配列が既にある(*ppsa!=NULL)パターンのときちゃんと格納できないような 気がします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.