投稿日 | : 2006/02/26(Sun) 14:35 |
投稿者 | : Blue |
Eメール | : |
URL | : |
タイトル | : Re^8: 構造体配列転送 |
固定長文字列メンバをC側に渡せるか興味があったので色々と試してみました。
配列で渡す時には Unicode→ANSI文字列 の変換が内部で起こらないので意外と簡単に処理できそうで
す。
# 配列でないものを渡す時は面倒かと。。。(Unicode→ANSI文字列 の変換が内部でおこり文字数とバイ
ト数が違うから)
' VB側
Private Type Product
Code As String * 4
Name As String
Stock As Long
End Type
Private Declare Sub Sample16 Lib "vbdll.dll" (ByRef p() As Product)
Private Sub Command16_Click()
Dim p(3) As Product
With p(0)
.Code = "A−11"
.Name = "製品その1"
.Stock = 20
End With
With p(1)
.Code = "B-00"
.Name = "製品その2"
.Stock = 100
End With
With p(2)
.Code = "C−11"
.Name = "製品その3"
.Stock = 10
End With
With p(3)
.Code = "D51"
.Name = "製品その4"
.Stock = 0
End With
Call Sample16(p)
End Sub
// C側
typedef struct tagProduct
{
wchar_t Code[ 4 ];
BSTR Name;
int Stock;
} Product;
void WINAPI Sample16( LPSAFEARRAY* args )
{
wchar_t buff[ 128 ];
SAFEARRAY* psa = *args;
long idx, lb, ub;
Product p;
SafeArrayLock( psa );
SafeArrayGetLBound( psa, 1, &lb );
SafeArrayGetUBound( psa, 1, &ub );
for ( idx = lb; idx <= ub; idx++ )
{
SafeArrayGetElement( psa, &idx, &p );
/* Unicodeで表示する %.4s がミソ */
swprintf( buff, L"%.4s,%s,%d", p.Code, p.Name, p.Stock );
MessageBoxW( NULL, buff, L"Sample16", MB_OK );
}
SafeArrayUnlock( psa );
}