如何在C ++中调用EnumSystemLocales()

时间:2012-08-07 10:16:01

标签: c++ winapi

如何在同一个类中调用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.log(32)”} c:\ wince700 \ osdesigns \ uvvis2 \ uvvis2 \ gui \ clanguage.cpp 24

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

另一个问题是C API不支持指向成员函数(CLanguage::*)

的指针

答案 2 :(得分: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;
}