C++ 将LPTSTR转换为long

C++ 将LPTSTR转换为long,c++,c,winapi,C++,C,Winapi,当我试图初始化一个长变量时,我得到了一个编译错误 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

当我试图初始化一个长变量时,我得到了一个编译错误

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中没有得到信息。VS2013和VS2017的编译器是否存在类型转换问题?如何克服此问题?

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

LPTSTR REGISTRY_KEY_FM = return_val = /* something */;
它尝试用long类型的值初始化LPTSTR

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

#else
#error Unsupported FDK_LIBRARY_VERSION

请发布一个最小、完整且可验证的示例-。return\u val=HKEY\u CLASSES\u ROOT、REGISTRY\u KEY\u FM、0、KEY\u QUERY\u VALUE和register\u KEY;对我来说没有意义。我想你错过了这一行的一部分。像LPTSTR和_T这样的东西在20世纪90年代支持windows9x。除了您的工具无法为那些过时的Windows版本生成可执行文件这一事实之外,t的东西在2000年就已经过时了,因为Unicode引入了Layer。所以你使用了17年的过时技术,现在完全没有意义了,因为你的工具不能创建这样的可执行文件。使用这些东西需要付出代价:更冗长的代码和更脆弱的代码。因此,不要在VS 2010中获取该消息,因为您有不匹配的括号,它无法用VS 2010编译。您似乎缺少一个函数调用。这是您正在演示的真实代码吗?此外,LPTSTR是TCHAR*的typedef。因此,您应该编写LPCTSTR REGISTRY_KEY_FM=注意类型中的C,它指示指向的数据的常量,或者更好的LPCWSTR REGISTRY_KEY_FM,并用Lstring替换_Tstring,如Cheers所述。谢谢,您是对的。。我错过了另一份声明。