トップ回答者
VB.netからdll(c++)へ配列を渡したいです

質問
-
VB.netからdll(c++)へ構造体のデータを渡しています
下記のようにしたのですが、変数はできましたが配列はできませんでした。
'VB側
public class A
Public Structure data
Public number As single
Public arg() As single
End StructurePublic struct As New data
Public Declare Function Draw Lib "C:(略)\simulation.dll" (ByRef struct As data) As Boolean
'タイマーで一定時間たてば送る。
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
struct.number=10
Redim struct.arg(5)
struct.arg(0)=10
struct.arg(1)=10
struct.arg(2)=10Call DrawSpace(struct)
end subend class
//C++側(ヘッダファイル)
#ifdef cplusplus #define EXPORT extern "C" declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endiftypedef struct {
float number;
float arg[5];
} data;namespace Tips_Win32DLL
{
bool __stdcall Draw(AAA_C* _data);
}//C++側(メインファイル)
namespace Tips_Win32DLL
{
bool __stdcall DrawSpace(AAA_C* _data)
{
float a = data->number; //データが問題なく入っていた
float b = data->arg[0]; //0になっているreturn true;
}
}float b = data->arg[0];のところが値が入っていません。わかるかた助けてください。
ちなみに
p = _data->arg;
float b = *(p+1);
とかやりましたがだめでした。お願いします。
回答
-
構造体に固定長配列がある場合、それにMarshalAs属性で、UnmanagedType.ByValArrayとSizeConstを指定する必要があります。
VB MarshalAs UnmanagedType.ByValArray - Bing
あと、VBで配列を初期化する際は添え字の最大値を指定するので、Cにおけるhoge[5]はVBではReDim hoge(4)に相当します。
- 回答としてマーク programan2 2019年10月21日 3:25
すべての返信
-
構造体に固定長配列がある場合、それにMarshalAs属性で、UnmanagedType.ByValArrayとSizeConstを指定する必要があります。
VB MarshalAs UnmanagedType.ByValArray - Bing
あと、VBで配列を初期化する際は添え字の最大値を指定するので、Cにおけるhoge[5]はVBではReDim hoge(4)に相当します。
- 回答としてマーク programan2 2019年10月21日 3:25
-
マルチポストのようですので、他のポスト先の URL を貼っておきます。
https://teratail.com/questions/218221
質問者さんへ>
「マルチポスト」の意味が不明でしたら、それをキーワードにググってヒットする記事を 2, 3 読んでみることをお勧めします。いろいろな意見があるようですが、まず歓迎されるころはなさそうです。特にこのフォーラムでは遠慮いただくようにと管理者の方からお願いが出ています。