加载/卸载时由共享库执行的代码

时间:2012-07-09 11:29:07

标签: c++ dll shared-libraries

是否可以在加载(或卸载)库时立即执行的共享库(Windows上的.dll和Linux上的.so)中创建函数?

就像main()函数是可执行文件的入口点一样,我可以定义一个在加载或卸载DLL时执行的函数吗?

E.g:

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

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

我想我已经在某个地方看到了这样的例子,但我再也找不到了,在互联网上找不到任何关于此事的内容。

如果有任何用处,我正在用MinGW编译代码。

4 个答案:

答案 0 :(得分:4)

在C ++中,您至少可以创建某个类的全局实例

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

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

ResourceHolder theHolder;

如果您在库中使用其他全局变量,则需要一些意识。

答案 1 :(得分:3)

对于Windows,您可以使用DllMain

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

第二个参数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

答案 2 :(得分:1)

如前所述,在Window下你可以从DllMain开始工作。但要小心你会做什么,因为有很多限制(例如禁止使用COM CoInitialize函数)。你不能依赖的一件事是没有保证装载/卸载dll的顺序是什么,所以你不能调用你的另一个dll所在的DllMain中的函数:它可以今天有效,但不是明天:)

更多在线MSDN: [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx]

帕特里斯

答案 3 :(得分:0)

在Windows下,您可以编写自己的DllMain()版本。

相关问题