CreateObjectとNewの違い

解決


お名前  2008-04-15 22:21:24  No: 100567  IP: 192.*.*.*

VB6のXPです。

ADODBのConnectionオブジェクトを利用する際、

  Set objConnection = CreateObject("ADODB.Connection")

とする場合と

  Dim objConnnection As New ADODB.Connection

とする2つの場合がありますが、この違いは何なのでしょうか?

ネットを検索しても、参照設定はするべきだという意見がほとんどなのですが、私としては参照設定しないほうがやりやすいです。

例:http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200203/02030007.txt

編集 削除
やじゅ  2008-04-15 23:41:22  No: 100568  IP: 192.*.*.*

CreateObject」関数は、「実行時(遅延)バインディング」と呼ばれ、
呼び出しのオーバーヘッドが大きくなる。
http://msdn2.microsoft.com/ja-jp/library/0tcf61s1(VS.80).aspx
NewキーワードとCreateObject関数でのオブジェクト作成の違い
http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006120905.htm

編集 削除
K.J.K.  2008-04-16 09:06:00  No: 100569  IP: 192.*.*.*

実行時バインディングは、VB6の場合は主に型の指定で出るところです。
"As Object"とするか、"As ADODB.Connection"とするか、で出る差異の
方ですよね。

ちなみに、Newで得たオブジェクトを実行時バインディングで使うことも
できますし、CreateObjectで得たオブジェクトを事前バインディングで
使うこともできます。

Dim oConnection As Object
Dim oADOConnection As ADODB.Connection

Set oConnection = New ADODB.Connection
Set oADOConnection = CreateObject("ADODB.Connection")


CreateObjectとNewでは、そのクラス名をどう得るのかが異なります。
Newでは、最初からクラスIDが指定され、CoCreateInstanceが呼ばれます。
CreateObjectでは、
1,ProgIDからクラスIDを、CLSIDFromProgIDで取得し、
2,そのクラスIDを用いてCoCreateInstanceが呼び出される。
という手順になります。

クラスIDが固定であることが確実ならばNewを用いる方が簡単でしょうし、
実行時にクラスIDを解決したいのならばCreateObjectを使うことになるでしょう。
文字列型で指定できる点でも融通が利きますし。

編集 削除
やじゅ  2008-04-16 11:43:34  No: 100570  IP: 192.*.*.*

なるへそ、勉強になります。認識が甘いですね私(^^;

編集 削除
お名前  2008-04-17 14:29:06  No: 100571  IP: 192.*.*.*

CreateObjectの際、作成するコントロールによっては「ActiveX コンポーネントを作成できません。」というエラーが発生するようです。例えばインターネットトランスファコントロール。

VBをインストールしているマシンでは当然動作しますが、別なマシンではNGになってしまうので、今回は参照設定を行いたいと思います。

編集 削除