4

私たちは (誤って) StringCbPrintfW を使用してデータベース クエリを作成しましたが、これはカンマを小数点記号として使用するすべてのロケールで惨めに失敗しました。修正は簡単ですよね?ロケールを取る StringCbPrintf_lW も strsafe.h で定義されています。どちらも次のように定義されています。

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)

したがって、ロケールを作成し、StringCbPrintfW を StringCbPrintf_lW に置き換えるだけです。

Intellisense は満足していますが、GoToDefinition は満足していますが、ClCompile はそうではありません。私は得続けます

エラー C3861: 'StringCbPrintf_lW': 識別子が見つかりません

何が間違っているのですか?

4

2 に答える 2

5

ヘッダー Strsafe.h は、次のようにこの関数をフィルター処理する 2 つの定義を使用して、問題のメソッドを定義します。

#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>
于 2016-05-25T14:59:21.877 に答える
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 では、これら 2 つのマクロのどちらもデフォルトで定義されていないことに注意しました。したがって、ヘッダーを含める前に次のことを行う
必要があります。#define STRSAFE_LOCALE_FUNCTIONS

#define STRSAFE_LOCALE_FUNCTIONS
#include <strsafe.h>

次のように、Visual Studio IDE を使用してプロジェクト レベル全体でそのプリプロセッサ マクロを定義することもできます。構成プロパティ | C/C++ | プリプロセッサを作成し、それをPreprocessor Definitionsのリストに追加します。

于 2016-05-25T15:37:23.953 に答える