无法找到区域设置感知版本的StrSafe函数(StringCbPrintf_lW)

时间:2016-05-25 14:49:33

标签: c++ winapi visual-studio-2013 strsafe

我们(错误地)使用StringCbPrintfW来编写数据库查询,该查询在使用逗号作为小数分隔符的任何语言环境中都失败了。修复很容易,对吧?采用语言环境的StringCbPrintf_lW也在strsafe.h中定义。两者都定义如下:

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)

所以只需创建语言环境并用StringCbPrintf_lW替换StringCbPrintfW。

Intellisense很高兴,GoToDefinition很高兴,ClCompile不高兴。我一直在

  

错误C3861:'StringCbPrintf_lW':未找到标识符

任何想法有什么不对?

2 个答案:

答案 0 :(得分:5)

标题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
// ...

简而言之,您需要在包含标题之前定义STRSAFE_LOCALE_FUNCTIONS。如:

#define STRSAFE_LOCALE_FUNCTIONS
#ifdef STRSAFE_NO_CB_FUNCTIONS
#pragma message("NO CB FUNCTIONS")
#endif
#include <strsafe.h>

答案 1 :(得分:1)

<strsafe.h>标题内搜索,您会注意StringCbPrintf_lW函数由预处理器#if保护,如下所示:

#if defined(STRSAFE_LOCALE_FUNCTIONS) && !defined(STRSAFE_NO_CB_FUNCTIONS)

因此,要在代码中启用前面提到的API,您只需要定义STRSAFE_LOCALE_FUNCTIONS STRSAFE_NO_CB_FUNCTIONS定义

对于VS2015,我注意到这两个宏都没有默认定义 因此,在添加标题之前,您只需要#define STRSAFE_LOCALE_FUNCTIONS

#define STRSAFE_LOCALE_FUNCTIONS
#include <strsafe.h>

您还可以使用Visual Studio IDE在整个项目级别定义该预处理器宏,如下所示:项目属性|配置属性| C / C ++ |预处理器并将其添加到预处理器定义中的列表中。