はじめまして。
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は値渡しで、呼び出し側に影響は無い」という記事しか見受けられません。
上記のような事はありえるのでしょうか??
わかりづらいかもしれませんが、どうかよろしくお願いします。
追記:環境・・・VB6.0,Win2000
> 色々調べてみても「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
魔界の仮面弁士さん、ありがとうございます。
大変参考になりました。
まだ解決したわけではないのですが、なんとかなりそうな気がしてきました。
ツイート | ![]() |