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