掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
dllで文字列配列を戻し、取得するには (ID:63677)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>格納するときは、SysAllocStringかSysAllocStringLengthをつかうのかな。 CString の AllocSysString を使うほうがべんりですな。 サンプル) // DLL側 // 本来ならば、HRESULTで成功したかどうかを返し、引数に LPSAFEARRAY* を指定して格納するほうがよい SAFEARRAY* WINAPI Sample21() { SAFEARRAYBOUND sb; sb.lLbound = 0; sb.cElements = 3; SAFEARRAY* psa = ::SafeArrayCreate( VT_BSTR, 1, &sb ); BSTR* data; ::SafeArrayAccessData( psa, ( void** )&data ); data[ 0 ] = ::SysAllocString( L"イチロー" ); data[ 1 ] = ::SysAllocString( L"松井秀喜" ); data[ 2 ] = ::SysAllocString( L"松坂大輔" ); ::SafeArrayUnaccessData( psa ); return psa; } // exe側 #include <windows.h> int main() { HMODULE hDLL = ::LoadLibrary( TEXT( "C:\\XXX\\YYY\\hoge.dll" ) ); if ( hDLL ) { SAFEARRAY* ( WINAPI *func )(); func = ( SAFEARRAY* ( WINAPI * )() )::GetProcAddress( hDLL, TEXT( "Sample21" ) ); SAFEARRAY* psa = ( *func )(); long lb, ub; BSTR data; ::SafeArrayGetLBound( psa, 1, &lb ); ::SafeArrayGetUBound( psa, 1, &ub ); for ( long i = lb; i <= ub; i++ ) { ::SafeArrayGetElement( psa, &i, &data ); ::MessageBoxW( NULL, data, L"てすと", MB_OK ); ::SysFreeString( data ); } // 後処理 // DLL側で処理させる関数を作るべき for ( long j = lb; j <= ub; j++ ) { ::SafeArrayGetElement( psa, &j, &data ); ::SysFreeString( data ); } ::SafeArrayDestroy( psa ); ::FreeLibrary( hDLL ); } return 0; } ちなみに、C++⇔C++であればSafeArrayを使わなくてもいいような気もする。 →APIでよくある、\0で配列を区切り、終端を\0\0にしたり。 (MFCのDLLを使えば、CStringArrayを普通に使えたような。)
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.