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

正如@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还有其他方法可以处理这种情况。

您可以尝试制作一个单例处理程序类吗?

BOOL CALLBACK EnumLocalesProc(LPWSTR lpLocaleString) 
{
    return CLanguage::GetInstance().EnumLocalesProc(lpLocaleString);
}
于 2012-08-07T10:37:22.707 回答
0

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

于 2012-08-07T10:59:20.143 回答
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 回答