在Win7上出现“尝试读取或写入受保护的内存”错误 - ActiveX控件失败。

4
我们有一个使用旧的包装ActiveX控件(VSPrinter 8 from ComponentOne, 具体来说是 vsprint8.ocx)的Windows应用程序(.net, VS2010)。这个控件处理我们所有的打印和打印预览。当我们将我们的应用程序部署和运行到VM上的一个新实例(32位),并尝试调用此控件时,会收到以下错误信息:
“Attempted to read or write protected memory. This is often an indication that other memory is corrupt.”
在Windows XP上仍然可以正常工作。有趣的是,如果我们在目标VM上关闭DEP(系统范围内,设置为AlwaysOff),应用程序就可以正常工作。但如果我们仅在使用ocx的可执行文件上关闭DEP,则无法正常工作。
有什么想法吗?谢谢!
1个回答

5

找到了解决方案。

我无法有效地关闭目标可执行文件中的DEP,因此我在VS2010的后期构建事件命令行中添加了以下行,这解决了我的问题:

call "$(DevEnvDir)\..\..\VC\bin\vcvars32.bat"
call "$(DevEnvDir)\..\..\VC\bin\editbin.exe" /NXCOMPAT:NO "$(TargetPath)"

在VS解决方案资源管理器中,右键单击解决方案下的项目,选择属性,然后点击构建事件。您会看到“后期生成事件命令行:”文本框,这是您将以上内容插入其中的地方。
这有效地禁用了我的应用程序的DEP。这是帮助我看到光明的博客文章。谢谢,陌生人! http://jtstroup.net/post/Attempted-to-read-or-write-protected-memory-This-is-often-an-indication-that-other-memory-is-corrupt.aspx

1
不要忘记将你的答案接受为问题的答案。;> - dthorpe
1
TFS Team Build服务器出现了另一个有趣的问题。Msbuild无法解析(DevEnvDir)Visual Studio环境变量,导致持续集成构建失败。为了解决这个问题,我们添加了一个系统级环境变量来设置全局的DevEnvDir值。在x64上,DevEnvDir的值为"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE",在32位上,DevEnvDir的值为"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE"。这似乎有点hacky,但它起作用了。 - Booberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接