Visual Basic 2005のエラーメッセージ「パラメータが間違っています。」の原因は?

このQ&Aのポイント
  • Visual Basic 2005でC言語の関数をコールしてメモリコピーしたいが、「パラメータが間違っています。」というエラーメッセージが表示される。原因を教えてください。
  • Visual Basic 2005のソースコードでC側の関数を呼び出す際に、「パラメータが間違っています。」というエラーメッセージが表示される。解決方法を教えてください。
  • Visual Basic 2005のソースコードでC言語の関数を呼び出し、メモリコピーをしようとすると、「パラメータが間違っています。」というエラーメッセージが表示される。原因と対策を教えてください。
回答を見る
  • ベストアンサー

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)) ←ここでエラー どのように実装すればよいのでしょうか? お分かりになる方がいらっしゃれば教えて頂ければと思います。 以上です。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

Declareの定義では第一パラメータはTS_HNPCHKRES型で あるのに、ST_RES型の変数を指定しているからでは? それとメモリコピーだけならWindowsAPIにある RtlMoveMemoryが使えます。 Declare Sub CopyMemory Lib "KERNEL32" _  Alias "RtlMoveMemory" (ByRef 受取側 AS ~, _  ByRef 送出側 As ~, ByVal バイト数 As Integer)

関連するQ&A

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

    Visual Basic 2005 についての質問です。 C言語にて作成した関数をコールしてメモリコピーを行いたいと考えていますが、 エラーメッセージの 「型 'UInt64' のフィールド 'testflg' を持つ構造体のファイル入出力 (I/O) は無効です。」 と出力される原因が分からずに困っていました。 <構造体定義> Structure ST_RES Dim testflg As ULong 'テストフラグ End Structure <C側ソース> __declspec(dllexport) void MemCopy(char *out_p,void *indat,int rlen) { memcpy(out_p, indat, rlen); } <vb側ソース> public response As ST_RES Call MemCopy(data_buf(0), response, Len(response)) 構造体のメンバとしてULongが使用できないのでしょうか? もし、使用できないのであれば、どのように実装すればよいのでしょうか? お分かりになる方がいらっしゃれば教えて頂ければと思います。 以上です。

  • VB2005でVC6.0で作成したDLLから値を取得するには

    VB6からVB2005にコンバートをしたのですがVCで作成したDLLの関数の箇所で下記エラーが出てしまいました。(VCのDLLは他で使用の為変更できず。) エラー内容 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」 いろいろサイト等を調べたのですがうまくいきません。 Marshal.AllocCoTaskMem、Marshal.Copyなどを使用すればできるらしいのですが難しすぎて挫折しました。。 どなたかご教授下さい。 よろしくお願い致します。 VC側ソース(XXX.DLL) GetData( unsigned char far *pRec,   //データ short int *pRecLen,  //サイズ { Char cbBuf[1024]; //バッファ memset(cbBuf, ' ', 1024); //初期化 Call GetBuf(cbBuf); memcpy(pRec, cbBuf, *pRecLen); return(0) ; } VB2005のソース <StructLayout(LayoutKind.Sequential)> Structure St Dim A () As Byte Dim B () As Byte End Structure Declare Function GetData Lib "XXX.DLL" (Byref RecData As St , ByRef Reclen As Short) As Short Sub Dim TmpData As St Dim TmpLen As short =100 Dim X As Byte Dim Y As Byte Redim TmpData.A(49) Redim TmpData.B(49) Call GetData(TmpData, TmpLen) X =TmpData.A(0) Y =TmpData.B(1) ・ ・ End Sub

  • [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の内部エラー"の値でした.

  • 参照渡し(ByRef)

    参照渡しについてわからないのですが Option Explicit Dim buf As String Sub Sample1() buf = "aaa" Call Sample2("bbb") MsgBox buf End Sub Sub Sample2(ByRef a As String) a = "ccc" End Sub を実行すると、msgboxには、aaaが表示されますが、 途中のbbb,cccはどんな意味があるのでしょうか? また、 Sub Sample2(ByRef a As String) を Sub Sample2(a As String) にしてもコードは問題なく動きますが、 ByRefは役に立ってるのですか?

  • VB2005でバイト配列をコピーするには

    どなたかご教授下さい。 VB6で作成したプログラムをVB2005にコンバートしました。構造体からなる配列変数を一つの配列変数にコピー したいのですが、構造体の最初のメンバーだけ値が同じで以降の値は正しくセットされていませんでした。 どのように記述したらよいのでしょうか。またCopymMemory以外で良い方法があればご教授下さい。 よろしくお願い致します。 ===概略=== Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short) 構造体定義 (コピー元) <StructLayout(LayoutKind.Sequential)>Structure ST_MOTO <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte End Structure Dim A As ST_MOTO (コピー先) <StructLayout(LayoutKind.Sequential)> Structure ST_SAKI Dim lngrecLen As Integer 'データのLength <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ End Structure Dim B As ST_SAKI Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14) 出力結果 '最初の構造体のメンバーの値は正しく設定されている B.bytrecData(0) =80    A.byte_strTranCd(0) =80 B.bytrecData(1) =50    A.byte_strTranCd(1) =50 B.bytrecData(2) =57    A.byte_strTranCd(2) =57 B.bytrecData(3) =50    A.byte_strTranCd(3) =50 'これ以降は正しくない。(VB6だと正しく設定されている) B.bytrecData(4) =0     A.byte_strTanSeq(0) =80 B.bytrecData(5) =0     A.byte_strTanSeq(1) =87 B.bytrecData(6) =0     A.byte_strTanSeq(2) =48 B.bytrecData(7) =0     A.byte_strTanSeq(3) =48 B.bytrecData(8) =6     A.byte_strTanSeq(4) =55     ・              ・     ・              ・

  • 構造体 多段階配列について

    Private Structure test Dim a As Integer Dim b As String Dim c as String End Structure Dim a() As test = New test(2) {} Dim b() As test = New test(2) {} Dim c()() As test c = New test()() {a, b} Dim temp() as integer cは多段階配列で、 例えば、c(0)のメンバaのデータをすべて取り出したい 時はどうすればよろしいのでしょうか? //気持ち的にはこのようにしたいのですが、 できません。 temp = c(0).a どなたか、わかるかた、教えてください。 よろしくお願いします。

  • VB2008でGetSystemTimeが正常に動作しません。

    VB2008でWIN32APIのGetSystemTimeを使用するコードを記述しましたが SYSTEMTIME構造体に正しい値がセットされません。 ExcelのVBAにて同様のコードを記述し実行したところこちらは問題が ないようです。 コードの記述に誤りがあるのか、それとも設定なのかいろいろ調べて みましたが解決しませんでした。 どうか皆様のお力添えをお願いいたします。 ■環境 Windows xp HOME SP3 VisualBasic Express Edition SP1 ■VB 2008 コード --------------------------------------------------- Public Structure SYSTEMTIME Public wYear As Integer Public wMonth As Integer Public wDayOfWeek As Integer Public wDay As Integer Public wHour As Integer Public wMinute As Integer Public wSecond As Integer Public wMilliseconds As Integer End Structure Public Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" ( _ ByRef lpSystemTime As SYSTEMTIME) Public Sub Wait() Dim st As SYSTEMTIME Call GetSystemTime(st) Debug.Print (st.wYear & "/" & st.wMonth & "/" & st.wDay & " " & st.wHour & ":" & st.wMinute & ":" & st.wSecond & ":" & st.wMilliseconds)   End Sub --------------------------------------------------- VB 2008 実行結果 657369/393218/35782700 0:0:0:0 ■Excel2003 VBA コード --------------------------------------------------- Public Declare Sub GetSystemTime Lib "kernel32" ( _ ByRef lpSystemTimeLib As SYSTEMTIME) Public Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Sub TES() Dim st As SYSTEMTIME Call GetSystemTime(st) Debug.Print (st.wYear & "/" & st.wMonth & "/" & st.wDay & " " & st.wHour & ":" & st.wMinute & ":" & st.wSecond & ":" & st.wMilliseconds) End Sub --------------------------------------------------- Excel 2003 SP3 実行結果 2009/10/6 6:19:37:453

  • 参照渡しをする時は、渡される側は違う変数を使う?

    参照渡しをする時は、渡される側は違う変数を使うべきなのでしょうか? VBAのお勉強をしているのですが Sub test1() Dim mystr As String mystr = "a" Call test2(mystr) Call test3(mystr) End Sub Sub test2(ByRef mystr As String) MsgBox mystr End Sub Sub test3(ByRef mystr2 As String) MsgBox mystr2 End Sub この場合、test2とtest3ではどちらを使ったほうがいいのでしょうか? test3は、mystr2 というmystrとは違う変数を使っていますが、 test2は、test1のmystrと同じ変数を使っています。 test1と同じ変数を使おうが違う変数を使おうが どちらにしろ (ByRef 変数名 As String) で宣言するから、変わらないのでしょうか?

  • ファイル入力のデータを構造体に入れる方法

    VB.net(XP:VS2008のみフルインストール)にて テキストファイルから入力したデータを構造体st_testに入れたいと考えているのですが、実現できません。 どなたか、お力添えをお願いします。 テキストファイルは、事前に構造体(st_test)に値を入れ、 単純にFileOpen→OutPutしています。 (","や" "などでメンバ毎に分割等はしておりません。) 構造体 ---------------------- Public Structure st_test <VBFixedArray(63), MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim A() As Byte Dim B As Integer <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _ Dim N() As Byte <VBFixedArray((7), (11)), MarshalAs(UnmanagedType.ByValArray, SizeConst:=(72))> _ Dim S(,) As Byte <VBFixedArray(11), MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _ Dim U() As Integer End Structure ---------------------- 実現しようとしている個所 ---------------------- Dim t As String Dim temp(2) as st_test FileOpen(1, "test1.txt", OpenMode.Input) Input(FileNum, t) '''temp(0) = CType(CType(t, Object), st_test)...? temp(0) = CType(t, st_test) | FileOpen(1, "test2.txt", OpenMode.Input) Input(FileNum, t) temp(1) = CType(t, st_test) ---------------------- 上記の様に処理を行えば簡単にできるのかと安易な発想でいましたが、 CTypeの処理で'String'の値を'st_test'に変換できません。 旨のエラーになり、うまく実現することができません。 そもそもString型のデータをst_testにキャストすることが不可能なのでしょうか? それともただ、実現方法がカスなのでしょうか? 実際の構造体のサイズは4000Byteを超え(メンバ数も多いです。。。) 一つ一つ入力していくことが現実的に不可能なため ファイルよりInputすることしか思いついておりません。 test1.txtの中身を秀丸で開いてみました。 参考になれば・・・。 改行はなく、"福岡"の後等にそれぞれ空白があります。 -------------------------- 福岡 . A1 14 15 16 17 18 19 XX XX XX XX XX XX -------------------------- 宜しくお願いします。

  • ADODB.Streamを使って新規にファイルを作

    ADODB.Streamを使って新規にファイルを作成することは可能ですか? --------------------------------------------- Sub test1() Dim n As Long n = FreeFile Open "C:\sample.html" For Output As #n Print #n, "テキスト" Close #n End Sub これで、新規にhtmlファイルを作れるのですが --------------------------------------------- Sub test2() Dim st As Object Dim Sample As String Set st = CreateObject("ADODB.Stream") オブジェクトに保存するデータの種類を文字列型に指定する st.Type = adTypeText 文字列型のオブジェクトの文字コードを指定する st.Charset = "UTF-8" st.Open 'オブジェクトのインスタンスを作成 st.WriteText Sample, adWriteLine 'ココでエラー オブジェクトの内容をファイルに保存 st.SaveToFile ("c:\sample.html"), adSaveCreateOverWrite オブジェクトを閉じる st.Close メモリからオブジェクトを削除する Set st = Nothing End Sub --------------------------------------------- この方式で新規にファイルを生成して保存することは可能ですか? 該当部分でエラーが発生します。

専門家に質問してみよう