【问题标题】:Problem in hosting ActiveX on Vista (in a Visual Studio 6 C++ application) II在 Vista 上托管 ActiveX 的问题(在 Visual Studio 6 C++ 应用程序中)II
【发布时间】:2010-11-14 16:05:07
【问题描述】:

(自从我现在以用户身份注册后,我将重新发布此消息)

我刚刚在 Vista Enterprise 机器上安装了 Visual Studio 6 (SP5)。有一些问题,但我认为它设置得很好。

问题是我的 VC++ 6 应用程序在尝试托管 ActiveX 时失败。我能够编译它,但从 Vista 收到有关 rc.exe 的警告消息(“该程序存在已知的兼容性问题”)。

当我调试它时,我看到我的从 CAxDialogImpl 派生的类在它的 Create() 方法上失败了。相同的应用程序在 XP 上运行良好!

是否存在已知的兼容性问题?

一些技术信息:我看到 CAxDialogImpl::Create()(我在这里传递 NULL)调用 AtlAxCreateDialogA,而后者又调用 CreateDialogIndirectParama,这会引发一般异常。

非常感谢,埃里克

PS - 1. 我是我机器上的管理员。操作系统是 32 位的。 2. 我知道Vista不支持VS6,但我别无选择,因为我在尝试将它迁移到VS 2008时遇到了麻烦。

【问题讨论】:

  • 更新:当我的 dll(我的 Visual C++ 应用程序实际上是一个 dll)被 com 应用程序调用时它可以工作,但是当它被 .Net 应用程序调用时它会失败。

标签: visual-c++ com windows-vista activex atl


【解决方案1】:

好的。 找到了原因和解决办法。

这似乎是 DEP 兼容性问题。 很难找到,因为应用程序失败时没有显示异常/消息。

问题是由于我的 dll 中使用了旧的 ATL 组件引起的。 旧版本的 ATL 在运行时生成机器代码,然后尝试从未标记为可执行的内存页面中执行此代码,因此如果启用了硬件强制 DEP,则会导致 DEP 冲突。

我的XP机器和vista机器的区别其实是在DEP操作上——vista上的DEP是基于硬件的,导致了这个问题。

此外,我的 COM 应用程序使用相同的 dll 并且工作正常,但是 .Net 应用程序失败了,因为它们是使用 DEP 兼容性标志创建的。

解决方案是从 .Net 应用程序中删除 DEP 兼容性标志。

干杯, 埃里克

PS - 两个链接非常有帮助: http://support.microsoft.com/kb/948468 How to make my program DEP-compatible?

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2012-11-22
    • 2018-02-15
    相关资源
    最近更新 更多