关闭

基于odb的dll在xp系统下动态加载运行异常的原因及解决方法

标签: odbxp动态加载dllcc++数据库xp
248人阅读 评论(2) 收藏 举报
分类:

在开发过程中发现基于odb orm框架的一个数据库访问控制dll在xp系统下动态加载运行异常,经过测试、查阅资料找到了原因及解决方案,现记录如下:

原因:

在odb中tls.hxx文件中有一个宏定义

#  ifdef ODB_THREADS_TLS_DECLSPEC
#    define ODB_TLS_POINTER(type) __declspec(thread) type*

其中有
__declspec(thread)
查阅资料发现,此句在xp及以下系统中,动态加载dll时会出现异常,msdn是这样描述的:

  • On XP systems, thread may not function correctly if a DLL uses __declspec(thread) data and it is loaded dynamically via LoadLibrary.

更多内容参见:https://msdn.microsoft.com/en-us/library/9w1sdazb.aspx

这就是使用odb后不能在xp系统下动态加载dll运行的原因。

解决方案:

在odb中,找到文件

odb\details\config-vc.h

将里面的 ODB_THREADS_TLS_DECLSPEC 宏注释之,然后重新编译所用到的odb相关文件。

至此,如果是以dll的方式使用odb,则应该是可以在xp系统下运行了。

不过我当时是以静态库的方式使用odb,修改完后不但不能在win xp运行,连win 7也不行了,后来在看了Boris的邮件后才明白问题所在。修改为dll形式调用后解决,Boris还说了另一种方式,In your case, the easiest will probably be to replicate the calls found in libodb/odb/details/win32/dll.cxx in your DynLib.dll's DllMain().。

邮件列表:http://www.codesynthesis.com/pipermail/odb-users/2016-June/003322.html

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6159次
    • 积分:143
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论