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

投稿日: 2006/04/15(Sat) 09:48
投稿者K.J.K.
Eメールakiya@koalanet.ne.jp
URL
タイトルRe: VC++で作成したDLLにユーザ定義型の配列を指定したい

# 仕切りなおし。

まず、仕様を整理する必要があるでしょう。
1,DLL側からVBに渡す構造体は、固定長の配列として渡されるのか?
  それとも、そのときに応じて長さが変わる可変長の配列なのか?
2,DLL側からVBに渡す構造体の内部の文字列について、固定長なのか
  可変長なのか?

で、敢えて両方とも可変長にするのならば、

Private Type ReceiveInfo
    lNumber As Long
    cReceiveData As String
End Type

Private Declare Function dllReceive Lib "dllWinSock.dll" _
(ByRef tReceiveData() As ReceiveInfo) As Long

typedef struct{
    int  iNumber;
    BSTR cReceiveData; // VBの文字列はBSTR
} ReceiveInfo;

extern "C" int WINAPI EXPORT dllReceive(SAFEARRAY **ppsa)
{
    int i;

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    SAFEARRAY *psa;
    HRESULT hresult = SafeArrayAllocDescriptor(1, &psa);
    if( FAILED( hresult ) ) return 1;

    psa->rgsabound[ 0 ].lLbound = 0;
    psa->rgsabound[ 0 ].cElements = g_iReceiveCnt;
    psa->cbElements = sizeof(ReceiveInfo);
    hresult = SafeArrayAllocData(psa);
    if( FAILED( hresult ) ) return 1;

    // ここ以降で、psa->pvDataをReceiveInfo*にキャストするなりして
    // 中身を入れていく。
    // 文字列領域の作成にはSysAllocStringByteLenを用いること。
    // 以下略。

    return 0;
}


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

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

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