EnumWindows无法正常工作

时间:2016-09-01 14:42:59

标签: c++ string winapi unicode vc10

我正在创建一个dll文件。

我的代码:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

void test() {
    EnumWindows(EnumWindowsProc, NULL);
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char class_name[80];
    char title[80];
    GetClassName(hwnd, (LPWSTR) class_name, sizeof(class_name));
    GetWindowText(hwnd, (LPWSTR) title,sizeof(title));
    std::string titlas(title);
    std::string classas(class_name);
    Loggerc(titlas);
    Loggerc("Gooing");
    return TRUE;
}

然后我打电话给test()

在日志中,titlas为空,代码停止。

当我在带有CodeBlock的Win32应用程序中尝试此代码时,一切正常,所有标题都显示。但在dll中,它不起作用。

问题出在哪里?

1 个答案:

答案 0 :(得分:2)

char class_name[80];
char title[80];
GetClassName(hwnd, (LPWSTR) class_name, sizeof(class_name));
GetWindowText(hwnd, (LPWSTR) title,sizeof(title));
std::string titlas(title);
std::string classas(class_name);

考虑到自VS2005以来默认一直在以Unicode模式(而不是ANSI / MBCS)构建,并且你有那些(丑陋的C风格)(LPWSTR)强制转换,我假设你有编译将基于char的字符串缓冲区传递给GetClassName()和GetWindowText()等API时出现错误,并尝试使用强制转换修复这些错误。
那是错的。编译器实际上正在帮助您解决这些错误,因此请遵循其建议,而不是抛弃编译器错误。

假设 Unicode 版本,您可能希望使用 wchar_t std::wstring 而不是{{1} }和char以及 std::string 而不是_countof()来获取sizeof()中的缓冲区大小,不是以字节为单位(wchar_t s)。

E.g:

char

如果您的代码的其他部分确实使用// Note: wchar_t used instead of char wchar_t class_name[80]; wchar_t title[80]; // Note: no need to cast to LPWSTR (i.e. wchar_t*) GetClassName(hwnd, class_name, _countof(class_name)); GetWindowText(hwnd, title, _countof(title)); // Note: std::wstring used instead of std::string std::wstring titlas(title); std::wstring classas(class_name); ,您可能希望将存储在std::string(由Windows API返回)中的UTF-16编码文本转换为UTF-8编码的文本,将其存储在std::wstring个实例中。