返回首页

分号是从微软的Visual C网产品经理一个新的每月专栏 - 我们自己的尼克Hodapp。列拟直接线,以微软为你问这些问题,没有其他人可以回答。如果你曾经想知道内部的阴谋的VC编译器,或曾想以知道为什么一个特定的设计决定是的,或者想的内情,卷曲的Visual C问题已stumping你再在这里发表您的问题。每期将覆盖最好的或最有趣的问题。规则很简单:很有趣,使有关Visual C,永远不提的Visual Basic。
{S0}我有一些不幸的消息和一些高兴的消息。你肯定知道现在,微软发布的Visual C风口浪尖上。NET 2003的吗??有很多伟大的新功能,包括ISO C的一致性和支持Windows窗体的10周年纪念版。这一不幸的消息是,我们最近发现了一个错误的产品,我们是无法修复之前释放。虽然这个错误并不影响每一个用户,甚至一半以上的用户,微软正在采取这种担忧严重,以解决C开发人员的需求。高兴的消息是,我们发现的bug,并提供一个永久性的解决方案是一个临时的解决方法修复,直到的。
弦oader锁的问题??只影响使用混合模式的装配特征的C语言开发。它有可能导致在非常特殊的情况下的应用程序死锁。它不涉及到Visual C开发人员编写严格的MFC,ATL,甚至传统的Win32代码。它不涉及到C#或Visual Basic开发人员,因为他们没有向他们提供这样的功能。
重要的是要注意的bug,而微软则重视这个问题,其实表面很经常和影响只有在非常特殊的情况下开发。我想告诉你,让你可以了解它是否会影响你和你的程序的bug。这个文本是不打算成为一个完整的技术故障问题。相反,这些话都是一个介绍。 。
如果你是一个C程序员使用Visual C。NET 2002或新的Visual C NET 2003中建立托管组件(集DLL)上运行。NET公共语言运行时(CLR),你的客户之一会影响人。这个bug严格的程序集包含两个原生x86和管理MSIL代码,并在既有的Visual C存在。NET版本2002年和2003年。目前,这不是一个可以由一个服务包处理错误。它的存在是由于建筑的错误。
外部微软很少有客户通知我们被臭虫咬伤。 (我们已经提供了这些客户的信息需要解决的bug。)这是不令人惊讶的bug表面相对较少。然而,在建立强大的应用程序利益,我们鼓励您熟悉自己所建议的解决方法程序和确定它是否应该被应用到你的代码。
国内几个微软的团队现在已经看到的bug清单,只有在涉及严重的系统压力,或在C混合模式已经过数字签名的程序集的测试情景。它把我们的团队三年来发现问题,并认识到其严重性和范围。
错误是不是一个安全级的错误。发生时,它会导致应用程序死锁。
今天的错误很少发生。这是严重的,因为它可能开始更频繁地发生变化是通用语言运行时(CLR),到Windows,或混合模式的组装技术更广泛采用。有些不可预知的错误发生。
如果你是一位经验丰富的Win32的开发人员,你可能会意识到你写的DllMain入口点函数的代码施加的限制。被称为Windows加载程序初始化DLL的DllMain。早已订明的DllMain代码不得调用KERNEL32 API的以外,不得启动线程,不得装载其他DLL等,但在混合模式的DLL有DllMain入口点定义,它很可能会招来一些行动CLR执行DllMain期间,这些非法的API。当发生这种情况的存在潜在的死锁发生。
混合模式的DLL链接到CRT或其他图书馆可能有一个"隐藏"的DllMain。
我们已采取步骤,以便在Visual C NET 2003编译器,以提醒开发人员,他们可能会受到这个问题。如果你试图编译一个混合模式的大会,定义一个DllMain,编译器/链接器将发出警告,称这是一个不安全的做法,大会应与使用"/ NOENTRY"开关。当然,如果大会链接到C运行时(一个很常见的场景),指定"/ NOENTRY"正在排放的第二个警告的影响。这一警告的圆形设计,并打算以指向文档的开发,关于这个问题,需要正确的步骤。警告消息本身包含链接到相应的文档。
解决方法步骤涉及到您的应用程序代码的变化。您将有编译/ NOENTRY您的程序集DLL项目,你将不得不运行您的DLL的DllMain函数比其他初始化代码。此错误的技术文档描述了需要采取的具体步骤。
虽然此修复程序相对简单,是因为它涉及到几个不同的技术,包括C编译器和CLR的建筑变化的原因,我们无法实施一个完整的修复在Visual C NET 2003。这在我们的产品周期后期这种变化会产生的涟漪,将有可能破坏释放的其他功能,并造成了重大的的延误。由于这个错误是本地化。NET开发人员,进一步C语言开发的一个子集的一个子集,我们已经决定继续航运的问题。在我们眼中,这些解决方法的步骤是不理想,但应该足以在紧要关头的情况下,我们英寸这里甚至是更好的消息:我们打算在接下来的主要版本的Visual C实现一个更开胃的修复,这将涉及不准从以往执行过程中的Dl​​lMain(编译器和CLR执行)的任何托管代码。此修复程序,一些额外的细节,将正确的问题完全。现在准备好您的的应用程序,该建议是从来没有建筑师或写在DllMain中明确托管代码。一个新锟standard? - ?切入点,将发明专初始化托管代码和数据。
我锟m确保现在你们中许多人想知道什么设置任何其他的bug这个bug除了你锟v个人曾经在微软产品中遇到。为什么wouldn锟t微软只是静静地释放有关错误的文件,并让开发人员图自己的这一切呢?原因之一,这是真正的一个锟compiler错误??一些开发商快速跳转到的结论是,在他们的应用程序的一个错误,其实是由于一个锟compiler错误??有时,这原来是真实的,但大部分时间是ISN锟t。但它是真正的痛苦时,有一个编译器错误,特别是如果你锟rE的那些开发人员之一ISN锟t容易怀疑的工具集。加载程序锁的问题是一个编译器级的错误,我们不锟t想你失去任何睡眠。修复您的代码来变通解决的是什么,无可否认,我们的问题,然后继续前进。
其次,我认为这是一个很好的机会,提醒一下,往往忽略了有关的规则写在DllMain中的代码C语言开发。如果微软锟s自己的建筑师和开发商不经意地忽视这些规则,那么我锟l升敢打赌,你们中的一些有太多。
这说,我要你花15分钟到),和b)检查自己的应用程序锟s的DllMain()函数。如果您发现有问题的代码,如果固定,纠正了在应用程序中的已知的错误,让我知道。使故事有趣的是,我锟l升送你一件T恤。
的功课第二件,而这一切的点,是一个)阅读和了解有关此错误的技术文档,B),确定它是否会影响你的代码C)修复它,如果它。
由于您锟v个人阅读这远,我锟绦想现在转,使代表继续和新的混合模式的装配功能的使用很短的呼吁。正如我锟v个人指出,在以前的1200字的功能也有一个bug,需要特别注意避免。渲染功能无用的呢?你应该避免创建本机/托管的组件,在C?这两个问题的答案是锟nØ?呢?
此功能的主要动力是使现有的基于C的应用完全托管的应用程序的整合,使现有的C库是从托管代码调用。其次它使您可以扩展现有的C代码的生命和功能,使托管库的无缝消费呢??C语言开发,6年前开始在纯粹的Win32应用程序消耗COM和ActiveX组件的方式。有太多的宝贵的前忽视的。NET Framework中的类和接口。如果你锟r个人,为第三件(额外)的功课,我挑战你通过一个有趣的类的。NET Framework文档扫描,然后在C程序中消耗类。非常强大的技术,是吗?
我希望你赢锟t写使用此功能关闭,只是因为它有一个污点。
分号是在3个月的沉寂这个冬天,我不希望它消失了这么久再次。我锟绦爱有更积极的东西,谈下一次,所以如果你有任何燃烧的问题,你锟绦像我写的一切手段,向他们发送我的方式。

回答

评论会员:JudexOmnium 时间:2011/11/29
我觉得我有一个很好的问题,认股权证"分号"的文章。让我给你一些背景。现在的问题是在最后一段。我知道这是不是认为"良好的写作实践",但你真正需要的背景前,将意义。

我工作的一个大型的医疗保健公司。我们有/有不少不同的应用程序,我们已经把下一个应用程序(主机)。这台主机,实现了一个自定义的接口提供的通用功能,所有独立的应用程序使用。每个自定义的应用程序还必须实现一个客户端接口,允许主机线。
这个过程是这样的。
1)主机启动。
2)主机看起来,在"客户"对所有的DLL和EXE文件嵌入typelibs子目录 3)主机CoCreates它发现的任何coclass的客户端界面查询。
4)如果存在的客户端接口,主机调用wireup方法,它的主机接口传递到客户端。5)客户端和主机现在可以互相交谈

一旦客户端已经载入到主机,客户端可以调用的方法添加主机的MS Access工具栏和按钮。这是实施WTL的CPaneContainer类和一些自定义的模板类垂直TabStrip的访问。这TabStrip的存在向下左侧的框架,并从右侧的框架分开,由一个分路控制。然后主机通过新添加的按钮单击事件处理客户端。客户端还可以获取一组通用接口,实现共同的业务逻辑,由主机提供。

主机也实现了就地激活接口,允许ActiveX控件运行在其内部。客户端可以告诉主机CoCreate的一个ActiveX控件并将其添加到Visual Studio中,像"选项卡,沿分离器的右侧顶部地带。 ActiveX控件可以共享菜单和工具栏添加到主机使用IOleInPlace ***接口。

在大多数情况下,客户端主机的左侧向下滑动tabstrips,他们添加的工具栏。工具栏上的按钮被点击时,客户告诉主机加载和就地激活一个特定的ActiveX控件包含应用程序的功能。所有这三个主机/帧,客户端,和ActiveX控制共同努力,提供用户与他们的经验

这已经相当不错,但我想能够增加运行的能力。NET控件在主机以及。我已经张贴就地激活和唯一的答案,我已经收到了关于如何。NET中涉及的几个问题是,它不能这样做。如果Internet Explorer虽然可以做到这一点,那么我可以。基本上,所有我想要做的的就是添加运行的能力。NET控件的地方,在我的主机/帧ActiveX控件。我应该如何去解决这一个呢?

布赖恩
评论会员:约亨Kalmbach 时间:2011/11/29
您好,

你忘了提到的解决方法,即使不是100%解决这个错误...

欲了解更多信息,请参阅:
]混合DLL加载问题的文章:
"此外,即使DLL的联系与/ NOENTRY选项可能对公共语言运行库版本1.0和1.1的僵局。"因此,由于装载机在公共语言运行库版本1.0和1.1的方式,僵局的情况下都始终与混合DLL,即使他们往往在实践中相当罕见。这个最糟糕的是,发生在大多数系统上工作,混合DLL就可以开始死锁,如果系统是强调,图像符号(因为安全功能需要更多的托管代码运行在装配过程中负载),安装到钩子系统,或通过服务包或新版本的运行时更改的行为。总之,这是一个严重的问题,必须解决所有混合DLL。此外,公共语言运行库加载器1.0版和1.1的实施可能会遇到僵局的情况下,如非托管DLL时,出口或托管的VTable调整信息(VTFixups)是一个混合DLL的一部分,即使指定链接器选项/ NOENTRY。这些问题应固定在运行时的下一个版本,但目前没有什么可以做,以彻底消除在版本1.0和1.1通用语言运行时与非托管的出口和使用Visual C的非托管的VTFixups相关死锁风险。NET 2002年或Visual C NET 2003。这些具体的僵局风险,不应该存在的下一个版本的运行时上运行时相同的图像。因此,微软建议,非托管的出口和非托管VTFixups不受到不必要的从图像中删除,除非死锁的情况是经验丰富。

评论会员:Trollslayer 时间:2011/11/29
。进行了明确,以及奠定了文章
它作为一个新手的。NET等不影响我,但很好看如何处理情况已经。

伊莱恩{S2}

{A} {S3}
评论会员:rsalesas 时间:2011/11/29
这个问题也影响到出口的IL代码?也就是说,编译IL但纯粹的vtable项的IL出口的一个库?

- RS
评论会员:CRIUS 时间:2011/11/29
在DOS应用程序,你可以带来的属性,并改变字体大小,字体等,并适用于当前窗口。这些变化作出的飞行。

现在,我已经用C语言编写一个DOS应用程序,需要改变其字体,当某一个菜单选项被选中。我怎样才能做到这一点,并适用于飞的变化呢?

我以前发布的这个同样的问题在其他地方,有人告诉我不得不使用PostMessage模拟用户点击所有的按钮(这还带来了对话框)... ...基本上是一片狼藉的解决方案,我不是愿意跟随。必须有另一种方式〜〜〜?
评论会员:谢伊Erlichmen 时间:2011/11/29
您好,

静态构造函数/析构函数的对象将导致你将有一些DllMain中的排序。 (不要让我多么糟糕的C运行时,开始)
我是否需要承担静态对象(NET混合模式),每个项目可以有一个bug?

评论会员:ferdo 时间:2011/11/29
当你混合DLL加载,因为这些静态对象必须得到链接,和未加载的CLR,CLR DLL也加载英寸这将导致的错误,因为托管代码运行
上的DllMain。
您必须确保,CLR运行混合DLL加载时,应管理的混合DLL的第一个切入点。从这个托管调用,您可以使用IJW来初始化静态对象。


评论会员:迈克尔梳子 时间:2011/11/29
这是不正确的的。这是从来没有安全的混合DLL的入口点。不要紧,CLR是否已经加载。

由于静态和全局的初始化是由所谓的DLL入口点函数(__DllMainCRTStartup),,简单地添加静态或全局到您的混合DLL项目是一个潜在的问题

静态对象是使用/ clr编译器选项编译每个DLL应使用的知识库文章中描述的解决方法。否则,该DLL可能会遇到死锁情况。
评论会员:克里斯蒙德 时间:2011/11/29
虽然这个bug可能会不会影响我。 (著名的遗言)
我觉得它的伟大,你们是承认它,并试图承担责任。通过编译器警告的步骤也使很多意义,我,是一个很好的办法,采取。

Regardz
科林J戴维斯 100.9197编号:科林 我猜2个小时的电影的概念,呈现出两个家伙吃了一顿,并谈论的印象是"洋"
他们 罗布曼德尔森写道:
评论会员:尼克-帕克 时间:2011/11/29

我有一个问题关于托管C使用非托管C和之间的桥梁。。NET

我在更新老龄化生产的软件基础设施与的过程中。NET解决方案。我慢慢地在生产流程中的软件转换和更换。但是,在有些情况下,我不得不整合。NET程序集与现有的VC 6中的代码。在许多情况下,我一直在使用托管的C,C#或VB.NET集会的桥梁。我只是这是我从我现有的VC 6中的代码调用托管的C DLL导出功能。我可以从托管的C DLL然后我的。NET程序集的过程中获得的。我发现,虽然我不能调用托管的C DLL时,使用现有的VC 6中的代码的发布版本。我得到一个错误,指示,无法加载mscorwks.dll。如果我使用的遗留代码,我的解决方案已的调试版本,那么一切都很好。这不是一个特别紧迫的问题,但为什么任何建议,发生这种情况呢?

在此先感谢,
迈克尔梳子
评论会员:迈克尔梳子 时间:2011/11/29

是不是因为释放模式托管DLL在缓存中失踪,而它预计将有强命名?最近,这些问题的提出和解决一些人。看看这里

- 9:54(星期二)2005年10月,11
修改
评论会员:NishantS 时间:2011/11/29
哼哼。 methinks我可能是借贷,表情{S4}
设计
欢呼声中,
克里斯蒙德
评论会员:基督教Graus 时间:2011/11/29
克里斯蒙德写道:
哼哼。 methinks我可能是借贷,表情
设计
不能等待看到一些新的表情符号,你真的鄙视睡眠不你。 {五}

尼克 - 帕克

评论会员:NishantS 时间:2011/11/29
我不能完全图OTU应该是什么。

邪恶的笑容和拥抱是姗姗来迟。 {S4}的

安娜{S2}


评论会员:克里斯蒙德 时间:2011/11/29

在GAC中,我描述的情况下需要它吗?托管DLL引用的C#和VB组件通过GAC中,并托管DLL在本地,而不是简单地称为非托管的可执行文件,通过导出函数

感谢您的帮助,
迈克尔梳子
评论会员:ferdo 时间:2011/11/29
Hmmmm

作为一个人谁使用MFC,MC和有时两者同时我想我是属于受影响的人,小miniroty这篇文章中谈到。我记得几个月前我如何使用托管扩展与全局钩子DLL的一些怪异的麻烦。我不记得确切的问题,但我现在想知道,如果这是有关此错误。

不管怎样,谢谢尼克。

的问候,
Nish

p.s.我会八九不离十绑至四月结束与一些其他工作,所以我很安全,直到然后八九不离十。之后,我打算潜入深回所有这些东西{S9的}那么也许你会从我这里得到更体面的反馈。这是现在我可以

作者的浪漫喜剧
夏爱和一些更多的板球[新视窗] 审查Shog9
评论会员:贾尔斯 时间:2011/11/29
你打赌,Nish。我很乐意看到您发表的文章展示如何应用程序,我们的处方你以前的努力之一。我们将在MSDN上发布一些样品,但我真的觉得它会很高兴地看到与CP的文章的过程中您的见解...

尼克

这张贴是提供AS是什么??无担保,并授予任何权利。您为您的使用承担所有风险。漏2003微软公司。
保留所有权利。
评论会员:杰里米猎鹰 时间:2011/11/29
这就是你得到的六人全球傻了足够的追求MC之一:P


基督教

无论多么大的是字的大小,数据MUCT被运送到CPU。 - 维诺德夏尔马

Anonymous写:
确定。我读的C书。或者... ...反正它的一个位。
我生病​​邪恶的控制台窗口。
我认为你是一个很好的候选人为Visual Basic。 - 维迪奇Trifunovic