创建DLL的两个疑难问题

Muf 2004-01-06 05:57:36
问题描述:
使用VC7.1创建DLL,其代码必须使用非托管的库,并且包装给托管程序使用。
在程序中使用了非托管的全局类(含有析构函数);在托管代码中需多次调用new创建非托管结构。

1. 在VC7.1中,MSDN建议修改链接选项,以使用/NOENTRY,据说是因为DllMain有某种局限性,有可能使DLL不能正确运行。其警告信息为:
LINK : warning LNK4243: 包含用 /clr 编译的对象的 DLL 在链接时没有使用 /NOENTRY;映像可能无法正确运行

请问,为什么映象可能无法正确运行,在什么情况下会不正确运行?

2. 使用MSDN的建议进行修改,使用手动调用__crt_dll_initialize()和__crt_dll_terminate()函数;但在使用中发现,当在托管函数中调用new来创建非托管结构时,会出现StackOverflow例外!!(new int则不会),这是什么原因,应该如何解决?
同样的代码,在不按建议(即不使用/NOENTRY编译选项)时,不会出问题。
...全文
48 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodseener 2004-01-14
  • 打赏
  • 举报
回复
我也遇到过同样的问题非托管的库被托管方式的exe调用是有问题的
wangweixing2000 2004-01-13
  • 打赏
  • 举报
回复
gz...
Muf 2004-01-09
  • 打赏
  • 举报
回复
Up
Muf 2004-01-07
  • 打赏
  • 举报
回复
Ok,第二个问题已解决。
__crt_dll_initialize(),所有的dll都必需调用。只要有一个dll没有调用,则该dll就会出现问题。

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧