掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VC6のDLLからVB6に文字列の配列を渡すには? (ID:64940)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
はじめまして。 VB6(SP6)のアプリに文字列の配列を渡すDLLをVC6 + WinXPで作ってます。 配列の要素数は状況によって変わるので、VBの動的配列に入れて渡すことしました。 下のようにコーディングしてみましたが、実行するとVB側には一部の文字が 「?」(クエスチョンマーク)に文字化けして表示されてしまいます。 これを文字化けしないように直したいのですが、どうしたらよいのでしょうか? (化ける文字と化けない文字があるのは何故?) 下の例ですと、VBのListBox(List1)には ABC 123456 あいうえお ????? ?うこそ ?しいy 今日の夕食はカ??にス?? と表示されてしまいます。「都」は「y」に化けます。 ======== VBアプリ側 ======== Declare Function ListTest Lib "xxxxxx.dll" (ByRef list0() As String) As Long Private Sub Command1_Click() Dim i As Integer Dim ref As Long Dim stlist() As String Dim st As String ref = ListTest(stlist()) For i = 0 To UBound(stlist) st = StrConv(stlist(i), vbFromUnicode) List1.AddItem (st) Next i End Sub ======== VC DLL側 ======== // _MBCSでコンパイルしてます typedef std::basic_string<_TCHAR> STR; // _TCHAR string型 __declspec(dllexport) bool __stdcall ListTest(LPSAFEARRAY *ppsa) { BSTR item0; long rglndices[1]; std::vector<STR> itemlist; // 質問用にハードコーディングしてます itemlist.push_back(_T("ABC")); itemlist.push_back(_T("123456")); itemlist.push_back(_T("あいうえお")); itemlist.push_back(_T("らりるれろ")); itemlist.push_back(_T("ようこそ")); itemlist.push_back(_T("美しい都")); itemlist.push_back(_T("カレーにスルー")); // 既に領域が確保されている配列が渡されたら、その領域は破棄する if (*ppsa != NULL) { if (FAILED(::SafeArrayDestroy(*ppsa))) return false; } setlocale(LC_ALL, "Japanese"); if (FAILED(::SafeArrayAllocDescriptor(1, ppsa))) return false; (*ppsa)->cbElements = sizeof(BSTR); (*ppsa)->fFeatures = FADF_STATIC; (*ppsa)->rgsabound[0].lLbound = 0; (*ppsa)->rgsabound[0].cElements = itemlist.size(); if (::SafeArrayAllocData((*ppsa)) != S_OK) return false; ::SafeArrayLock(*ppsa); setlocale(LC_ALL, "Japanese"); for (int cnt = 0; cnt < itemlist.size(); cnt++) { rglndices[0] = cnt; _bstr_t bstr1(itemlist[cnt].c_str()); item0 = bstr1.copy(); ::SafeArrayPutElement(*ppsa, rglndices, &item0); } ::SafeArrayUnlock(*ppsa); return true; } よろしくお願いします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.