【问题标题】:Convert LPTSTR to long [closed]将 LPTSTR 转换为长 [关闭]
【发布时间】:2023-03-26 05:30:01
【问题描述】:

我在尝试初始化长变量时遇到编译错误。

long return_val;

HKEY register_key;
LPTSTR REGISTRY_KEY_FM = 
#if FDK_LIBRARY_VERSION==0x13000000
            _T("RL13.FR.Document");
#elif FDK_LIBRARY_VERSION==0x09000000
            _T("RL9.FR.Document");
#elif FDK_LIBRARY_VERSION==0x08000000
            _T("RL80.FR.Document");
#endif


return_val = HKEY_CLASSES_ROOT, REGISTRY_KEY_FM, 0, KEY_QUERY_VALUE, &register_key);

最后一行的错误信息是“类型为“long”的值不能用于初始化LPTSTR类型的实体”

我正在使用 Visual Studio 2017,也尝试使用 Visual Studio 2013,但错误相同。但是在 VS 2010 中没有收到消息。VS 2013 和 VS2017 的编译器是否存在一些类型转换问题?如何克服这个问题?

【问题讨论】:

  • 请发布一个最小、完整且可验证的示例 - stackoverflow.com/help/mcve
  • return_val = HKEY_CLASSES_ROOT, REGISTRY_KEY_FM, 0, KEY_QUERY_VALUE, &register_key); 对我来说没有意义。我假设您缺少该行的某些部分。
  • T 之类的 LPTSTR_T 在 1990 年代支持 Windows 9x。除了您的工具无法为那些古老的 Windows 版本生成可执行文件之外,T 的东西在 2000 年就已经过时了,因为引入了 Unicode 层。所以你使用了 17 年过时的技术,现在完全没有意义,因为你的工具无法创建这样的可执行文件。使用这些东西有成本:更冗长的代码和更脆弱的代码。所以不要。
  • Re“在 VS 2010 中没有收到消息”,因为你有 不匹配的括号它不能用 VS 2010 编译。看来你错过了一个函数调用.这是你展示的真实代码吗?
  • 另外,string literals shouldn't be assigned to non-const pointerLPTSTRTCHAR* 的类型定义)。所以你应该写LPCTSTR REGISTRY_KEY_FM =(注意类型中的“C”表示指向的数据的常量)或者更好的LPCWSTR REGISTRY_KEY_FM,并用L"string"替换_T("string"),正如Cheers所解释的那样。

标签: c++ c winapi


【解决方案1】:

您的预处理器调度缺少#else。当库版本无法识别时,您会得到以下结果:

LPTSTR REGISTRY_KEY_FM = return_val = /* something */;

并尝试使用 long 类型的值初始化 LPTSTR

当你为新的库版本添加 typeid 时,还要添加这些行以防止将来出现此类问题:

#else
#error Unsupported FDK_LIBRARY_VERSION

【讨论】:

  • 谢谢,你是对的。我错过了else 声明。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2012-03-17
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多