構造体を値渡しすべきかどうか

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
THEREMIN
記事: 36
登録日時: 2007年2月11日(日) 01:52
お住まい: HYOGO pref.

構造体を値渡しすべきかどうか

#1 投稿記事 by THEREMIN »

まず、VARIANT構造体はこのように定義しています。

コード: 全て選択

Type VARIANT
	vt As VARTYPE
	wReserved1 As Word
	wReserved2 As Word
	wReserved3 As Word
	Val[ELM(8)] As Byte
End Type
IShellWindowsインターフェイスを取得して、get_Countメソッドは成功したのですが、Itemメソッドがどうもうまくいきません。
ExDisp.hには

コード: 全て選択

virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( 
/* [optional][in] */ VARIANT index,
/* [retval][out] */ IDispatch **Folder) = 0;
とあるので、VARIANT構造体を値渡しする必要があると思うのですが、
ActiveBasic4では構造体はポインタ参照でないとダメなようです。
なので、
ByRef index As VARIANT
としてデバッグしましたが、例外処理のダイアログが出てしまいます。
そこで、構造体のメンバを順々に引数として渡していけば、値渡しで構造体を実質渡したことになるのかも、と考え
ByRef index As VARIANTの部分を

コード: 全て選択

ByVal index_vt As Word,
ByVal index_wReserved1 As Word,
ByVal index_wReserved2 As Word,
ByVal index_wReserved3 As Word,
ByVal index_ValLong As Long,
ByVal index_Padding As Long
としたのですが、同様にエラーが出てしまいます。
ちなみに、index_vt =VT_I4、index_Padding =0として、他は全て0を代入しています。

これは、構造体の渡し方がおかしいのでしょうか?
それとも、VARIANT構造体に値(Long型)を代入するやり方が間違っているのでしょうか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

これ私も困りました。ByVal DWordを4つかByVal QWordを2つという風に引数を分けてやることで問題を回避できます。

コード: 全て選択

Sub Proc(ByVal v As VARIANT)
End Sub

Dim v As VARIANT
Prov(v)
例えば元が上のようになっていた場合,下のように書き換えます。この例ではただの関数ですが,インタフェースのメソッドでも変わりありません。

コード: 全て選択

Sub Proc(ByVal v1 As QWord, ByVal v2 As QWord)
End Sub

Dim v As VARIANT
Dim p As *QWord
p = VarPtr(v) As *QWord
Proc(p[0], p[1])
ちなみにAB5では構造体もByVal指定が可能となり値渡しできるようになりました。
THEREMIN
記事: 36
登録日時: 2007年2月11日(日) 01:52
お住まい: HYOGO pref.

できました!

#3 投稿記事 by THEREMIN »

なるほど、基本型のポインタを作ってそこに構造体のアドレスを代入し、
基本型を配列に分けてByVal渡しすればいいんですね。
細かく分けると逆にダメなのか・・・とても勉強になりました。

にしてもQWordなんて初めて使いましたよ。
返信する