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.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が正しい場合、この関数をコールしたときにエラーとなるのは他に原因があるのでしょうか?
もしご存知であれば教えていただけないでしょうか。
No.2
- 回答日時:
またまた未確認ですみませんが MarshalAs で UnmanagedType.ByValArray を使う場合は、SizeConstも指定する必要があるようです。
お探しの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ランキング
-
ソースの追加行数と変更行数
-
「MicrosoftVisualBasic6.0 行...
-
JSPの実行結果をHTMLに変換
-
【VBScript】proxy経由のFTP転送
-
コメントが閉じてないというエ...
-
htmlでソースを表示させたくな...
-
Doxygenでの更新履歴(@history...
-
VC6でCRC64・CRC128が出来るソ...
-
ローカル環境とネット環境でホ...
-
レストラン、英語のメニュー表記
-
ソースコピー → ブラウザ文字...
-
[ASP]指定したURLのソースを表...
-
htmlソース文の 各行 改行位置...
-
VBAで#Regionに変わるものは無...
-
ナンバーズ4のストレートをボッ...
-
インラインフレームでサイトが...
-
c言語の改修されたソースから改...
-
htmlのタブの色変更について
-
▲▲HTML/CSSでのリスト作成▲▲以...
-
Visual Source Safe?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlソース文の 各行 改行位置...
-
VBAで#Regionに変わるものは無...
-
レストラン、英語のメニュー表記
-
Dreamweaverのコードカラーが黒...
-
プログラム時のヘッダコメント...
-
【VC++6.0(MFC)】Access Violat...
-
#ifdef多用でソースが見づらい
-
ソースの追加行数と変更行数
-
ソースの表示を無効にする方法。
-
画像と文字が重なって表示される。
-
JSPの実行結果をHTMLに変換
-
Visual Source Safe?
-
コメントが閉じてないというエ...
-
HTMLソースの文字コードがutfの...
-
ポップアップを1日1回だけ表示...
-
「MicrosoftVisualBasic6.0 行...
-
c言語の改修されたソースから改...
-
htmlのタブの色変更について
-
DreamWeaver 文字列を含まない...
-
IEでテキストの文字が一部だけ...
おすすめ情報