0

同じクラス内で C++ の EnumSystemLocales() 関数を呼び出す方法は? 私のコールバック関数は次のとおりです。

BOOL CALLBACK CLanguage::EnumLocalesProc(LPWSTR lpLocaleString) {

    RETAILMSG(TRUE, (L"[GUI] LOCALE: %s!\n\r", lpLocaleString));

    return TRUE;

}

通話がうまくいきEnumSystemLocales(&CLanguage::EnumLocalesProc, LCID_INSTALLED)ません!

編集: Windows Embedded Compact 7です。エラーは構文にあります:

エラー 2 エラー C2664: 'EnumSystemLocalesW' : パラメーター 1 を 'BOOL (__cdecl CL​​anguage::* )(LPWSTR)' から 'LOCALE_ENUMPROCW' に変換できません {log="C:\WINCE700\osdesigns\UVVIS2\UVVIS2\GUI\bldsys.ログ(32)"} c:\wince700\osdesigns\uvvis2\uvvis2\gui\clanguage.cpp 24

4

3 に答える 3

0

もう1つの問題は、CAPIがメンバー関数へのポインターをサポートしていないことです。(CLanguage::*)

于 2012-08-07T10:59:20.143 に答える
0

@MSaltersが指摘したように、BOOL (__cdecl CLanguage::* )(LPWSTR)はメンバー関数へのポインターであり、に必要な署名と一致しませんLOCALE_ENUMPROCW

プログラムはメソッドがクラスのどのインスタンスCLanguage属しているか分からないため、必要なときに正しく呼び出すことができません。ほとんどの API はvoid*、上記のクラスを指すことができる追加の引数を渡すことを許可することで、これを解決しようとします。

EnumLocalesProc関数をCLanguageクラスの外に移動する必要があります。組織のスコープを維持したい場合は、コールバックを名前空間に移動してみてください。

namespace CApiInterface
{
    BOOL CALLBACK EnumLocalesProc(LPWSTR lpLocaleString) {...}
}

// Register callback. Note that address of (&) operator is not required.
EnumSystemLocales(CApiInterface::EnumLocalesProc, LCID_INSTALLED)

関数中にクラスの他のメンバー変数にアクセスする必要があるという事実がEnumLocalesProc、それを困難にしています。このケースを処理する他の方法があります。

Singletonハンドラ クラスを作成してみてはいかがでしょうか。

BOOL CALLBACK EnumLocalesProc(LPWSTR lpLocaleString) 
{
    return CLanguage::GetInstance().EnumLocalesProc(lpLocaleString);
}
于 2012-08-07T10:37:22.707 に答える
0
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <vector>
#include <string>

typedef std::vector<std::basic_string<TCHAR>> tLocales;
std::vector<std::basic_string<TCHAR>> g_locales;

BOOL CALLBACK MyLocaleEnumProc(LPTSTR szLocaleString)
{
  g_locales.push_back(szLocaleString);
  return TRUE;
}
int _tmain()
{
 // Get all locales
  EnumSystemLocales(&MyLocaleEnumProc, LCID_INSTALLED);

 // Print out all locales
for(tLocales::const_iterator i=g_locales.begin(); i != g_locales.end(); i++)
{
   _tprintf(_T("Locale: %s\r\n"), i->c_str());
}
 return 0;
}
于 2015-04-07T11:51:31.307 に答える