VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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 );
}


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -