• ベストアンサー

直接メモリにアドレス割付けで書き込む方法

VB6.0 WindowsXP 掲題の件ですが、初心者なので分かりやすく教えていただければ幸いです。 現在、MSCOMMを用いてシリアル通信はできるようになりました。 これからPCIボードを使って、通信を試みようとしているのですが、 これは指定したアドレスに書き込むと送信してくれるようです。 VBを用いてメモリのアドレスを指定して書き込む方法はAPIを使うらしいというのまでは 分かったのですが、具体的にどのようなコードを記述すればいいのか分かりません。 型宣言時にアドレスを指定してメモリを確保できるのでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.3

アドレスを指定して宣言することはできません。 そもそもアドレス空間やプロセスを管理するのはOSの仕事ですので とてもではないですが、通常の処理系では無理でしょう。 といってもcopymemoryやmovmemoryなどのメモリ転送命令を駆使すれば 何とかなるような感じもしますが、ダメなのでしょうか。

yoshi004
質問者

補足

ありがとうございます。 copymemoryやmovememoryを使えばできそうならば、やってみたいと思います。 後は、変数のデータをVC++などに渡して、VC++上で読み書きできるようにする方法もありなのかなと思ったのですが、VC++は記述した経験が少ないので、 どちらが早くできるかと考えております。

その他の回答 (2)

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.2

>このAがどのアドレスに書かれるかを指定したいのですが 変数のアドレスを知りたいのなら、Varptr関数を使って下さい。 私もかつてヘルプで探したのですが、 その関数が掲載されていないのには驚きました。未サポートだそうです。 1985年当時のマイクロソフトのBasic では既に存在したので 私は経験上その関数の所在を知っていたのですが、 知らないと探し出すのは困難でしょうね。 http://www5.ocn.ne.jp/~minute/article/vb/e11.html >VBではアドレスを指定してメモリに書き込んだり読んだりできる関数 #なんかまだ違うような気がするなあ

yoshi004
質問者

補足

ありがとうございます。 VarPtrは探したら分かりました。 これですと、使われているアドレスは分かりますが、 自分でアドレス指定することができないのですが、 アドレスを指定して変数を宣言することはできないのでしょうか?

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.1

イマイチ状況がよく分からないのですが、 VB6とのことなので、動的にメモリを確保する方法はredimを使います。 dim a() as byte ・・・ redim a(100) などとします。このときアドレスというかAPIに渡すときはa(0)と いうように指定します。これはAPIを使うときの作法のようなものです。 通信系のプログラムだと受信データを固定できないので 動的に確保するという意味だと思いますが、なんか違っているような? いちおう補足要求ということにしておきます。

yoshi004
質問者

お礼

http://forums.belution.com/ja/vb/000/007/59.shtml たぶん上記のURLの掲示板に投稿されている方と同じような質問になります。 VBではアドレスを指定してメモリに書き込んだり読んだりできる関数などはないのでしょうか?

yoshi004
質問者

補足

説明不足ですみません。 パソコン内部に詳しくないので間違っているかも知れませんが、 PCIカードを認識させると、メモリ範囲が確保されます。その中で指定した番地にデータを確保できるようにしたいのですが。 型宣言で、 Dim A As Integer とした場合に、このAがどのアドレスに書かれるかを指定したいのですが。 DRAM?の指定したアドレスの中に、送信データ、受信データの領域を確保したいのですが。

関連するQ&A

  • VB.NETでのシリアル通信

    .NET初心者です。 VB.NETでシリアル通信をしようとしています。 参照設定のところに Microsoft MSCOMM CONTROLというのがあったので 選択しました。 すると、MSLib.MSCommというのがでてきたので Vb6の Dim test As mscomm のように宣言して使えるかと思い Dim test As MSLib.MSComm test.PortOpen と書いてみたところ、 オブジェクト参照・・・インスタンス化されていません。と、エラーがでました。 ブレイクしてみたところ、test = Nothingでした。 testが無いのでインスタンス化されていないという エラーがでるのだなということは分かったのですが なぜこのエラーがでるのか、 どうしたらこのエラーを回避し、 .NETでシリアル通信ができるのか教えてください。 よろしくお願いします。

  • Win32APIでシリアル通信をするには?

    Win32APIとVB.NETを使ってシリアル通信をするプログラミングを考えています。概要はGPS端末からのデータをVBで受信して表示できるようなプログラムを目指していますが、APIの使い方が分からないので詳しく教えていただける方がいましたら、サンプルソースまたは参考Webサイトの教示をお願いします。 VB6.0のクラス(MSComm)を追加する方法ではなく、APIを使う方向で回答お願いします。

  • c言語のメモリの確保について

    c言語で変数を宣言したり、領域を確保したりする場合に、メモリ上のこのアドレスに領域を確保する、といったように場所を指定することはできるのでしょうか?

  • VBのメモリのアドレス取得

    C++で作成したDLLをVBから変数を渡して 文字列が格納されているメモリアドレスを取得して、 別のDLLにメモリアドレスを渡したいのですが、 具体的な指定の仕方を教えてください。

  • VB6.0で作成したデータ(配列に入った数値)をVC++に渡したい

    掲題の件ですが、 VB6.0ではアドレスを指定して、 メモリを書いたり読んだりすることが困難ということが分かり、 VBで計算した結果をVC++に渡して、VC++でアドレスを指定してメモリに書き込んだり、 読み込んだりするようにしようと考えています。 プログラミングは初心者なので、これが実現可能かどうかが分からないのですが、 調べると、VC++でDLLファイルを作ってVBで参照するという方法はあったのですが。 ・これは実現できるのか。 ・どこにどのようなコードを書けば良いか(同プロジェクト内に違う言語を存在させることは可能か。) ・受け手側はどのように記述すれば値を受けれるか 以上よろしくお願いします。 http://forums.belution.com/ja/vb/000/007/59.shtml このような問題がありました。

  • USBメモリの構造、アクセス方法について

    マイコンでAD変換した1バイト分づつのデータを市販のUSBメモリ を使って装置内にデータロガーとして用いたいのですが制御方法など教 えていただけませんでしょうか?USBホストICという便利?なIC を見付け、RS232Cの様にシリアル通信でマイコンからホストIC 経由でUSBメモリにデータを書き込めるようです。 そこで初歩的な質問ですが、USBメモリの通信方式はシリアル通信で すが、データを書き込みたいアドレスの指定などどの様に行われるので しょうか?みなさんご教示宜しくお願いします。

  • 指定した実行中プロセスの、指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか?

     指定した実行中プロセスの指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか。  例えば(あくまで例えば)グーグルアースの実行中、現在センターに来ている座標をVBで取得したい場合などです。その座標が格納されているメモリアドレスはわかっているのですが、VBからそこへの手の出し方が判らないのです。 できれば一定時間ごとにその値を取得して表示したいと思っているのですが、VBからプロセスを指定したりそのメモリの値を見るなんて方法がさっぱり判らなくて困っています。

  • エクセルVBAでRS232通信は可能ですか?

    VBAでシリアル通信したいのです。 VBでは下の検索結果にあるようにmscommが使えます。 VBAではmscommが使えませんでした。制限があるのでしょうか? VBAで行う方法をご存知の方教えてください。 http://www.okweb.ne.jp/search.php3?dummy=%83%81%81%5B%83%8B&c=218&kw=mscomm

  • ボーレートを2150にしたい!

    VB6.0でシリアル通信をするとき,どうしてもボーレートを2150bpsに設定したいんですが,どうやればいいのかわからず困っています.どなたか御教授ください.(MSCommでやろうとしてましたができないことに気付きました)なお,「そんな中途半端な数字にはできない!」というご意見でも結構です.よろしくお願いします.

  • ポインタの宣言

    ポインタを宣言するとメモリ上に、ポインタ変数を格納するための領域が確保されます。ポインタ=アドレスというのは大丈夫なのですが、 int *b のようにどうして、ポインタに型があるのでしょうか?単に変数のアドレスを表示するだけならば型はいらないと思うのですが。 またこのとき宣言された変数は *b ではなくて b であってますよね?

専門家に質問してみよう