VBからAPIを使用するときの文字列型引数引き渡しの非常識
VBの関数では、引数を『値渡し(ByVal)』と『参照渡し(ByRef)』の2種類で受けることが出来ます。
ByValで受けた変数を関数内で変更すると、呼び出し元の変数は変更されません。
ByRefで受けた変数を関数内で変更すると、呼び出し元の変数は変更されます。
これ、VBの常識です。
しかし、APIの引数へ文字列型変数受け渡しに関して、この常識が通用しないのです。
API側の引数型がC言語の文字列ポインタで受けるのもは、VB側ではすべてByValで渡すのです。
そして、APIは、ByValで受けても、ちゃんとが値を設定してくれるのです(VBでは非常識)。
つまり、『ByValで受けた変数を関数内で変更すると、呼び出し元の変数は変更されます』になるのです!!
たとえば、以下では、gethostname関数(ソケットAPI)をコールするとByValなのにnameへホスト名が設定される。
VBでの定義
Public Declare Function gethostname Lib "wsock32.dll" _ (ByVal name As String, ByVal namelen As Long) As Long