ここで,Setキーワードについて補足説明をしておく。Setキーワードは,オブジェクトの参照を変数に代入するためのものである。より詳しくいえば,オブジェクトをコピーして代入するのではなく,そのオブジェクトの占めているメモリの領域を指す場所が変数に代入されるということである。
COMオブジェクトを変数に代入する場合には,必ずSetキーワードを使う。これは,NewキーワードやCreateObject関数を使ってCOMオブジェクトを実体化するときだけでなく,COMオブジェクトをすでに保持している変数を別の変数に代入する場合も同じである。
Dim objADOConnection As ADODB.Connection
Dim objADOConnection2 As ADODB.Connection
Set objADOConnection = CreateObject("ADODB.Connection")
'変数objADOConnectionが指しているオブジェクトを
'変数objADOConnection2にコピーする。
'このとき,Setキーワードが必要となる。
Set objADOConnection2 = objADOConnection
上記のようなプログラムを実行した場合,変数objADOConnectionと変数objADOConnection2は同じCOMオブジェクトを指すことになる。いい換えると,COMオブジェクトは変数objADOConnectionと変数objADOConnection2の2箇所から参照されているということになる。
よって,変数objADOConnectionを経由してCOMオブジェクトに対して行った操作は,変数objADOConnection2から参照されるCOMオブジェクトにも反映される。なぜならば,変数objADOConnectionと変数objADOConnection2で2つのCOMオブジェクトが生成されているわけではなく,両者が指しているCOMオブジェクトは同じものだからである。
このとき,このCOMオブジェクトを明示的に解放したいのであれば,変数objADOConnectionと変数objADOConnection2の両者にNothingを代入しなければならない点に注意しよう。
Set objADOConnection = Nothing
Set objADOConnection2 = Nothing
変数objADOConnectionだけにNothingを代入しても,COMオブジェクトは消滅せず,変数objADOConnection2を経由して参照することができる。COMオブジェクトが消滅するのは,「そのCOMオブジェクトを指している変数すべてにNothingが代入されたとき」である。
COMクライアントがCOMを使っている場合,この問題が顕著に顕れることはまずないと思われる。しかし,COMオブジェクトが別のCOMオブジェクトを実体化して,それをCOMクライアントに戻り値として返すような場合には,よく考えておく必要がある。COMオブジェクトが別のCOMオブジェクトを実体化して戻り値として返すようなケースとしては,たとえば,COMオブジェクトがADODB.Recordsetオブジェクト(これは,ADOのレコードセットのCOMオブジェクトである)を実体化し,それをCOMクライアントに返すような処理が考えられる。
|