0

VCL データ モジュールを含む dll を作成しようとしています - さまざまなアプリケーションがすべて同じ dll をロードし、同じデータベース コードを使用できるという考えです。

データ モジュール自体は、アプリケーションの一部として問題なくテストされています。フォームを dll プロジェクトにコピーしました。

したがって、dll エントリ ポイント メソッドでは、データ モジュールを初期化する必要があります。

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    //if I don't call this, I get an exception on initializing the data module
    CoInitialize(NULL);

    //initialize a standard VCL form; seems to works fine
    //I'm not using Application->CreateForm as I don't want the form to appear straight away
    if(!MyForm) MyForm = new TMyForm(Application);

    //this doesn't work - the thread seems to hang in the TDataModule base constructor?
    //I've also tried Application->CreateForm; same result
    if(!MyDataModule) MyDataModule = new TMyDataModule(Application);

}

フォームを作成する前に Application->Initialize を呼び出す必要がある方法についても見ましたが、これは何の違いもないようです。

何か案は?

ありがとう

4

1 に答える 1

0

あなたは本当にあなたの中で非常に多くの仕事をするべきではありませんDllEntryPoint(). とにかく、確かに呼び出していませCoInitialize()ん。ロード時にそれを呼び出すのは DLL の責任ではありません。DLL をロードする前の呼び出し元のアプリの責任です。

次のいずれかを行う必要があります。

  1. 追加の関数をエクスポートして DLL を初期化し、DLL をロードした後にそれをアプリに持たせます (アンロードする前に DLL を初期化解除する場合と同じです)。

  2. DLL が実際にそれらを初めて必要とするまで、TForm/TDataModule を作成しないでください。

  3. TForm/TDataModule を DLL 内の独自のワーカー スレッドに移動します。この場合、次に を呼び出しますCoIniitalize()

Applicationどのような場合でも、 TForm/TDataModule の有効期間を管理するためにDLL のオブジェクトを中継しないでください。DLL がアンロードされる前に、代わりに自分で解放してください。

于 2013-02-27T23:06:20.427 に答える