21

我尝试迁移的 MFC 应用程序使用afxext.h,这会导致_AFXDLL设置,如果我设置会导致此错误/MT

请为 _AFXDLL 构建使用 /MD 开关

迄今为止,我的研究表明,使用 Visual Studio(在本例中为 C++)2005 构建在 Windows NT 4.0 上执行的应用程序是不可能的。

这是真的吗?有没有可用的解决方法?

4

5 回答 5

9

不,有许多使用 VS2005 构建的应用程序必须支持 Windows XP、2000、NT 以及整个堆栈。问题是(默认情况下)VS2005 想要使用 NT 上不存在的库/导出。

有关一些背景信息,请参阅此线程

然后开始通过预处理器宏限制您的依赖关系,并避免使用 NT 不支持的 API。

于 2008-08-03T16:54:12.277 回答
4

为了摆脱 _AFXDLL 错误,您是否尝试更改设置以使用 MFC 作为静态库而不是 DLL?这类似于您在将运行时库更改为静态而不是 DLL 时已经在做的事情。

于 2008-08-23T01:16:26.200 回答
3

解决方法是修复多线程 DLL。简单的说明。简短的摘要:

出厂的 8.0 C 运行时库 DLL (MSVCR80.DLL) 不支持 NT 4.0 SP6 的原因有一个:微软的某个人添加了一个GetLongPathNameW在 NT 4.0 上的 kernel32.dll 中不存在的函数调用。

CRTLIB.C 在第 577 行,调用了GetLongPathNameW. 只需将其替换为:ret = 0; 仅在 NT 4.0 上使用此版本的 MSVCR80.DLL。

一旦你得到这些工作,想出一个更通用的解决方案应该是微不足道的。

于 2008-10-14T12:32:59.617 回答
1

虽然我不熟悉 afxext.h,但我想知道它是什么使它与 Windows NT4 不兼容......

但是,要回答最初的问题:“我迄今为止的研究表明,使用 Visual Studio(在本例中为 C++)2005 构建在 Windows NT 4.0 上执行的应用程序是不可能的。”

答案应该是肯定的,特别是如果应用程序最初是在 NT4 上编写或运行的!除了 afxext.h 之外,这应该很容易。

我发现麻烦的另一件事是人们抛弃 NT 术语的松散性质。诚然,大多数人认为“NT”是 Windows NT4,但它仍然含糊不清,因为“大多数人”不等于“所有人”。

实际上,“NT”一词等同于 NT 系列。NT系列是NT3、NT4、NT5(2000、XP、2003)和NT6(Vista)。

Win32 是一个子系统,您也可以针对您的 C/C++ 代码。所以我认为没有理由不能针对这个 NT4 平台和子系统,或者,如果这是一个平台移植练习,请删除 VC 可能强加的 MFC 依赖项。

将 afxext.h 添加到混合中,这听起来像是子系统兼容性问题。它是我 Google 研究中 MFC 的一部分。afxext.h 似乎是 MFC(Microsoft 基础类)扩展。

你能去掉你对 MFC 的依赖吗?这是什么类型的应用程序?(CLR、服务、GUI 界面?)您可以在 VC 8.0 中将项目转换为非托管 C++ 项目吗?

希望其中一些对您有所帮助。

于 2008-09-18T16:18:02.307 回答
-1

这个想法是需要exe链接到静态库。

请尝试此“配置属性”、“常规”、“MFC 的使用”到“在静态库中使用 MFC”“配置属性”、“常规”、“ATL 的使用”到“ATL 的静态链接”

“配置属性”、“C\C++”、“代码生成”、“运行时库”到“多线程 (\MT)”

测试平台构建机器:Window XP SP2 上的 Visual Studio 2005 客户端机器:Window XP SP2(未安装 VS2005)

于 2008-11-20T23:04:42.693 回答