将 VC++ 应用程序移植到 VS2008 的问题

Posted

技术标签:

【中文标题】将 VC++ 应用程序移植到 VS2008 的问题【英文标题】:Issue in porting VC++ application to VS2008 【发布时间】:2014-04-13 09:34:07 【问题描述】:

我有一个用 VC++ 开发的应用程序,它使用了一个第三方 dll,它也是用 VC++ 开发的 它工作正常,当使用dependency walker检查时,应用程序和dll依赖于MFC42.dll、MSVCRT.dll、MSVCP60.dll等。

应用程序现在移植到 VS2008,调用 dll 的代码没有变化。 调用 DLL 函数后,正常功能可以正常工作

但是在尝试使用 Dialog 调用函数时,例如

MyFunc(void)

handle = AfxGetResourceHandle();
AfxSetResourceHandle(::GetModuleHandle(mydll));
if( myCDialog.DoModal() == IDOK )

/* My Functionality */

AfxSetResourceHandle(handle);

在尝试执行 DoModal 时,MFC42.dll (c0000005) 中出现访问冲突错误。

exe代码很好,因为它可以完美地与用VS2008及更高版本制作的dll一起工作。

【问题讨论】:

【参考方案1】:

当您将应用程序移植到 VC-2008 时,应该不再依赖于 MFC42.DLL。这是来自 VC 6.0 的 MFC DLL。

也许您的 codenow 使用 VC-2008 MFC,但您的库使用 VC 6.0 的 MFC。 如果两者(库和您的代码)共享 MFC 代码,则无法正常工作。

PS:切换开发环境时,请确保您的所有 3rd 方库也支持此环境。可能你只需要一个新的 lib 文件。或者,如果您有需要重建库的源代码。

【讨论】:

【参考方案2】:

我认为您需要使用AFX_MANAGE_STATE(AfxGetStaticModuleState()) 来使MFC 框架能够正确处理资源。

extern "C" void WINAPI MyFunc(void)

  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  if( myCDialog.DoModal() == IDOK )
  
    /* My Functionality */
  

【讨论】:

以上是关于将 VC++ 应用程序移植到 VS2008 的问题的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF 项目从 VS 2008 移植到 2010 时出错

从 VS6 移植到 VS2008 时在不寻常的架构中使用单元测试?

VS2008的32位的程序如何移植到64位的系统,具体操作上的问题

wcstof 添加了哪个版本的VC++

vc6 到 vs2010 移植错误

真的值得从 VC6 -> vc2005,2008 移植吗?