投稿日 | : 2006/04/17(Mon) 09:32 |
投稿者 | : morimori |
Eメール | : |
URL | : |
タイトル | : Re: VC++で作成したDLLにユーザ定義型の配列を指定したい |
Blue様、K.J.K様
返答をもらっておきながら返事が遅れてしまい、大変申し訳ございません。
> まず、仕様を整理する必要があるでしょう。
> 1,DLL側からVBに渡す構造体は、固定長の配列として渡されるのか?
> それとも、そのときに応じて長さが変わる可変長の配列なのか?
> 2,DLL側からVBに渡す構造体の内部の文字列について、固定長なのか
> 可変長なのか?
DLL側では「char cReceiveData[100]」としているので、固定長の配列となります。
> > 結局DLLは何をするんでしょうか?WinSockって?
> > g_cReceiveDataはなに(文字列ですよね)?
> の説明があれば、SafeArrayのやつを考えようと思ったのですが、ないのでやりません。
「g_cReceiveData」は文字列を格納します。
今回、作成したDLLはソケット通信用のDLLでDLL側でソケット通信で受信した文字列を
VBに返すというプログラムを作成しております。
説明が遅れてしまい、申し訳ございません。
最終的には、K.J.K様のやり方でVBからは配列の先頭の要素を渡してやることで
成功することができました。
ご教授いただいて感謝しております。
今後とも、宜しくお願い致します。
以下にプログラムリストを載せておきます。
[VB側]
Private Type ReceiveInfo
cReceiveData(0& To 99&) As Byte
End Type
Private Declare Function dllReceive Lib "dllWinSock.dll" (ByRef tReceiveData As ReceiveInfo) As Long
Private Sub Command3_Click()
Dim tReceiveData(0 To 19&) As ReceiveInfo
dllReadFindUid Text1.Text, tReceiveData(0&)
'以下、省略
End Sub
[VC側]
extern "C" int WINAPI EXPORT dllReceive(ReceiveInfo *tReceiveInfo)
{
long i;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
for(i=0;i<g_iReceiveCnt;i++){
strcpy(tReceiveInfo[i].cReceiveData, g_cReceiveData[i]);
strcpy(g_cReceiveData[i], "");
}
g_iReceiveCnt = 0;
return 0;
}