2011-07-29 6 views
2

out-proc COMサーバーでは、CoRegisterClassObject()に渡すクラスファクトリが必要です。 CreateInstance()は、newを使用してオブジェクトインスタンスを作成し、格納されたデータを必要としません。 LockServer()は、ファクトリインスタンスに固有の共有ロックカウンタを変更します。グローバルオブジェクトをCOMクラスファクトリとして使用していますか?

実際、私はファクトリ内に別のデータを格納する必要はなく、オブジェクトを1つしか持たないとうまく動作しません。また、私はそのオブジェクトの生涯を世話したくありません。私は(コンストラクタで1に参照カウントを設定して)グローバル変数として工場を宣言するように誘惑だ理由はここにある:

私は delete this Release()内部ではもはや満足していないことをやるたら
//Server.cpp 
CMyFactory factory; 

- そのコードべき(refcountは1から始まり、決してゼロに達しません)、それが実行されると、未定義の動作につながります。だから私は、工場からの参照カウンタを削除すると、このようAddRef()Release()の実装を考える:

ULONG CMyFactory::AddRef() 
{ 
    return 1; 
} 
ULONG CMyFactory::Release() 
{ 
    return 1; 
} 

ので参照カウントがちょうど副作用がないだろう、何delete thisはありません。

説明されている実装は合法でしょうか?それは何か問題を引き起こすでしょうか?

答えて

1

プロセスライフタイムを異なる平均で制御する限り、これが受け入れられます。オブジェクトがグローバルではなく動的なものであるため、この場合の削除は災害です。

1

はい、完全に合法であり、COMブックのどこかに文書化されています。

関連する問題