• ベストアンサー

VB6でポインタ?

VB6でポインタを扱う関数 VarPtrがあるのですが、使えるデータ型は何があるのでしょうか? 仕様なのか、動的配列のポインタが取得できません。 dim kosuu() as integer redim kosuu(50) dim pointer as long pointer = VarPtr( kosuu() ) 'エラー VB6でポインタを扱う場面は例えばどんな場合があるか知りたいです。 ポインタは使わない(使ってはいけない)のが基本でしょうか。

  • hdkoa
  • お礼率0% (1/117)

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

  • ベストアンサー
  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

pointer = VarPtr( kosuu(0) ) ではどうでしょう? 隠し関数ですし、.netではサポートされていませんので使わないほうがよろしいかと。

関連するQ&A

  • 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側の仕様に合わせる方法は無いのでしょうか? よろしくお願いいたします。

  • dimを使わずにredimを使う場合

    VBAを使っていて、 配列数を変数で定義したいのですが、 ネットで検索すると Dim aaaa() as integer Redim aaa(xxx, yyy) あるいは Dim aaaa() Redim aaa(xxx, yyy) as integer のようにdimで変数を定義した後にredimで定義しなおす方法が書かれてあります。 一方で、 Redim aaa(xxx, yyy) as integer のように、dimの定義を省略して、いきなりredimで配列を定義しても 問題なくプログラムは実行できることに気がついたのですが これら二つの方法に違いはあるのでしょうか? 後者を使っても問題ないでしょうか?

  • VB6で配列を引数にするときの2通りの方法について

    VB6で引数に配列を渡す方法が2通りあるよう?ですが以下のような配列があり、渡し方によって引数の定義の仕方が異なると思うのですが、(2)番目の関数の書き方が知りたいです。 dim ary_dat(10) as integer (1)test_A( ary_dat ) は、sub test_A( byref ary() as integer)という関数を作れば動作することはわかりましたが、 (2)test_B( ary_dat(0) ) は、関すでどのような引数を定義すればできるのでしょうか?

  • VB6のメモリ解放に関して

    お世話になります VB6のメモリ解放に関して、以下を参考に下記のコードで試したのですが、 コンパイルエラーで「配列には割り当てられません」となってしまいます。 http://okwave.jp/qa/q3372573.html 違いは宣言の型がStringかLongしかないと思うのですが、 なにが悪いのか教えていただけないでしょうか ******* 以下 ソース Dim wProcDat() As Long ReDim wProcDat(1 To 1000, 1 To 768) 中略 Set wProcDat = Nothing

  • C++のActiveX DLLでポインタを受け取る

    C++でVB用にポインタをラップするようなクラスを作ろうと思っています。 VBからByRefで変数を受け取って、そのポインタを保持し、 そのポインタの参照先の変数の値を取得したり、代入するメソッドを実装します。 しかし、ポインタを受け取る時点で、正しいポインタが受け取れていないようです。 idlファイルはおよそウィザードに任せていますが、扱うのは初めてなので、 ドのようにすればByRefで正しいポインタを受け取れるのか教えていただけないでしょうか。 --------------------------------------------- VbHelpLibrary.idl ... interface ILongRef : IDispatch{ [propget, id(1), helpstring("プロパティ Ptr")] HRESULT Ptr([out, retval] long *pVal); [propput, id(1), helpstring("プロパティ Ptr")] HRESULT Ptr([in] long* newVal); [propget, id(2), helpstring("プロパティ Value")] HRESULT Value([out, retval] long *pVal); [propput, id(2), helpstring("プロパティ Value")] HRESULT Value([in] long newVal); }; --------------------------------------------- LongRef.cpp STDMETHODIMP CLongRef::get_Ptr(long *pVal){ *pVal = (long)this->m_ptr; return S_OK; } STDMETHODIMP CLongRef::put_Ptr(long *newVal){ this->m_ptr = newVal; //ここでnewValがVarPtr(X)と一致しない //*newVal = 100; //試しにここでこのポインタの先に値を入れてもXは変化しない return S_OK; } STDMETHODIMP CLongRef::get_Value(long *pVal){ *pVal = *m_ptr; return S_OK; } STDMETHODIMP CLongRef::put_Value(long newVal){ *m_ptr = newVal; return S_OK; } --------------------------------------------- Module1.bas Sub Main() Dim X As Long, Y As New LongRef Debug.Print "VarPtr(X) = ", VarPtr(X) Y.Ptr = X Debug.Print "Y.Ptr = ", Y.Ptr --------------------------------------------- 結果 VarPtr(X) = 1308376 Y.Ptr = 1929464

  • VB2010 コンパイルエラー

    VB6からVB2010への移行を行うにあたり、 VB6→VB2008→VB2010 のコンバートを行いました。 が、以下のソースがコンバートされてコンパイルエラーになってしまいます。 エラー内容: 型 'System.Windows.Forms.Cursor' の値を 'Integer' に変換できません。 ---(1)元のソース------------------ Dim lSv_Mouse As Long 'マウスポインタ状態の保存 lSv_Mouse = Screen.MousePointer (中略) 'マウスポインタ状態の復元 Screen.MousePointer = lSv_Mouse ---------------------------------- ---(2)コンバート後のソース--------- Dim lSv_Mouse As Integer 'マウスポインタ状態の保存 lSv_Mouse = System.Windows.Forms.Cursor.Current (中略) 'マウスポインタ状態の復元 System.Windows.Forms.Cursor.Current = lSv_Mouse ---------------------------------- 何か良い方法は無いでしょうか?

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()

  • VB6.0の参照渡し

    VC++6.0で作成したDLLへVBの配列を渡そうと思っています。 いくつかためしたのですが、 「配列引数は ByRef でなければなりません。」 というエラーがでてしまいます。 標準モジュール内の記述 Declare Function fncTest Lib "Test.dll" (ByRef test() As Long) As Long フォーム内 Private Sub Test_Click() dim test() as Long dim i as integer for i = 0 to 3 test(i) = i next i fncTest(Test()) End Sub とりあえず、こんな形でかいてみましたが、 Sub内のtest()の宣言方法、使用法等ご指導お願いします。

  • 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でByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。