byVal で値を受け取れる??

解決


mura  2004-08-27 10:31:58  No: 115924  IP: [192.*.*.*]

はじめまして。
VB初めて1ヶ月も経たない初心者です。

今、とあるDLLに定義された関数を使用してコーディングをしています。
その関数を

Public Declare Function hoge Lib "hoge.dll" (ByVal hoge As String) As Long

などと定義しています。
そして、いざこの関数を

Dim arg As String
arg = ""
MsgBox(" 1 : " & arg)
Call hoge(arg)
MsgBox(" 2 : " & arg)


などと呼び出すと、1と2のMsgBoxでargの値が異なるのです。
色々調べてみても「byValは値渡しで、呼び出し側に影響は無い」という記事しか見受けられません。
上記のような事はありえるのでしょうか??
わかりづらいかもしれませんが、どうかよろしくお願いします。

編集 削除
mura  2004-08-27 10:35:29  No: 115925  IP: [192.*.*.*]

追記:環境・・・VB6.0,Win2000

編集 削除
魔界の仮面弁士  2004-08-27 13:25:43  No: 115926  IP: [192.*.*.*]

> 色々調べてみても「byValは値渡しで、呼び出し側に影響は無い」という記事しか見受けられません。
その記述は半分正しく、半分は間違いです。

ByVal As String な引数への影響に付いては、
VB内のプロシージャでの場合と、API呼び出しの場合とでは、
意味合いが変わってきます。

MSDNライブラリで、「DLL プロシージャへの文字列の引き渡し」という
トピックを検索してみてください。詳しい説明が書かれています。


なお、String型の引数を ByRef でAPIに渡すことは、ほとんどありません。
LPCSTRであろうと、LPSTR であろうと、ByVal As Stringで渡します。
(OLE系のAPIにBSTRとして渡す時には、ByRefで渡す事もありえますが)

ついでに、オブジェクトを渡した場合の動作に付いても。
http://support.microsoft.com/default.aspx?scid=kb;ja;161308

編集 削除
mura  2004-08-27 16:26:56  No: 115927  IP: [192.*.*.*]

魔界の仮面弁士さん、ありがとうございます。
大変参考になりました。
まだ解決したわけではないのですが、なんとかなりそうな気がしてきました。

編集 削除