[VB]ライブラリの関数が使えません

このQ&Aのポイント
  • 現在、メーカーの計測器についているライブラリ(dll)を利用して、VB.NETで測定ソフトを試作しようとしています。
  • しかし、関数を使うことができずに問題が発生しています。
  • VB.NETで実装したコードを実行すると、ライブラリの内部エラーが発生しています。
回答を見る
  • ベストアンサー

[VB]ライブラリの関数が使えません

お願いします. 現在,メーカーの計測器についているライブラリ(dll)を利用して,測定ソフトを試作しようとしています. 仕様書ではライブラリはC言語で書いてあるようですが,自分はVB.NETでソフトを作ろうと思っています. しかし,うまく関数を使うことができず,現在停滞ています(><; 以下にソースを示しますので,どなたか問題点をご指摘いただけないでしょうか? >>ライブラリ(仕様書) int send_cmd( WORD CmdSize, void *CmdPacket ) //WORD:符号なし64ビット //CmdSize:送信パケットサイズ(Byte) //CmdPacket:送信パケット >>VB.NET(自作) Public Declare Function send_cmd lib "test.dll" (ByVal CmdSize as ULong, ByRef CmdPacket as Byte() ) as integer Dim Test_Packet(a) as Byte res = send_cmd(Test_Packet.length, Test_packet) //Test_Packet : 送信用パケットのダンプ ***結果 res の値が仕様書の"dllの内部エラー"の値でした.

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

そのライブラリの提供元に聞くのが早いと思いますが … 多分 CmdSizeの型が ULongではなく shortでいいのだと思います

aftermains
質問者

お礼

ありがとうございます. ご指摘の通り,型を変更してみたら警告は出ましたが,何とか実行でき戻り値も得ることができました. ライブラリの提供元とも連絡を取り,進めていきたいと思います. 今後,また何かあればよろしくお願いします.

関連するQ&A

  • VB2008: クラスライブラリとはなんなのか?

    クラスライブラリとはなんなのか? 私は、クラスライブラリとはプロパティやメソッドを備えたもの。 そういう理解をしていました。 しかし、今、その認識が揺らいでいます。 それは、System.Text との出会いがきっかけ。 Imports System.IO Module mdlFileSystem   Function FileSeek(ByVal aFile As String, _ ・・・・・     If File.Exists(aFile) Then       Dim Buf(1) As Byte       Dim ec As System.Text.Encoding = System.Text.Encoding.Default       Dim fs As FileStream = New FileStream(・・・・・) これは、次のようにも書けます。 Imports System.IO Imports System.Text Module mdlFileSystem Function FileSeek(・・・・・) As String ・・・・・ If File.Exists(aFileName) Then Dim Buf(1) As Byte       Dim ec As Encoding = Encoding.Default       Dim fs As FileStream = New FileStream(・・・・・) この New 宣言を必要としない関数群とも言えるクラスライブラリ。 ここで、何が問題かと言うと実は自作の LenB関数の扱い。 Public Class Text   #Region "LenB メソッド" ・・・・・   #End Region   #Region "LenB メソッド" ・・・・・   #End Region End Class このように書くこともできます。 別にクラスライブラリなどと上段に構えなくても標準ライブラリでも用は足ります。 言わば、複数のプロパティやメソッドを装備しないのだ単なる標準ライブラリのクラスライブラリ版。 本格的なクラスライブラリ、標準ライブラリのクラスライブラリ版、標準ライブラリ。 一体、この3つをどう切り分けすべきなのであろうか? VB2008を学び始めて3週間。 しかも、プログラマでもなんでもない素人。 この辺りをどのように考えたらいいのでしょうか? どうにもスッキリしません。 「このように考えたらいいですよ」という回答をお願いします。

  • vb2008でのクラスライブラリ実行に関して

    vb2008でのクラスライブラリ実行に関しての質問なのですが、 クラスライブラリで以下の内容のプロジェクトを作成しました。 プロジェクト名:TEST ファイル名:TEST1.vb '~プログラム内容~ Module D01001B Public Function Main(ByVal CmdArgs() As String) As Integer     'バッチの処理内容 End Function End Module このバッチをデバックしたいのですが、どうやらクラスライブラリは 単体ではデバックできないらしくどうすればできるのか困っています。 調べてみると新しいプロジェクトでWindowsフォームアプリケーション を選択し、フォームからボタンを押して実行する方法があるとの ことなのですがどのように記述したらよいかわかりません。 できればどのように記述すれば実行(呼び出し)できるのか教えていただけないでしょうか? 以上

  • Cで作成したDLL関数をVBから呼ぶ

    以前にあった「Cで作成したDLL関数をVBから呼び 引数渡し方法」を試したのですがVB側でデータが受け取れません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=711327 C側での値設定がわるいのでしょうか? VB側 Public Declare Function testAP Lib "C:\bin\test.dll" (ByVal lpKeyData As String) As Long --------------------------------------------------------------------------- Dim lngRc As Long Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) lngRc = testAP(keydata) VC側 __declspec(dllexport) long __stdcall testAP(char *lpdata){ →C側でlpdataに値を設定する lpdata="ABCDEF"; }

  • Visual Basic 2005 についての質問です。

    Visual Basic 2005 についての質問です。 C言語にて作成した関数をコールしてメモリコピーを行いたいと考えていますが、 エラーメッセージの 「パラメータが間違っています。 (HRESULT からの例外: 0x80070057 (E_INVALIDARG))」 と出力される原因が分からずに困っていました。 <構造体定義> Structure ST_RES Dim testflg As ULong Dim ts_sample() As TS_SAMPLE End Structure Structure TS_SAMPLE Dim sampleflg As ULong End Structure <C側ソース> __declspec(dllexport) void TEST_Copy(char *out_p,void *indat,int rlen) { memcpy(out_p, indat, rlen); } <vb側ソース> Declare Sub TEST_Copy Lib "test.dll" (ByRef data As TS_HNPCHKRES, ByRef data1 As Byte, ByVal size As Integer) Dim response As ST_RES response = New ST_RES() ReDim response.ts_sample(24) Call TEST_Copy(response, data_buf(0), Len(response)) ←ここでエラー どのように実装すればよいのでしょうか? お分かりになる方がいらっしゃれば教えて頂ければと思います。 以上です。

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • WinSock プロトコルスタックバッファについて

    開発環境 XP、VC2005、C/C++、WinSock WinSockでネットワークプログラミングをしています。 例えば、下記のようなコードでデータを送信するとします。 int send_byte = send(socket, buf, byte, 0) このとき、変数byteには1024が入っているとします。 上記のコードをループさせてデータを送信すると、 しばらくsend_byteには byteと同じ値1024が入っています。 でも、プロトコルスタックバッファが満杯になり、 send()が処理しきれなくなった場合に、 byteは1024なのに、send_byteが例えば500などになります。 つまり、中途半端に送信してしまいますよね。 これはWinSockの仕様だと思いますが、 できれば中途半端には送信したくないのです。 このように中途半端に送信しない方法はあるでしょうか? send()するまえにプロトコルスタックバッファの空きが調べられれば なんとかできそうな気もするのですが・・・。 よろしくおねがいします。

  • VB2005 から DLL を呼び出す

    VB 初心者です。 今、VB の練習ということで VB 2005 Express Edition を使って、個人用ブラウザをつくっています。Web ページの表示は Webbrowser コンポーネントを使っています。 その仕様で、閲覧先によって HTTP Proxy を変更するようになっています。(自分で決めたんですが) いろいろ調べてみると、urlmon.dll の UrlMkSetSessionOption() を呼べば自分のアプリケーション限定で Proxy を変更できるようだ、ということがわかりました。 古い VB など(VB 6 とか?)では、 Private Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" _ (ByVal dwOption As Long, ByVal pBuffer As Any, _ ByVal dwBufferLength As Long, _ ByVal dwReserved As Long) このような感じで宣言するとかあったんですが、VB2005 では Any がダメだとか、 Type INTERNET_PROXY_INFO Dim dwAccessType As Long Dim lpszProxy As String Dim lpszProxyBypass As String End Type で Type はダメだとか、呼び出し側で、LenB を使おうとしたら使えないだとか、INTERNET_OPTION_PROXY の値がわからないなど、問題が山積みです。 上記 DLL を VB 2005 で使ったことがある人がいたら(またはわかる人)、使い方を教えてもらえないでしょうか?

  • VB.netの配列とVB6の配列の違い

    VB6で画面を作成し、演算処理を行うDLLをVC6で作成しています。 下記のコードでVB6でSingle型の2次元配列を宣言しま、VCのDLLでエクスポートしている関数に渡 します。 VC6DLL側のコード---------- EXPORT void __stdcall TESTFUNC (float *pfData,long nSize{ } VB側のコード---------- 宣言 Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Long) As Long 配列宣言 Public sngDat(999,1) as single 呼び出し TESTFUNC sngDat(0,0),1000 このように呼び出した場合、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの ポインタをインクリメントした場合、sngDat(0,0),sngDat(1,0),sngDat(2,0)と、1次元目の添え字を インクリメントした状態になるように、メモリに格納されています。 この動作を前提として、VB.net側でも同じように呼び出してみました。 VB.net側のコード---------- 宣言 Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Integer) As Integer 配列宣言 Public sngDat(999,1) as single 呼び出し TESTFUNC(sngDat(0,0),1000) VC側は全く同じコードを利用するとします。 同じように、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの ポインタをインクリメントした場合、sngDat(0,0),sngDat(0,1),sngDat(1,0)と,sngDat(1,1)、と1次元目の添え字を インクリメントせず、2次元目の添え字をインクリメントした状態になるように、メモリに格納されています。 VB6→VC6のDLLの場合の配列渡しと、VB.net→VC6のDLLの場合の配列渡しで違いがあるのは 何故でしょうか?また、VB.net側の配列渡しの仕様を、VB6側の仕様に合わせる方法は無いのでしょうか? よろしくお願いいたします。

  • Cで作成したDLL関数をVBから呼ぶ(.NET)

    以前の質問に「Cで作成したDLL関数をVBから呼ぶ」(QNo.1703839)がありますが、下記のコードを見るとVB6での内容だと思います。 Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) VB.NETでVC++のDLLで変更した文字列を受けたいのですが、 どのようにすればよいのでしょうか? VB.NET2003 <DllImport("DllTest.dll")> Private Shared Function _ Test(ByVal s1 As String) As String End Function Private Sub btnTest_Click(...) ... Dim s1 As String = "abc" Dim s2 As String Dim s3 As String s2 = Test(s1) MessageBox.Show(s2) ' "1"が表示される s3 = StrConv(s2, VbStrConv.None) MessageBox.Show(s3) ' 同じく"1"が表示 end sub VC++のDLL extern "C" __declspec (dllexport) BSTR __stdcall Test(char* s1) { AfxMessageBox(s1); // "abc"が表示される OK strcpy(s1, "123"); CString s2; s2 = "123"; return s2.AllocSysString(); } また、文字列に全角を含めても大丈夫でしょうか? Unicodeの変換処理を行う必要があるのでしょうか? よろしくお願いします。

  • VB.NET デリゲートへのコールバック関数の設定

    VB.NET デリゲートへのコールバック関数の設定 VB.NETとネイティブC/C++ DLL間でのコールバックについての質問です。 ネイティブDLLからVOID*で得られるコールバック関数をVB.NETのデリゲートに 登録するには、どのようにコーディングすればよいのでしょうか。 ---------- VB.NETソース ---------- Public Delegate Sub CALLBACK_00(ByVal Arg1 As Integer, ByVal Arg2 As Integer) Declare Function FuncPtrGet Lib "test.dll" () As CALLBACK_00 Dim Func As new CALLBACK_00(FuncPtrGet()); 2行目は、実際にはVOID*が帰るDLL関数です。 3行目がコンパイルで通りません。AddressOfで関数を指定するようにメッセージが出ます。

専門家に質問してみよう