0

我正在创建一个 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中,它不起作用。

哪里有问题?

4

1 回答 1

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)强制转换,我假设您在传递基于字符的字符串时遇到编译时错误缓冲到 GetClassName() 和 GetWindowText() 等 API,并且您尝试使用强制转换修复这些错误。
那是错误的。编译器实际上是在帮助您解决这些错误,因此请遵循它的建议,而不是将编译器错误排除在外。

假设Unicode构建,您可能希望使用wchar_tandstd::wstring而不是charand std::string,而_countof()不是sizeof()获取缓冲区的大小,以wchar_ts 为单位,而不是以字节 ( chars) 为单位。

例如:

// 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,您可能希望将存储在std::wstring(由 Windows API 返回)中的 UTF-16 编码文本转换为 UTF-8 编码文本并将其存储在std::string实例中。

于 2016-09-01T14:59:42.713 回答