DLL(VC++)にユーザー定義型の配列を渡すには?

解決


はな  2003-09-16 20:03:08  No: 108711  IP: [192.*.*.*]

以前VC++で作成したDLLに配列を渡す方法を質問させていただいた者です。
再び質問させていただきます。

VBのユーザー定義型配列変数をVC++で作成したDLLに渡し何らかの処理をさせて返すプログラムを作りたいと思っていますが、やり方がいまいちわかりません。。VB側は

--- VB ---
Private Type ABC
    Red As Integer
    Green As Integer
    Blue As Integer
End Type


Dim st(3) As ABC
Dim i as Integer

For i = 0 To 3
    st(i).Red = 100
    st(i).Green = 200
    st(i).Blue = 300
Next i

Call test_st(st)

For i = 0 To 3
Debug.Print "st.Red= " & st(i).Red
Debug.Print "st.Green= " & st(i).Green
Debug.Print "st.Blue= " & st(i).Blue
Next i

--------------
こんな感じに作ったのですがVC側をどのように作っていいかわかりません。。

--- VC側 ---
struct test_st{
    short Red;
    short Green;
    short Blue;
};

Q_KENSA_API void __stdcall stTest(test_st *st)
{
    test_st tst[4];

    tst[0].Red = tst[0].Red + 10;
    tst[0].Green = tst[0].Green + 10;
    tst[0].Blue = tst[0].Blue +10;
}

--------------------
たぶん違うだろうと思いつつココまで作ってみたのですが、エラーがでてしまいます。。(値が割り当てられていないローカルな変数 'tst' に対して参照が行われました。)
VBの様にこのまま扱っていいのでしょうか?それ以前の感じもしますが(汗)。

どうかご教授よろしくお願いいたします。。

編集 削除
ねろ  2003-09-17 08:51:24  No: 108712  IP: [192.*.*.*]

うーむ、カオスの状態ですね。
初めからVBのユーザー定義型の配列をCの構造体の配列に
引き渡すのは少し敷居が高いような気がします。
配列にしないでユーザー定義型を、Cの構造体に引き渡すようにして
呼び出しのVBの方でメンバーの値を変えるように工夫したらいかがですか?
それと、DLLの呼び出しの場合必ずVBでの関数の宣言の部分を書きましょう、
それが無いとC側で引数が値で渡されているのか、アドレスで渡されているのか
わかりません。
それと、ユーザー定義型をCの構造体に渡すときは、なるべくユーザー定義型の
長さが4の倍数になるようにしましょう。
具体的には Red、Green等のメンバーをlongで宣言します。
理由は  ”構造体  パディング  アライメント"等で検索して下さい。

編集 削除
はな  2003-09-18 11:31:14  No: 108713  IP: [192.*.*.*]

ねろさんありがとうございました。
どうやらユーザー定義型の配列を渡すのは難しいみたいですね。。
「配列にしないでユーザー定義型を、Cの構造体に引き渡すようにして
呼び出しのVBの方でメンバーの値を変えるように工夫」というのがいまいち解らなかったのですが。。もうちょっと勉強してみます^^;どうもでした。。

編集 削除
ねろ  2003-09-18 15:12:28  No: 108714  IP: [192.*.*.*]

>VBの方でメンバーの値を変える
C側の処理がちょっと解からなかったのでこんな表現になってしまいました。(深謝;)
もし”はな”さんのソフトが、複数の色があり、R,G,Bの要素をCのDLLに渡し
CのDLLの中で各要素を10ずつシフトして返すと言うようなソフトを作ろうとしているならVBの方でユーザー定義型を配列にしないで、色の方を配列にして色の数だけDLLを呼び出して処理をしたらどうかと思ったのです。
この説明もわかりにくいか。

>ユーザー定義型の配列を渡すのは難しいみたいですね
渡すのは難しくありませんが、渡されたCでの処理が難しいのではと.....
下に渡し方の例が載っています、これを見ると私は構造体の配列を引き渡そうとは思いませんが。(^^;     
http://support.microsoft.com/default.aspx?scid=http://www.microsoft.com/japan/support/kb/articles/410/8/37.asp

編集 削除
はな  2003-09-19 15:22:18  No: 108715  IP: [192.*.*.*]

ねろさんありがとうございます。理解しました^^;
C++って配列の扱いがむづかしいですねぇ。。ポインタとかあんまり深く理解してないもんで(汗
教えていただいたサンプルじっくり見てます。
ねろさんいつもどうもです。。

編集 削除