Mic*_* J. 4 c++ winapi strsafe visual-studio-2013
我们(错误地)使用StringCbPrintfW来编写数据库查询,该查询在使用逗号作为小数分隔符的任何语言环境中都失败了.修复很容易,对吧?采用语言环境的StringCbPrintf_lW也在strsafe.h中定义.两者都定义如下:
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
Run Code Online (Sandbox Code Playgroud)
所以只需创建语言环境并用StringCbPrintf_lW替换StringCbPrintfW.
Intellisense很高兴,GoToDefinition很高兴,ClCompile不高兴.我一直在
错误C3861:'StringCbPrintf_lW':找不到标识符
有什么想法有什么不对?
标题Strsafe.h定义了有问题的方法,使用两个定义来过滤此函数,如下所示:
#if defined(STRSAFE_LOCALE_FUNCTIONS) && !defined(STRSAFE_NO_CB_FUNCTIONS)
/*++
STDAPI
StringCbPrintf_l(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_params_(2) LPCTSTR pszFormat,
_In_ locale_t locale,
...
);
Routine Description:
This routine is a version of StringCbPrintf that also takes a locale.
Please see notes for StringCbPrintf above.
--*/
#ifdef UNICODE
#pragma region Application Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define StringCbPrintf_l StringCbPrintf_lW
// ...
Run Code Online (Sandbox Code Playgroud)
简而言之,您需要STRSAFE_LOCALE_FUNCTIONS
在包含标题之前进行定义.如:
#define STRSAFE_LOCALE_FUNCTIONS
#ifdef STRSAFE_NO_CB_FUNCTIONS
#pragma message("NO CB FUNCTIONS")
#endif
#include <strsafe.h>
Run Code Online (Sandbox Code Playgroud)