1

首先让我说我负责创建和管理构建和安装,而且我不是 C++ 开发人员,所以下面的大多数错误对我来说都是不可理解的。

话虽如此,开发人员(现在不在)签入了一些在 Debug|Win32(使用 VS08)中编译良好的代码,但我需要让它在 Unicode Release MinDependency|Win32 中编译。

有 88 个错误,但似乎都归结为“转换”问题,而且都只是下面列出的问题的多次出现。

  • 编译错误是否与它的编码方式(C++、ATL)有关?

  • 是否有一些编译选项开关或 VS 设置我可以更改以使其编译为 MinDep?

  • 是否有简要解释导致此问题的原因,以便我了解手头的问题?

错误:

cannot convert from 'unsigned short *' to 'ATL::CComBSTR'
cannot convert from 'wchar_t *' to 'unsigned short *'
cannot convert parameter 1 from 'unsigned short *' to 'wchar_t *'
cannot convert parameter 1 from 'LPWSTR' to 'const unsigned short *'
cannot convert parameter 2 from 'BSTR' to 'const unsigned short *'
cannot convert parameter 2 from 'LPWSTR' to 'const unsigned short *'
none of the 2 overloads could convert all the argument types
cannot convert parameter 1 from 'unsigned short *' to 'const OLECHAR *'
cannot convert parameter 1 from 'unsigned short [4096]' to 'wchar_t *'
4

3 回答 3

4

问题是代码写得不好。开发人员对在 Unicode 中编译时不成立的字符和整数类型做出了假设。问题不在于 Visual C++、ATL 或 Visual Studio。

显然,您可以使用编译器开关来使其编译,因为这可能是 Debug 和 Unicode Release Mindependency 版本之间的主要区别。但是,您不想切换它,因为这意味着您不再执行实际的 Unicode Release Mindependency 构建。

您会注意到,您的每条转换消息都介于unsigned short *(指向特定整数类型的指针)和字符串的某种表示之间。在正确编写的 C++ 中,您不会到处在整数类型和字符类型之间进行转换。可能有必要这样做,例如在处理遗留代码时,但它是潜在问题的根源,需要仔细观察。

您需要重写此代码。您说开发人员不在身边(可能是因为做这样的事情而被解雇?),所以您必须让另一个开发人员来修复它。

于 2009-07-31T18:13:00.923 回答
1

在 Visual Studio IDE(此处假定为 2008)中有几个地方可以检查在调试和发布版本中是否具有相同的设置:

项目属性 -> 常规 -> 字符集(设置为 Use Unicode Character Set )

项目属性 -> C/C++ -> 语言 -> 将 wchar_t 视为内置类型(通常设置为 Yes )

项目属性 -> C/C++ -> 命令行 - 你应该看到定义了 UNICODE 和 _UNICODE

如果这些设置在两个版本中都相同 - 它可能会变得更糟,因为它可能由于条件编译而发生,并且在那里它取决于他正在使用的特定库或他的代码。

您可以在此处阅读http://msdn.microsoft.com/en-us/library/xt153e2k(VS.71).aspx,了解 MinDependency 的含义。它实际上是 ATL 关于如何链接 crt 的定义。

请注意, wchar_t 被定义为 unsigned short - 所以它只是缺少那里的定义 - 不是如上所述的实际转换错误。我没有 VC 6 来测试它,但在 VC9 下它是这样的:

#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif
于 2009-07-31T18:12:44.077 回答
-1

这些错误看起来都与字符串相关。有人可能在发布模式下的调试模式下启用/禁用了 unicode 和/或宽字符串。尝试在 Visual Studio 的发布模式设置中翻转这些设置,看看它是否可以编译。或者,检查发布和调试模式之间的所有设置匹配。

于 2009-07-31T18:01:59.933 回答