如何在同一个类中调用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 CLanguage :: *)(LPWSTR)'到'LOCALE_ENUMPROCW' {log =“C:\ WINCE700 \ osdesigns \ UVVIS2 \ UVVIS2 \ GUI \ bldsys.log(32)”} c:\ wince700 \ osdesigns \ uvvis2 \ uvvis2 \ gui \ clanguage.cpp 24
答案 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;
}