none
VB.netからdll(c++)へ配列を渡したいです RRS feed

  • 質問

  • VB.netからdll(c++)へ構造体のデータを渡しています

    下記のようにしたのですが、変数はできましたが配列はできませんでした。

    'VB側

    public class A

    Public Structure data
    Public number As single
    Public arg() As single
    End Structure

    Public 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)=10

    Call DrawSpace(struct)
    end sub

    end class

    //C++側(ヘッダファイル)
    #ifdef cplusplus #define EXPORT extern "C" declspec(dllexport)
    #else
    #define EXPORT __declspec(dllexport)
    #endif

    typedef 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);
    とかやりましたがだめでした。お願いします。

    2019年10月20日 13:55

回答

すべての返信

  • 構造体に固定長配列がある場合、それにMarshalAs属性で、UnmanagedType.ByValArrayとSizeConstを指定する必要があります。

    VB MarshalAs UnmanagedType.ByValArray - Bing

    あと、VBで配列を初期化する際は添え字の最大値を指定するので、Cにおけるhoge[5]はVBではReDim hoge(4)に相当します。

    • 回答としてマーク programan2 2019年10月21日 3:25
    2019年10月20日 14:38
  • マルチポストのようですので、他のポスト先の URL を貼っておきます。

    https://teratail.com/questions/218221

    質問者さんへ>

    「マルチポスト」の意味が不明でしたら、それをキーワードにググってヒットする記事を 2, 3 読んでみることをお勧めします。いろいろな意見があるようですが、まず歓迎されるころはなさそうです。特にこのフォーラムでは遠慮いただくようにと管理者の方からお願いが出ています。
    2019年10月21日 2:12
  • Imports System.Runtime.InteropServices Public Structure data Public number As single <MarshalAs(UnmanagedType.ByValArray, SizeConst := 5)> Public arg() As single End Structure

    にて解決しました

    2019年10月22日 2:12