byVal で値を受け取れる??

解決


mura  2004-08-27 19:31:58  No: 115924

はじめまして。
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 19:35:29  No: 115925

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


魔界の仮面弁士  2004-08-27 22:25:43  No: 115926

> 色々調べてみても「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-28 01:26:56  No: 115927

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加