• 締切済み

VB6.0 テキストデータの受け取り

VB初心者です。 VB6.0を使用しています。 Agilentのスペアナからのトレースデータをテキストで、"RecvData1"という文字列に受け取らせたいと考えています。 下記のように記述したのですが、RecvData1にテキストデータをうまく受け渡すことができません。 どこを改善すればよろしいでしょうか。 Dim RecvData1 As String stats = viVPrintf(vi, "TRAC:DATA? TRACE1" + Chr$(10), 0) stats = viVScanf(vi, RecvData1, 0) viVScanfの定義 ↓ Public Declare Function viVScanf Lib "VISA32.DLL" Alias "#272" (ByVal vi As Long, ByVal readFmt As String, params As Any) As Long なお、「stats = viVPrintf(vi, "TRAC:DATA? TRACE1" + Chr$(10), 0)」の部分のコマンドが測定機に正しく送られていることは確認済みです。 やりたいことをVisa Assistantを使用して行った場合のC言語の記述と結果 ↓ -------------------------------------------------------------------- viPrintf(vi,"TRAC:DATA? TRACE1\n"); char buf[32768]; int bufLength = sizeof(buf); ViScanf(vi,"%#t", &bufLength, buf); buf[] = {"-28.986280,-30.730440,-44.042957,-68.885155,-80.233..... bufLength = 5071; --------------------------------------------------------------------

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

とりあえず、バッファ確保してからにしようよ。 例えば、  RecvData1 = Space(32769) ただし、API に ByVal String 形式で渡した場合、 暗黙の Unicode → ANSI 変換が入るので文字化けする可能性あり。 Byte の配列を使う事を考えた方がいいのかも。 それ以前に viscanf はデータが欠落するという情報もあるので vread() で読み込み、1 バイトずつチマチマになるのかも。 ttp://surf.ml.seikei.ac.jp/~nakano/diary/?0707 ちなみに私は、VISA32 自体使った事無い門外漢ですので信用 しないようにして下さい。10分ほどWEB検索して分かった事を並べた だけですので。

ibfezuki
質問者

お礼

回答ありがとうございます。 Dim RecvData1 As * 10000  stats = viVScanf(vi,"%t" , RecvData1) のようにするとデータを受け取らせることができました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

>ViScanf(vi,"%#t", &bufLength, buf); の部分では、 ViScanf(vi,型の指定, bufLengthの先頭アドレス, buf); のようになっていて、引数の個数が4。一方、VB6のviVScanfの定義 では、 Public Declare Function viVScanf Lib "VISA32.DLL" Alias "#272" (ByVal vi As Long, ByVal readFmt As String, params As Any) As Long において、引数の個数が3.明らかにVB6とC言語では 関数の定義が異なっていますが? C言語の関数では、第二引数が型の指定であって、 VB6では、 >stats = viVScanf(vi, RecvData1, 0) のように、型指定にはなっていません。もし、仮に VB6の関数の定義通りで、かつデータを受け取るのが VB6で第三引数ならば、 stats = viVScanf(vi,%#t" , RecvData1) あるいは、 stats = viVScanf(vi,"%t" , RecvData1) では?

ibfezuki
質問者

お礼

回答有難うございます。 回答していただいたように、入力してみたのですが、 stats = viVScanf(vi,"%t" , RecvData1) とすると、うまくいかず。 stats = viVScanf(vi,%#t" , RecvData1) とすると、VBが固まって終了してしまいました。

関連するQ&A

  • 定義した関数がフォームで使用できません。

    Visual Basic初心者です。 VB6.0を使用しています。 標準モジュールで関数を定義したのですが、フォームでその関数を使用することができません。 標準モジュールで定義した関数をフォーム上で使用するには、どのような点を変更すればよろしいでしょうか。 フォーム上コード抜粋 Sub test() Dim stats As Long Dim vi As Long stats = viVPrintf(vi, "*RST" + Chr$(10), 0) End Sub 標準モジュール上コード抜粋 Global Const VI_SPEC_VERSION = &H400000 Declare Function viVPrintf Lib "VISA32.DLL" Alias "#270" (ByVal vi As Long, ByVal writeFmt As String, params As Any) As Long

  • 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"; }

  • VB.NET DLL 参照型String読込み

    VCで作成されたDLLの参照型Stringの読込みに困っております。 ご存じの方、お教え下さい。 VB6では次のような定義で、問題なく実行できます。 Private Declare Function VcToVb _ Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Long, _ ByRef strData As String, ByRef Err_Cnt As Long, ByRef Err_DATA As String) As Long ------------------------------------ Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) これを VB.NETで実施 Private Declare Ansi Function VcToVb _  Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Int32, _ <MarshalAs(UnmanagedType.LPStr)> ByRef strData As StringBuilder, _ ByRef err_cnt As Int32, ByRef Err_DATA As StringBuilder) As Int32 (テストのため、strDataのみ) -------------------------------------- Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) ******************************************* 調べた結果、VB.NETでは参照型は簡単にはいかないみたいで、StringBuilderを使用するとか、色々な方法を試しました。 結果は戻ってくるのですが、問題は DLLが文字列を返すときに、文字列内の項目区切文字として chr(0)を設定します。 このため、結果は Chr(0)の前までしか設定されません。 (VB.NETが Chr(0)を文字列の最後と判断する?) これを解決する方法はありますでしょうか。 現在は VB6で呼出す DLLを作成し、VB.NETはこれを使用していますが、 C#.Netならできるのでしょうか。 よろしくお願い申し上げます。

  • GetLongPathName関数について

    VB6でTempフォルダをGetTempPath関数で取得するとショートファイル名でパスが返るので、 取得したショートファイル名をGetLongPathName関数でロングファイル名にしようと しているのですが上手く出来ません。 Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long Private Declare Function GetLongPathName Lib "kernel32" Alias _ "GetLongPathNameA" (lpszShortPath As String, lpszLongPath As String, _ cchBuffer As Long) As Long Dim nName As String Dim Ret As Long Dim Buf As String nName = String$(260, vbNullChar) Ret = GetTempPath(Len(nName), nName) nName = Left$(nName, InStr(nName, vbNullChar) - 1) Buf = String$(260, vbNullChar) Ret = GetLongPathName(nName, Buf, 260) Buf = Left$(Buf, InStr(Buf, vbNullChar) - 1) Tempフォルダはショートファイル名(C:\DOCUME~1\Owner\LOCALS~1\Temp\)は 取得されますがGetLongPathName関数でロングファイル名が 返りません、戻り値は0が返ってしまいます。 コードが間違えているのか、元々取得出来ないのか分かりませんが ご存知の方教えて下さいますようお願い致します。 尚、可能ならばFindFirstFile関数でロングファイル名を取得するのではでなくて GetLongPathNameで取得したいと思っています。

  • 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 で使ったことがある人がいたら(またはわかる人)、使い方を教えてもらえないでしょうか?

  • VB6.0でVISAを用いる

    VB6.0でVISAを用いてプログラミングしているのですが、 機器の状態を取得するところで躓いています。 ":AM:STA?"というコマンドを使うのですが Call viVPrintf(vi, ":AM:STAT?" + Chr$(10), 0) と打った後、戻り値の取得方法が分かりません。 viVPrintfで良いのかも自信がありません。(もしかして、viVScanf?)

  • VB6のAdressOfをVB.NETに変換したい

    以下のソースをVB.NETに変換したいのですが... XOpenDLL関数の AddressOfのあたりがエラーになって変換できません。 (Microsoft Visual Basic .NET 2003の変換機能) Private Declare Function XOpenDLL Lib _ "Maser.dll" _ Alias "OpenDLL" _ (ByVal nModel As Long, _ ByVal nLens As Long, _ ByVal nLensMfr As Long, _ ByVal nGSpeed As Long, _ ByVal nSocketPort As Long, _ ByVal nRS232Port As Long, _ ByVal pCallbackFn As Long) _ As Boolean Private Declare Function XSendCommand Lib _ "Maser.dll" _ Alias "SendCommandVB" _ (ByVal OpCode As Long, _ ByVal PropCode As Long, _ ByVal InputString As String, _ ByRef Output As String) _ As Integer Private Declare Sub XCloseDLL Lib _ "Maser.dll" _ Alias "CloseDLL" () Then to use these functions: ‘ Open the DLL bInstance = XOpenDLL(nModel, nLens, nLensMfr, nGSpeed, nSocketPort, nRS232Port, AddressOf MyCallbackFn) ‘ Send a command nRet = XSendCommand(nOpCode, nPropCode, szInputData, szOutput) ‘ Close the interface Call XCloseDLL お教えください。

  • VB.NETでのiniファイル読込について。

    .netでのiniファイル読込がうまくいきません。 何が悪いのかさっぱりわかりません。 ご指摘お願いいたします。 環境 os :xp 開発ソフト VB.NET ver 1.1.4322 SP1 ソース Private Declare Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long '実行ファイルパスの取得 *VB6のapp.path Shared Function GetAppPath() As String Return System.IO.Path.GetDirectoryName( _ System.Reflection.Assembly.GetExecutingAssembly().Location) End Function Function INI_DBPATH_READ(ByVal FilePath As String) As String Dim lngRet As Long   '読み込みバッファ(固定長) Dim strGetBuff As String = 256   'iniファイルより読み込む文字列のサイズ Dim intGetSize As Integer   'セクション名 Dim strSection As String   'キー名 Dim strKey As String   '読み込みエラー時の出力文字列 Dim strErr As String   'iniファイル名(フルパス) Dim striniFn As String strGetBuff = Space(256) strSection = "TIFF_FOLDER" strKey = "PATH" strErr = "失敗" striniFn = Replace(GetAppPath(), "\bin", "\Ini") & "\test.ini" intGetSize = 256 'strGetBuffに文字列を取得する lngRet = GetPrivateProfileString(strSection, strKey, strErr, _ strGetBuff, intGetSize, striniFn) '末尾のNull除去 MsgBox(Microsoft.VisualBasic.Left(strGetBuff, InStr(strGetBuff, Chr(0)) - 1)) End Function iniファイルの内容 [TIFF_FOLDER] PATH=成功

  • VB2008 iniファイルの全セクション取得方法

    こんばんわ。iniファイルの全セクションを取得したく、 以下のコードを使うことはわかったのですが、ここから先がVB初心者の為全く解かりません。ボタン1を押したらC:\Test.ini のファイルの全セクションを取得というコードはどのように記入すればよいのでしょうか。 どうぞ宜しくお願いいたします。 Declare Function GetPrivateProfileSectionNames Lib "Kernel32.dll" _ Alias "GetPrivateProfileSectionNamesA" _ (ByVal lpszReturnBuffer As String, ByVal nSize As Long, _ ByVal lpFileName As String) As Long

  • メール

    VBから変数Aを本文に自動的に貼り付ける方法を教えてください。 なお下は以前開発したものです。応用して使えるでしょうか? Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal ipopperation As String, ByVal lpfile As String, _ ByVal lpparameters As String, ByVal lpdirectory As String, ByVal nshowcmd As Long) As Long --------- Private Sub ??_Click() Dim LngReturn As Long Dim StrCommand As String StrCommand = Trim$(Text_mail_pc) If LCase(Left(StrCommand, 7)) <> "mailto:" Then StrCommand = "mailto:" & StrCommand End If LngReturn = ShellExecute(Me.hwnd, "open", StrCommand, vbNullChar, vbNullChar, Sw_Shownormal) End Sub ---------- ※↓のVBの質問とは全く関係ありません。

専門家に質問してみよう