3

ライブラリがロード (またはアンロード) されたときに実行される共有ライブラリ (Windows では .dll、Linux では .so) に関数を作成することはできますか?

main() 関数が実行可能ファイルのエントリ ポイントであるように、DLL がロードまたはアンロードされたときに実行する関数を定義できますか?

例えば:

void _atstart()
{
    // Initialize some stuff needed by the library
}

void _atexit()
{
    // Release some allocated resources
}

そのような例をどこかで見たことがあると思いますが、それ以上見つけることができず、これについてインターネット上で何も見つけることができませんでした.

役に立つ場合は、MinGW でコードをコンパイルしています。

4

4 に答える 4

5

C++ では、少なくともいくつかのクラスのグローバル インスタンスを作成できます。

class ResourceHolder {
public:
    ResourceHolder() {
        // at start
    }

    ~ResourceHolder() {
        // at exit
    }
};

ResourceHolder theHolder;

ただし、ライブラリで別のグローバル変数を使用する場合は、注意が必要です。

于 2012-07-09T11:36:53.210 に答える
3

使用できるウィンドウの場合DllMain

BOOL WINAPI DllMain(
  __in  HINSTANCE hinstDLL,
  __in  DWORD fdwReason,
  __in  LPVOID lpvReserved
);

2 番目のパラメーターfdwReasonは、ライブラリーをロードするかアンロードするかを指定します。完全なリファレンス: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        // code for library load
        break;
    case DLL_PROCESS_DETACH:
        // code for library unload
        break;
    }
    return (TRUE);
}

Linux の場合、以下を使用できる場合があります。

__attribute__ ((constructor))
__attribute__ ((destructor)) 

しかし、これはグーグル検索の後にのみ出てきたので、自分で調査する必要があります - http://tdistler.com/2007/10/05/implementing-dllmain-in-a-linux-shared-library

于 2012-07-09T11:33:21.720 に答える
0

Windowsでは、独自のバージョンのDllMain()を作成できます。

于 2012-07-09T11:33:30.367 に答える