是否可以在加载(或卸载)库时立即执行的共享库(Windows上的.dll和Linux上的.so)中创建函数?
就像main()函数是可执行文件的入口点一样,我可以定义一个在加载或卸载DLL时执行的函数吗?
E.g:
void _atstart()
{
// Initialize some stuff needed by the library
}
void _atexit()
{
// Release some allocated resources
}
我想我已经在某个地方看到了这样的例子,但我再也找不到了,在互联网上找不到任何关于此事的内容。
如果有任何用处,我正在用MinGW编译代码。
答案 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()版本。