2016-05-25 3 views
4

StringCbPrintfWを使用して、小数点区切り文字としてコンマを使用するロケールで惨めに失敗したデータベースクエリを書きました。修正は簡単です、そうですか?ロケールを取るStringCbPrintf_lWもstrsafe.hで定義されています。これだけロケールを作成し、StringCbPrintf_lWでStringCbPrintfWを置き換えるStrSafe関数のロケール対応バージョン(StringCbPrintf_lW)が見つかりません

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) 

:どちらが下で定義されています。

Intellisenseは満足していますが、GoToDefinitionは満足していますが、ClCompileは満足していません。私が取得

エラーC3861を保つ: 'StringCbPrintf_lW':識別子が

何が間違っている任意のアイデア

を見つけていませんか?

答えて

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を定義する必要があります。以下のように:aformentioned APIを有効にするために、そう

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

<strsafe.h>ヘッダ内の

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

奇妙な変種。私が考えることができるのは、小文字のl(ell)ではなく、大文字のI(目)で関数名を綴るプログラマーに.hファイルを見せてもらうことです。 –

+0

#define STRSAFE_LOCALE_FUNCTIONSはトリックを行いました。ありがとう。私は欠けている定義をどのように逃したのか分かりません。 –

+1

厳密には関係ありませんが、とにかく知っておいてください:* "STRSAFE_NO_CB_FUNCTIONS'または" STRSAFE_NO_CCH_FUNCTIONS "を定義することはできますが、両方は定義できません" *([About Strsafe.h](https://msdn.microsoft.com/ja) -us/library/windows/desktop/ms647466.aspx))。実際には驚きではありませんが、明白な明示を明示することは時々役に立ちます。 – IInspectable

1

洞窟探検、あなたはStringCbPrintf_lW関数は次のようにプリプロセッサ#ifによって守られていることに注意しますあなたのコードでは、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++ |プリプロセッサを追加し、プリプロセッサの定義のリストに追加します。

+0

さて、プロジェクト全体のマクロを定義するには、少しの点があります。実際には、StrSafeヘッダーをインクルードする時点で定義する必要があります。ちょうどあなたのプリコンパイル済みのヘッダーに2行を入れて移動してください。 –

+0

@CodyGray:誰もプロジェクトでプリコンパイルされたヘッダーを使用しているわけではありません。 –

+0

それは本当です、私は思います。その場合、私はむしろ、それらの2行を含む独自の「ラッパー」ヘッダーを作成し、それに文字列操作関数が必要なあらゆる場所にインクルードすることができます。 –

関連する問題