0

VBA プロジェクト用の COM クラス ライブラリを作成しようとしていますが、遭遇したと思われる制限の 1 つは、New() サブルーチンでコンストラクターを使用することです。新しい COM クラスを作成した後、次のコメントを含む Public Sub New() が作成されます

' A creatable COM class must have a Public Sub New() 
' with no parameters, otherwise, the class will not be 
' registered in the COM registry and cannot be created 
' via CreateObject.

もちろん、さまざまなパラメーターを許可する new キーワードを使用して、より多くのサブルーチンを作成したいと考えています。ただし、これを実行して VBA でオブジェクトを実装しようとすると、「ステートメントの終わりが必要です」というパラメーターを入力しようとするとエラーが発生します。誰かが大歓迎される情報を持っていれば。

ありがとうございました。

4

1 に答える 1

2

COM に公開されるすべてのクラスには、パラメーターなしのコンストラクター (ピリオド) が必要です。その理由は、クライアントがクラスをインスタンス化すると、呼び出しが最終的にCoCreateInstance()グローバル関数にIClassFactory::CreateInstance()なる (またはほとんど同じ) ためです。CoCreateInstance()(またはIClassFactory::CreateInstance())クラスのコンストラクターにパラメーターを渡す手段がないため、クラスにはパラメーターのないコンストラクターが必要です。そのコンストラクターは、クラスを内部でインスタンス化するために使用されます。

パラメータのないコンストラクタ以上のものが必要な場合は、ファクトリ クラスを使用してください。擬似コード:

// this should be made COM-exposed
interface IYourClassInterface {
};

// this should not be made COM-exposed
class CYourClass {
public:
    CYourClass( parameters ) {}
};

class CYourClassFactory {
public:
   CYourClassFactory() {} //<- parameterless constructor
   IYouClassInterface* CreateInstance( parameters here )
   {
      return new CYourClass();
   }
};

このようにして、パラメータのないコンストラクタを持つファクトリ クラスが作成されます。ファクトリをインスタンス化してから、その作成者メソッドを呼び出してクラスをインスタンス化します。

于 2010-07-14T04:58:03.187 に答える