🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

5159閲覧

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

puroguraman

総合スコア20

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/10/20 05:46

編集2019/10/20 12:55

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/21 02:11

マルチポストのようですので、他のポスト先の URL を貼っておきます。 https://social.msdn.microsoft.com/Forums/ja-JP/88817cbd-fc22-4029-8254-c3cc7065b745/vbnet1236312425dllc12408371972101512434281931237512383123561239?forum=vbgeneralja 質問者さんへ> 「マルチポスト」の意味が不明でしたら、それをキーワードにググってヒットする記事を 2, 3 読んでみることをお勧めします。いろいろな意見があるようですが、まず歓迎されるころはなさそうです。ここにもルールがあります。読んでください→ https://teratail.com/help#posted-otherservice
guest

回答2

0

ベストアンサー

vb.net

1Imports System.Runtime.InteropServices 2 3 Public Structure data 4 Public number As single 5 <MarshalAs(UnmanagedType.ByValArray, SizeConst := 5)> Public arg() As single 6 End Structure

にて動作を確認しました。

投稿2019/10/20 20:50

編集2019/10/20 20:51
asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puroguraman

2019/10/21 03:23

回答ありがとうございました
puroguraman

2019/10/22 02:13

おかげさまでその後進展しました。本当にありがとうございました。
puroguraman

2019/10/22 07:33

asmさん ベストアンサー済みですがこのコメントは届くのでしょうか、追加でお聞きしたいことがあるので回答いただけると幸いです。 回答いただいた方法で <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg() As Single <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg1() As Single とすると今度はarg1のデータが来ませんでした。 理由お分かりでしたら恐縮ですがまた知恵をおかしください。
puroguraman

2019/10/22 08:00

asmさん たびたび一方的に書き込んでしまいますが VB側 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Redim struct.arg(3) c++側 typedef struct { float number; float arg[10]; } data; と定義するといけました。 しかし、 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg() As Single <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg1() As Single という定義の後に public flag as booleanとするとそのデータは送られませんでした。 配列の定義の前であればいいのですが後だと送られない仕様だったりしますか?
asm

2019/10/22 09:51

どちらも再現しませんでした。 public flag as booleanについては、C/C++側のsizeof(bool)が保証されない関係でちょっと考える必要があります
Zuishin

2019/10/22 09:54

StructLayout 属性を指定してないからかなと思います。
puroguraman

2019/10/22 11:36

お二人ともご回答ありがとうございます。 asmさんはそうならないとのことでたぶん私の環境の問題なのでしょうか <StructLayout(LayoutKind.Sequential)> Public Structure data としても変わらなかったのでこの問題は保留にします。
Zuishin

2019/10/22 11:47

構造体はデフォルトで Sequential なので、それだと何も変わりません。
puroguraman

2019/10/22 12:00

回答ありがとうございます。消しました たびたびとなりますが <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg() As Single <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg1() As Single public flag as boolean だとargとflagは送られてきていました。 arg1だけすべて0でした。 なにかわかりましたらご協力よろしくお願いいたします。
puroguraman

2019/10/22 12:10

お二人ともすみませんお騒がせしました。 Public number As single <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg() As Single <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public arg1() As Single public flag as boolean Redim struct.arg(5) Redim struct.arg1(5) //c++側 typedef struct { float number; float arg[5]; } data; 要素数をしっかりVB,c++両方で合わせたらすべてのデータがしっかりデータが入っていました。 ご協力ありがとうございました。今度こそ解決できました。
asm

2019/10/22 12:18 編集

Redimの要素数を間違えてたのでしょうか? ~~そうであるならば、KOZ6.0さんの回答にあるようにVBFixedArrayを付与するとRedimいらないのかもしれませんね~~ 訂正:マニュアル見る限りVBFixedArrayを付与してもDim/ReDimの省略は不可能でした。
guest

0

VB

1 Public arg() As single

VB

1 <VBFixedArray(5)> Public arg() As Single

に変えると動きそうな気がします。

投稿2019/10/20 09:53

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puroguraman

2019/10/20 10:02

回答ありがとうございます。 早速試しましたが駄目でした。値0のままです。。。 この方法はネットにもあまりないのでいすがプログラミング解説本見てもなさそうですか?
KOZ6.0

2019/10/21 00:29

VB6 をコンバートすると付加されるのですが、外しちゃいましたね。申し訳ありません。
puroguraman

2019/10/22 11:42

とんでもないです。ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問