VB.NetからVC++で作成したDLLを使用する場合の宣言方法について教えてください。
VC++のDLLの関数で引数に構造体のポインタを渡すようになっているのですがマーシャリング属性の指定方法がわからなく困っています。
VB6.0では使用できたのでDLL側は問題ないと思うので(DLL側は修正ししないでVB側の修正で対応したいです)VB.Net側の問題だと思うのですがどこを直したらいいのかご教授願えないでしょうか。
以下にVC++のDLLの宣言部、VB6.0のときのソース、VB.Netのソースの必要と思われる部分を載せておきます。
ただしVB.NetのソースはVB6.0からUpGradeしたものをWeb等で調べて修正したものです。
当方VBに関してはまだ触り始めて1ヶ月も経っていないのですが仕事で急ぎで対応しなくてはならないため勉強する時間がなくどうすればいいか困っています。
よろしくお願いします。
### VC++側ソース(概略)
void __stdcall GetData( STESTDATA* pData )
struct STESTDATA
{
float fData1[6];
float fData2[32][6];
};
### VB6.0の時のソース
Private Type testdata
Data1(5) As Single
Data2(5, 31) As Single
End Type
Private Declare Sub GetData Lib "TestLib.dll" (ByRef pData As testdata)
Private Sub TimerGetData_Timer()
Dim data As testdata
GetData data
End sub
### VB.Net(2008)の時のソース
<StructLayout(LayoutKind.Sequential)> _
Private Structure testdata
<MarshalAs(UnmanagedType.ByValArray)> Dim Data1() As Single
<MarshalAs(UnmanagedType.ByValArray)> Dim Data2(,) As Single
Public Sub Initialize()
ReDim Data1(5)
ReDim Data2(5, 31)
End Sub
End Structure
<System.Runtime.InteropServices.DllImport("TestLib")> _
Private Shared Sub GetData(ByVal pData As testdata)
End Sub
Private Sub TimerGetData_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TimerGetData.Tick
Dim data As testdata
data.data1 = New Single(5) {}
data.data2 = New Single(5, 31) {}
data.Initialize()
GetData(data)
End Sub
※因みにVB.Netのソースを実行すると本来ならdata構造体のdata1とdata2に値にDLL内で値が設定されるのですが、現状では全て0が設定されてしまっています。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
またまた未確認ですみませんが MarshalAs で UnmanagedType.ByValArray を使う場合は、SizeConstも指定する必要があるようです。
No.1
- 回答日時:
確認していませんが、ByRefにすれば基本的にポインタ渡しになるはずです。
<System.Runtime.InteropServices.DllImport("TestLib")> _
Private Shared Sub GetData(ByRef pData As testdata)
End Sub
Wizard_Zeroさん回答ありがとうございます。
VB6.0から移植した当時はByRefとしていたのですが、この関数をコールした時点でエラーとなってしまい、Webで調べてByValとしました。
(ByValで正しいかは不明だったのですが…)
もしByRefが正しい場合、この関数をコールしたときにエラーとなるのは他に原因があるのでしょうか?
もしご存知であれば教えていただけないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ヤフーの様にソースコードを文...
-
HTMLのソースを文字化けさせる...
-
HTMLソース表示の件
-
レストラン、英語のメニュー表記
-
ホームページNinja 9で検索避け...
-
プログラム時のヘッダコメント...
-
画像と文字が重なって表示される。
-
Dreamweaverのコードカラーが黒...
-
HTMLからフォルダを開きたい
-
Excelで、社外秘(閲覧のみ)と...
-
URLDownloadToFile でダウンロ...
-
java_run.batがダウンロードで...
-
googleドライブで、PDFファイル...
-
指定した演算を実施の結果を表...
-
WEB上でPDF閲覧のみにしたいです。
-
HTMLで別PCのフォルダを開く
-
Webサイトから、txtファイルを...
-
どのページもすべて同じURLなの...
-
1つ下の階層のフォルダに相対...
-
form action="#"
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
時間ごとにリンク先を変更させたい
-
レストラン、英語のメニュー表記
-
VBAで#Regionに変わるものは無...
-
Dreamweaverのコードカラーが黒...
-
コメントが閉じてないというエ...
-
#ifdef多用でソースが見づらい
-
ソースの追加行数と変更行数
-
htmlのタブの色変更について
-
JSPの実行結果をHTMLに変換
-
「MicrosoftVisualBasic6.0 行...
-
画像と文字が重なって表示される。
-
プログラム時のヘッダコメント...
-
縮小版のサムネイルの取得(画像...
-
実行オブジェクトからソースを...
-
【VC++6.0(MFC)】Access Violat...
-
VisualBasicがインストールされ...
-
Visual Source Safe?
-
HTMLソースの文字コードがutfの...
-
phpとaspの違い? 実力の違い?
-
VisualStudio2010でデバッグソ...
おすすめ情報