C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DLLの呼び出しに関して


(過去ログ 103 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■61285 / inTopicNo.1)  DLLの呼び出しに関して
  
□投稿者/ むとう (1回)-(2011/08/08(Mon) 15:51:08)

分類:[VB.NET/VB2005 以降] 

はじめまして。
VB2010Expressを使用して、VCにて作成されたDLLを呼び出したいと思っています。
そこで2点分からないことがあります。

DLL側では以下の様に定義されています。

EXPORT BOOL __stdcall Data_Read( BYTE sel, DWORD Size, LPVOID pBuffer );

VBでは以下の様に定義しました。
<DllImport("TEST.dll")>
Public Function Data_Read(ByVal sel As Byte, ByVal Size As UInteger, ByVal pBuffer As UIntPtr) As Boolean
End Function

1,VBでは必要なメモリを確保してからDLLにパラメータを渡せば良いと思うのですが上手くいきません。

Dim Buf() As UInteger
Buf = New Byte(65535) {}

' リード処理
If (Data_Read(0, 65536, Buf(0)) = False) Then
                ^^^^^^
End If

Data_Read()関数の第3引数にBuf配列の先頭アドレスを渡せば良いと思っているのですがどう記述すれば良いのか分かりません。

2, Buf = New Byte(65535) {} ←これが成功したかを調べるにはどうすれば良いのですか?
64KB程度なら余程の事でない限り問題ないと思いますが、128MB,512MBを設定した場合に確保できない事があると思います。


以上2点、アドバイスをお願い致します。
引用返信 編集キー/
■61286 / inTopicNo.2)  Re[1]: DLLの呼び出しに関して
□投稿者/ shu (926回)-(2011/08/08(Mon) 16:05:17)
No61285 (むとう さん) に返信

IntPtrで渡すなら
System.Runtime.InteropServices.Marshal.AllocHGlobal
で確保して、

System.Runtime.InteropServices.Marshal.Copy
で配列にコピー

System.Runtime.InteropServices.Marshal.FreeHGlobal
で解放

かな。

引用返信 編集キー/
■61293 / inTopicNo.3)  Re[1]: DLLの呼び出しに関して
□投稿者/ 魔界の仮面弁士 (2294回)-(2011/08/08(Mon) 17:32:34)
この掲示板の利用ルールには
》 半角カナは使用しないでください。文字化けの原因になります。
とあります。ご注意あれ。


No61285 (むとう さん) に返信
> EXPORT BOOL __stdcall Data_Read( BYTE sel, DWORD Size, LPVOID pBuffer );
pBuffer というのが、符号なし32bit整数型の配列を意図するのであれば、
 Declare Function Data_Read Lib "TEST" (ByVal sel As Byte, ByVal Size As UInteger, ByVal pBuffer() As UInteger) As Boolean
としておいて、
 Dim Buf(60000) As UInteger
 If Not Data_Read(0, CUInt(Buf.Length), Buf) Then
でどうでしょう。


> ……, ByVal pBuffer As UIntPtr) As Boolean
> Dim Buf() As UInteger
> Buf = New Byte(65535) {}
VB 側を、いずれかの型に揃えてください。

API 宣言では を UIntPtr で宣言しておいて、
そこに渡す変数を UInteger() 型で宣言し、
それを Byte() で初期化しようとするのでは、統一がとれていません。


> 2, Buf = New Byte(65535) {} ←これが成功したかを調べるにはどうすれば良いのですか?
失敗すれば実行時にエラーとなりますので、Try〜Catch で処理してみてください。
引用返信 編集キー/
■61312 / inTopicNo.4)  Re[2]: DLLの呼び出しに関して
□投稿者/ むとう (2回)-(2011/08/08(Mon) 23:07:57)
皆様。
アドバイス頂いた方法で無事実現する事ができました。
有り難うございました。

残り半分(Data_Write())が残っているので、またご相談させて頂くかも知れませんが・・・


#半角カナの件は失礼しました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -