加载DLL不初始化静态C类
发布时间:2020-12-14 04:35:55 所属栏目:Windows 来源:网络整理
导读:我有一个在运行时加载的DLL. DLL依赖于内部工作的静态变量(它是一个std :: map),这个变量在DLL中定义. 当我在加载后从DLL调用第一个函数时,我从DLL获得了一个SegFault,从未初始化地图.从我从DLL加载中读取的所有内容,静态和全局数据初始化应该在调用DLLMain
我有一个在运行时加载的DLL. DLL依赖于内部工作的静态变量(它是一个std :: map),这个变量在DLL中定义.
当我在加载后从DLL调用第一个函数时,我从DLL获得了一个SegFault,从未初始化地图.从我从DLL加载中读取的所有内容,静态和全局数据初始化应该在调用DLLMain之前发生. 为了测试静态初始化,我添加了一个打印出消息的静态结构,甚至还提供了一个断点以便进行测量. static struct a { a(void) { puts("Constructingn"); } }statica; 在DLLMain或函数被调用之前没有消息或中断. 这是我的加载代码: dll = LoadLibrary("NetSim"); //Error Handling ChangeReliability = reinterpret_cast<NetSim::ChangeReliability> (GetProcAddress(dll,"ChangeReliability")); ChangeReliability(100); 我已经验证了dll版本是正确的,多次重建整个项目,但没有区别.我是新鲜的想法.
链接DLL时,是否指定了/ ENTRY开关?如果是这样,它将覆盖链接器的默认值DllMainCRTStartup.因此,不会调用_CRT_INIT,反过来,将不会调用全局初始值设定项,这将导致未初始化的全局(静态)数据.
如果要为自己的入口点指定/ ENTRY,则需要在进程附加和进程分离期间调用_CRT_INIT. 如果未指定/ ENTRY,则链接器应使用CRT的入口点,在调用DllMain之前,在进程附加/分离时调用_CRT_INIT. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Windows – IIS 7.5中应用程序池的CPU限制
- windows-phone-7 – Windows Phone 7上诺基亚蓝的十六进制代
- windows-server-2008 – Windows Server 2008:如何判断用户
- windows上安装MySQL数据库
- .net – 掌上电脑/ Windows Mobile:如何检测智能最小化
- Windows FILETIME结构是否包含闰秒?
- 替换Windows系统自带记事本
- windows – 高级安装程序中的增量版本号
- windows – 为什么ZeroMQ PGM组播接收卡在中间并且没有进一
- 如何在MS Windows上组合Emacs主/剪贴板复制和粘贴行为?
推荐文章
站长推荐
热点阅读