VB2008でVB4.0の「LSet」機能を実行する方法

このQ&Aのポイント
  • VB2008の練習のために、VB4.0のコードをVB2008にコンバージョンしています。
  • しかし、VB4.0の「LSet」はコンバージョンできないために困っています。
  • 質問者は、他の方法でリストをコピーする方法を知りたいとしています。
回答を見る
  • ベストアンサー

VB4.0の「LSet」と同等の機能をVB2008で実行するには?

VB2008の練習のために、VB4.0のコードをVB2008にコンバージョンしています。 VB4.0の「LSet」がどうしてもコンバージョンできません。 LSet 以外はVB2008で機能がありました。 なにか方法はないでしょうか。 リストをコピーします。 (投稿したらインデントが消えました) Public Type Tpstndef equip As Integer stn_no As Integer stn_class As Integer line_no As Integer stn_kind As Integer End Type Dim kdata As Tpkyokudef Dim rbuf As buf1K    ・   省略    ・ Get #fno, seeksize, rbuf LSet kdata = rbuf

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

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

IntPtrを経由して行えばいいように思います dim objPtr as IntPtr = Marshal.AllocHGlobal( Len(rbuf) ) として ファイルから読み込んだデータを格納できる IntPtr型の変数を準備します ' VB6ではファイルより大きな受け取りバッファでもエラーになりません ' VB.NETではその点融通が利かないようです ' LOFなどで読み込み量を調べて あらかじめ Redimであわせましょう FileGet( fno, rbuf.実際のバッファ ) FileClose() ' rbufの読み込み実体がByte配列ならいいのですが … Marshal.Copy( rbuf.実際のバッファ, 0, objPtr, rbuf.実際のバッファ.Length ) kdata = marshal.PtrToStructure( objPtr, GetType(Tpstndef)) ' 使いおわったら開放しましょう marshal.FreeHGlobal( objPtr ) といった具合です

Junko20546
質問者

お礼

ありがとうございました。これから、実行してみます。 というのは、デバックのトレースでkdataに値が入りません。 rbuf には値が入ります。 この回答をお手本にして考えてみます。

その他の回答 (1)

  • wEqM
  • ベストアンサー率0% (0/6)
回答No.2

Lsetにreturnかけずにbufをしつ力したら

Junko20546
質問者

お礼

ありがとうございます。 たしかに rbuf には値がはいりますから、 おっしゃる通りでも良いと思います。 が、それでは構造体を定義した意味が薄れてしまいます。 imogasiからの進言もありましたので、この質問を閉め切ります。 (リストを一部修正しましたので) 以後は、http://oshiete1.goo.ne.jp/qa4376930.htmlの方でお願いします。

関連するQ&A

  • 「VB4.0の「LSet」と同等の機能をVB2008で実行するには?」のリストを修正します

    「VB4.0の「LSet」と同等の機能をVB2008で実行するには?」の質問で リストに間違いがあったので訂正します。 Public Type TpstndefをPublic Type Tpkyokudef VB2008の練習のために、VB4.0のコードをVB2008にコンバージョンしています。 VB4.0の「LSet」がどうしてもコンバージョンできません。 LSet 以外はVB2008で機能がありました。 なにか方法はないでしょうか。 リストをコピーします。 Public Type Tpkyokudef equip As Integer stn_no As Integer stn_class As Integer line_no As Integer stn_kind As Integer End Type Dim kdata As Tpkyokudef Dim rbuf As buf1K    ・   省略    ・ Get #fno, seeksize, rbuf LSet kdata = rbuf

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • VB .NetのDLL参照について

    名前付パイプの処理をしているのですが、DLLが参照できません。 Public Class ClsJi01   Public Declare Function MakePipe Lib "\DLL\Point.DLL" (ByVal pipe_name As String, ByVal buf_size As Integer, ByVal max_instances As Short, ByVal hpipe As Integer, ByVal err_code As Integer) As Integer  Public Sub M_Pipe()   Dim r As Integer   Dim rpipe As Integer   Dim err_code As Integer   r = MakePipe("\\.\pipe\RS04", 255, 16, rpipe, err_code)  End Sub End Class Point.DLLは以前VB6.0の時に使用していたDLLで自作です。 これで実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出ます。 どうしたら良いのでしょうか?

  • DLL<->VB間での受け渡し(文字列・ポインタ)

    VBで開発を行っていますが、 DLL<->VBでのやり取りでポインタ?のの引渡しで困っております。 簡単に言うと、指定したキーで、内容(データ)を取出し、さらに 要素ごとにデータを取出すという仕組みです。 例ですが、DLLの仕様は TR_MR(No,Id,Buff)  Noは検索No.  Idは取出す位置  buffはデータバッファ領域のポインタ で、Idで指定された位置からデータをbuffに読み込む (戻り値は、buffにセットされたデータのバイトサイズ) TR_MR_IT(buff,Tagset,Dat) buffは先ほど取り込んだデータバッファ領域のポインタ Tagsetは項目識別子のポインタ Datはデータ上の1項目の文字列 と言う具合です。 VBでの宣言は =================================================== Private Type Tagset tagno As String * 3 Subf As String * 1 seq As Integer End Type Private Declare Function TR_MR Lib "tr.dll" (ByVal no As Integer, ByVal Id As Integer, ByVal buff As String) As Integer Private Declare Function TR_MR_IT Lib "tr.dll" (ByVal buff As String, ByRef tg As Tagset, ByVal dat As String) As Integer Dim buf_size As Integer Dim MR_buff As String MR_buff = String(65562, vbNullChar) buf_size = TR_MR(no, 1, MR_buff) Dim tg As Tagset Dim MR_size As Integer Dim MR_IT_buff As String tg.tagno = "001" tg.Subf = "A" tg.seq = 1 MR_IT_buff = String(12282, vbNullChar) MR_size = TR_MR_IT(MR_buff, tg, MR_IT_buff) =================================================== 長々と書いてしまいましたが、 何か、助言をいただければ幸いです。

  • VB.NETのメモリ領域について

    VB.NETのメモリ領域について 以下の(1)~(12)の変数のために、 スタック領域、静的領域、ヒープ領域のどこのメモリが使われるか教えてください。 Class Sample   Dim a As Integer '(1)   Dim b As String = "BBB" '(2)   Shared c As Integer '(3)   Shared d As String = "DDD" '(4)   Sub X()     Dim f As Integer '(5)     Dim g As String = "GGG" '(6)     Static h As Integer '(7)     Static i As String = "III" '(8)   End Sub   Shared Sub Y()     Dim k As Integer '(9)     Dim l As String = "LLL" '(10)     Static m As Integer '(11)     Static n As String = "NNN" '(12)   End Sub End Class それぞれこんな認識で合ってますか? スタック領域 (1)(5)(9) スタック領域にポインタ+ヒープ領域に実体 (2)(6)(10) 静的領域 (3)(7)(11) 静的領域にポインタ+ヒープ領域に実体 (4)(8)(12)

  • VBでDirectSoundの使用

    VBでDirectSoundを使いたいと思って、モジュールを追加したのですが、 Public Dx7 As New DirectX7 Public DSnd As DirectSound Public DMPms As DirectMusicPerformance Public DMLdr As DirectMusicLoader Type DSWAVE buf() As DirectSoundBuffer nbuf As Integer nidx As Integer End Type ・ ・ の ・・・As DirectSoundBuffer の部分で、ユーザ定義型は定義されていませんとエラーが出てしまいます。 どうすればよいでしょうか?

  • VB.netでのwin32api呼び出し

    VB.netでwin32apiを呼び出したが変数にデータが正しくセットされない vb6.0のプログラムをvb.netに移植作業しています。 vb.netで機器との通信を行うためwinapi32で作られたドライバdllをインポートしたのですが受信データが正常に受け取れません。もう1週間も悩み続けています。 詳しい方お助けください。 //win32api側// DWORD Receive(HANDLE handle,PBYTE pbReceiveBuffer,WORD wBufferLength, _ PWORD pwReceiveLength,PDWORD pdwErrCode); //VB側// <DllImport("Des_DLL", CharSet:=CharSet.Auto)> _ Public Function Receive(ByVal hPath As Intptr, ByRef ReceiveBuffer As IntPtr, _ ByVal ReceiveBuffLength As Ushort ByRef ReceiveLength As Ushort, _ ByRef lErrCode As Uint) As Uint End Function Dim rd_buf(1018) As Byte Dim rbf_l As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(rd_buf)) 'アンマネージメモリ 確保 Marshal.Copy(rbf_l, rd_buf, 0, rd_buf.Length) 'アンマネージメモリからマネージメモリにコピー ret = Receive(Path, rbf_l, rdbuffer_length, rd_length, ErrCode) Call des_datawrite(rd_buf, rd_length, 2) ' 受信データの書き込み For i = 0 To rd_length - 1 ' 受信データセット DES.rd_buf(DES.rd_cnt) = rd_buf(i) DES.rd_cnt = DES.rd_cnt + 1 Next i DesRD_Normal = True Marshal.FreeCoTaskMem(rbf_l) End Function Receive()は機器からの情報吸い上げレスポンス関数です。 Public Sub des_datawrite(ByVal wt_data() As Byte, ByVal length As Integer, ByVal Mode As Integer) Dim free_num As Integer Dim i As Integer Dim cv_buf As String cv_buf = "" For i = 0 To length - 1 cv_buf = cv_buf & Microsoft.VisualBasic.Right("00" & Hex(wt_data(i)), 2) & " " Next i free_num = FreeFile() FileOpen(free_num, GetAppPath() & DES_DATA, OpenMode.Append) If Mode = 1 Then Print(free_num, "[<-sd(" & DateTime.Now.ToString("yyyyMMddHHmm") & ")]" & Mid (cv_buf, 1, Len(cv_buf) - 1)) ElseIf Mode = 2 Then ElseIf Mode = 2 Then Print(free_num, "[->rd(" & DateTime.Now.ToString("yyyyMMddHHmm") & ")]" & Mid(cv_buf, 1, Len(cv_buf) - 1)) End If FileClose(free_num) End Sub

  • VB6.0 →VB2005 のアップグレードでエラー表示

    VB6.0の標準モジュールでは Private Type typset a As String b As String c As Integer End Type Public make() As typset と記述してエラーもなく正常なのですが、VB2005にアップグレードしたときに、 Option Strict Off Option Explicit On Module Module1 Private Structure typset Dim a As String Dim b As String Dim c As Integer End Structure Public make() As typset←▼エラー▼            End Module 【エラー内容】 'make' は、module 'Module1' をとおして型 'typset' を namespace 'WindowsApplication1' で公開することはできません。 structure部をPublicなどにしてもエラーは消えますが、参照先に影響が出てしまいます。 根本的な解決方法が分かりません。 教えていただけないでしょうか?

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • VBの添削をお願いします。

    VBの添削をお願いします。 先日 http://okwave.jp/qa/q5919602.html で質問した者です。 (textboxの値の倍数が改行されながら表示されるようにするには?という主旨です。) リンク先にもありますが下記の回答をいただきました。 Public Class Form1 Dim a As Integer Dim b As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim b As Integer = 10 a = TextBox1.Text lblMessage.Text = a & ControlChars.CrLf & a + b End Sub End Class それで今度は下記の問いが出ました。 「表示されるのは最新の5行のみ」 Textbox内が10の場合、「60が表示された時点で10は消え、70が出た時点で20が消える」というものです。 このまま続けてもよし、Labelを5つ並べてもよし、とのことです。 で今回は前者で作ってみました。 lblmessage.textの上にlblmessage2.textを被せて隠しちゃえ、というやつなんですが、 模範解答とは程遠いんでしょうね。。。。 どなたか添削お願いできませんか。

専門家に質問してみよう