質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

解決済

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

puroguraman
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を利用して開発を行うことが可能です。

2回答

0グッド

0クリップ

3409閲覧

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

SurferOnWww

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

回答2

4

ベストアンサー

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

総合スコア15141

KOZ6.0, puroguraman, Zuishin, Bull👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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の省略は不可能でした。

0

VB

1 Public arg() As single

VB

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

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

投稿2019/10/20 09:53

KOZ6.0

総合スコア2252

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

puroguraman

2019/10/20 10:02

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

2019/10/21 00:29

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

2019/10/22 11:42

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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を利用して開発を行うことが可能です。