- PR -

VB6からVCで自作したDLLへByte配列をパラメータとして送る方法について

1
投稿者投稿内容
rabi
会議室デビュー日: 2006/06/07
投稿数: 14
投稿日時: 2007-06-25 15:06
現在、VB6 VC++を使っています。

 VB6からByte配列の変数を VC++で自作したDLL内のAPI関数に送りたいのですが、
うまく送れません。

◎VB6
Declare Function CRC16 Lib "TEST01.DLL" (ByVal a As Byte)

Private Sub Command1_Click()
Dim TEST01(10) As Byte
TEST01(0) = &H32
TEST01(1) = &H34
Call CRC16(TEST01)
End Sub

◎VC++のDLL
int WINAPI CRC16(unsigned char *a){
int ab;
ab = (int)*(a+0);
ab = (int)*(a+1);
return 0;
}

上記の様に作成しましたが、VC++のデバッグモードで*(a+0),*(a+1)を
確認した所、下記の通りとなりました。
*(a+0)=&H3F
*(a+1)=0
:
:
*(a+10)=0

別のDLL内APIについては、正常にパラメータの値が遅れるのですが、
例えば
int WINAPI Add(int a,int b){
return a + b;
}
など。

インターネットで検索しても、なかなか見つけることが出来ませんでした。
基本的な話ではありますが、ご教示の程宜しくお願いします。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-06-25 17:43
>Declare Function CRC16 Lib "TEST01.DLL" (ByVal a As Byte)
Declare Function CRC16 Lib "TEST01.DLL" (ByRef a As Byte)

>Call CRC16(TEST01)
Call CRC16(TEST01(0))

でどうでしょうか?

VB側で
>Call CRC16(TEST01)
のように配列型で渡す場合、DLL側もSAFEARRAYで受けるように変更しないと
うまくいきません。
rabi
会議室デビュー日: 2006/06/07
投稿数: 14
投稿日時: 2007-06-25 18:31
回答ありがとうございました。
出来ました。

ByRefでもやってみたんですが・・・・。
たぶん、いろいろやっているうちにソースを壊してしまっていたか
他の設定に変更したのか・・・。
だから、だめだったんでしょうねぇ・・・。
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2007-06-25 18:35
固定サイズの配列を直接渡したい場合は
Public Type FixedSizedByteArrayRec
byteData(10) as Byte
End Type

の様に配列をメンバに含む構造体を宣言して、それを引数としてByRefで渡すという手もあります。


1

スキルアップ/キャリアアップ(JOB@IT)