VB初心者です。
Cは、ポインタ変数にアドレスを入れると、
実態を参照してくれますが、
それをVBでは、どうすればいいのでしょうか??
VBでC関数から文字列が格納されているアドレスを受け取って、
実態の文字列を参照したいのですがどうやったら参照できるのでしょうか??
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

文字列のアドレスを渡して、そのアドレスに文字列


が返却されるタイプであれば、単純に文字列を指定
すればOKです。

関数側で、メモリを確保して、そのアドレスが
返ってくるタイプのインタフェースの場合、VBで
は、ポインタを処理する型がないため、そのアドレ
スの内容を自分の変数の領域に移動させることで、
読み取ります。

移動させる関数は、RtlMoveMemoryで、下記では、
MemCopyとして定義しています。これを使って、
Dimで定義した文字列の領域に(移動前に、必要な
だけの文字を入れておくこと)コピーすればOK
です。

Public Declare Sub MemCopy _
Lib "Kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, _
hpvSource As Any, _
ByVal cbCopy As Long)
    • good
    • 0
この回答へのお礼

ありがとうございました。
この方法でやってみます。

お礼日時:2001/09/11 16:43

VBとCとのやりとりは、VBからCで作ったDLLを呼出しているんですね。

(Declare....で)
だとして、その辺は、MSDNのDLLの呼び出しのあたりに詳しく書かれています。
 要は、VBの引数受け渡し方法は、2種類(By Ref,By Val)で、デフォルトは、By Ref(だったかな?)つまり、ポインタ渡しです。
しかし、VBの文字列変数は、独特のメモリの取り方をやってるので、ヘッダー部がついている。また、NULLで終わらないので、Cの文字列とは違う、でも、質問のような受け渡しは可能です。
    • good
    • 0
この回答へのお礼

ありがとうございました。
参考にさせていただきます。

お礼日時:2001/09/11 16:46

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB2010 変数に格納する文字列を増やす

単純なことなのですが、、、どうしても方法が思い浮かびません。
下記のプログラムでは2735回変数にDataGridの値を格納
していますが、本来行いたい処理は
Dataの中に2735回出た結果を文字列として連結したいです。
(たとえば..1回目でA 2回目でBと出た場合、DataにAB)
方法をご教授下さい。

For Row=0 To 2734
Data=Me.DataGridView1(CC,Row).Value
Next

Aベストアンサー

Data &= Me.DataGridView1(CC,Row).Value

または String.Concat を使う
Data = String.Concat(Data, Me.DataGridView1(CC,Row).Value)

または高速処理が可能な StringBuilder を使う
Dim sb As New System.Text.StringBuilder()
For Row = 0 To 2734
sb.Append(Me.DataGridView1(CC,Row).Value)
Next

QVBでOSの環境変数を参照する方法について

下記のようなvbの実行ファイルとアプリケーション構成ファイルがあり、
xmlファイルからvalueの値を取得して処理を行っています。
・vb.exe
・vb.exe.config
・vbConfig.xml

【vbConfig.xml】
---------------------
<?xml version="1.0" encoding="utf-8" ?>
<config>
<params>
<param key="checkFile" value="ここに値を設定" />
</params>
</config>
---------------------

現在はvalueに設定値を明記していますが、設定したい値が環境ごとに異なるため、
各環境ごとにxmlファイルが存在しています。これを、OSのユーザー環境変数から
取得するように変更し、全環境のxmlファイルを統一したいと考えているのですが、
xmlのvalueにOSの環境変数を設定する方法はありますでしょうか?

尚、ユーザー環境変数は各環境のexe実行前にsetxコマンドで定義する想定です。
試しにsetxコマンドでVBTESTというユーザー環境変数を定義し、以下のような
記載にしてみたのですが、正しく動作しませんでした。
<param key="checkFile" value="%VBTEST%" />

書式が間違っているのでしょうか?それとも、上記のような使い方はできない
ものでしょうか?vb初心者で勝手が分からないため、記載内容に不備等も
あるかもしれませんが、アドバイスをお願い致します。

下記のようなvbの実行ファイルとアプリケーション構成ファイルがあり、
xmlファイルからvalueの値を取得して処理を行っています。
・vb.exe
・vb.exe.config
・vbConfig.xml

【vbConfig.xml】
---------------------
<?xml version="1.0" encoding="utf-8" ?>
<config>
<params>
<param key="checkFile" value="ここに値を設定" />
</params>
</config>
---------------------

現在はvalueに設定値を明記していますが、設定したい値が環境ごとに異なるため、
各環境ごとにxmlファイルが...続きを読む

Aベストアンサー

xmlファイルをどのようにして読んでいるかが不明なので(どのようなライブラリを使用しているか不明なので)
なんとも言えませんが、たぶん、
>書式が間違っているのでしょうか?それとも、上記のような使い方はできない
>ものでしょうか?
の回答は、「上記のような使い方はできない」になると思います。
もし、仮に使用しているxmlファイルを読み込むためのライブラリに%XXX%の文字を環境変数XXXから取得する
と明記されていれば、話はべつですが・・・・

ですので、vb.exeを改造するのが最も手っ取り早い解決策になるかと思います。
改造の内容は、「読み込んだ内容の該当箇所が"%XXX%"であれば、環境変数XXXの値で読み替える」ということになります。

Q変数の参照でエラーが出てしまいます。(VB.NET)

プロシージャの外に記した変数があるのですが、
(Dim IniFileName as string = "myapp.ini")など
Public Shared Sub 内でIniFileNameを使おうとすると
---------
クラスの明示的なインスタンスを指定しないで、共有メソッドまたは共有メンバ初期化子内からクラスのインスタンス メンバへ参照することはできません。
---------
というエラーが出てしまいます。
クラスの明示的なインスタンスを指定したいのですが、
意味がさっぱり分かりません。
class.IniFileNameとかForm1.IniFileNameなどとしてみたのですが違うようです。
一つ正解をご教示頂けたらと思います。
宜しくお願い致します。

Aベストアンサー

参考URLの「インスタンスを作成せずに呼び出せるメソッド 」が参考になるかもしれません。

Sharedをつけると、インスタンス生成しなくても呼び出せるメソッドになるので、インスタンスに属するメンバ変数などにアクセスできません。

Sharedメソッドから参照したいのであれば、
そのSharedメソッドと同じクラス内でShared変数とするか、Sharedメソッドの引数にするかなどで対応できます。

参考URL:http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbnet2_05/vbnet2_05_02.html

QDLL<->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で開発を行っていますが、
DLL<->VBでのやり取りでポインタ?のの引渡しで困っております。

簡単に言うと、指定したキーで、内容(データ)を取出し、さらに
要素ごとにデータを取出すという仕組みです。

例ですが、DLLの仕様は

TR_MR(No,Id,Buff)

 Noは検索No.
 Idは取出す位置
 buffはデータバッファ領域のポインタ
で、Idで指定された位置からデータをbuffに読み込む
(戻り値は、buffにセットされたデータのバイトサイズ)

TR_MR_IT(buff,Tagset,Dat)

buffは先ほ...続きを読む

Aベストアンサー

ポインタの何が困っているのか、この内容からでは理解しかねます・・・。

○ 文字列はByValでポインタが渡される
○ 配列は先頭の要素をByRefでポインタが渡される
○ それ以外の変数もByRefでポインタが渡される

この質問により、何が知りたいかなどを明記してください。

QVBでC言語のポインタみたいな使い方?

VBでC言語のポインタみたいに、一個の関数に配列のアドレスを渡して汎用的に使える方法は出来ますでしょうか?
宜しくお願いします。

PS:配列のデータは直線を描く為のデータです。

Aベストアンサー

>VBでは値を渡さないの出来ないのですね。

参照渡しで可能ですと書いたのですが。

参照渡し=アドレス渡し
配列を関数に渡した場合、呼び先の関数で配列の内容を変更すると、呼び元の内容も変更されます。

内部的には、配列の先頭アドレスを渡しているだけです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報