2011-02-01 13 views
2

VB6で使用するためにC++でDLLを作成しています。そのため、DLLにはコンストラクタを呼び出すことができません(this discussionによる)。しかし、クラスのインスタンスを内部的に維持する必要があります。そのため、オブジェクトをグローバル変数として保持し、グローバル関数からコンストラクタを呼び出し、その後、別のグローバル関数を使用してオブジェクトのメソッドを呼び出します。C++ DLLの初期状態を格納する方法/初期化されていない変数を認識する方法

私は、多分一つの関数で十分だろうという考えを持っていました。グローバル変数にインスタンスが存在するかどうかをチェックし、そうでなければオブジェクトを作成し、オブジェクトのメソッドを呼び出します。現在、メソッドをすぐに呼び出す)

インスタンスがすでに作成されているかどうかを確認するにはどうすればよいですか?宣言にグローバル変数に値を割り当てることはできません。また、C++で保証されているデフォルト値はありませんが、わかっている限りです。

私の質問:これはとにかく可能ですか?

また、BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )関数を使用して変数を初期化することはできますか?もしそうなら、誰かがul_reason_for_callのケースとまったく同じで、リンクされた例のようにVB6がDLLをロードするときに自動的に呼び出されるものを教えてくれますか?

+0

私はDllMainでそれをしません。しかし、クラスの静的メンバーをラップするヘルパークラスを使用して、VB6で呼び出されるすべてのグローバル関数がそのインスタンスを処理できないのはなぜですか? –

+0

@Sasha:それでも、私はそのメソッドにアクセスする前にインスタンスを作成する必要があるということを意味していませんか?少し具体的にしてください、私はかなり理解していません! –

+0

下記の私の答えを参照してください。 –

答えて

2

bool bInited = false; 
MyClass* pClass = NULL; 

これらの代入文は、彼らが適切に初期化されている場合は、後であなたがテストすることができ、DllMain内部で呼び出されます。

ポインタをauto_ptr(stlなどを使用する場合は)として宣言して、終了時にデストラクタを呼び出すことができます。

2

MyClassのインスタンスをグローバルにアクセス可能にしたいとします。

class GlobalHelper { 
public: 
    static MyClass* GetInstance() { 
     static MyClass inst; 
     return &inst; 
    } 
}; 

を...そして、あなたのグローバルな方法が自分の仕事をするためにGlobalHelper::GetInstance()->Whatever()を呼び出すことになります。 あなたのグローバル関数がアクセスする静的メンバを持つクラスを持つことができます。あなたはグローバルな静的変数を使用するか、またはあなたのCPPファイルにスコープ変数を提出することができます

+0

+1。面白い私たちは、両方の例では、 'MyClass'を使用します。 –

+0

これはスレッドセーフではありません。 –

+0

ああ、ありがとう、興味深い、私はC++で静的変数を使用していません。だから、インスタンス 'inst'は' GetInstance() 'が初めて呼び出されたときに一度だけ作成され、それ以降の呼び出しごとに再利用されますか?また、コンストラクタに渡すパラメータも使用できますか?パラメータが変わるとどうなりますか?新しいインスタンスが作成されますが、2回の呼び出しで同じ状態を維持すれば、古いインスタンスが再利用されますか? –

1

あなたも、機能を必要としません:にDllMainが実行される前に

class MyThingy 
{ 
} my_global_thingy; 

my_global_thingyは、プログラムの起動時にインスタンス化されます。

+0

ああ、私はそれについて考えなかった!また非常に興味深い。私はデフォルトのコンストラクタが使用されていると思いますか?私は別のものを呼ぶこともできますか? –

+0

@Felix:はい、デフォルトのctorが呼び出されます。いいえ、私はそれを書いた方法で別のものを呼び出すことはできません。 –

+0

DllMainを実行する前に?私はあなたがC/C++のmain()関数と混同していると思います。 DLL/EXEがロードされると、OSはDllMain/WinMainを起動します。 –

関連する問題