Я создаю файл 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
пусто и код останавливается.
Когда я пытаюсь этот код в приложении Win32 с CodeBlock, все работает, все названия показывают. Но в dll это не работает.
В чем проблема?
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)
бросает, я предполагаю, что вы получили ошибки во время компиляции при передаче строковых буферов на основе символов в API, такие как GetClassName () и GetWindowText (), и вы пытались исправить эти ошибки с помощью приведений.
Это неверно. Компилятор действительно помогал вам с этими ошибками, поэтому, пожалуйста, следуйте его советам, а не отбрасывайте ошибки компилятора.
Если предположить, Unicode сборки, вы можете использовать wchar_t
а также std::wstring
вместо char
а также std::string
, а также _countof()
вместо sizeof()
чтобы получить размер буферов в wchar_t
s, не в байтах (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
вы можете преобразовать текст в кодировке UTF-16, хранящийся в std::wstring
(возвращается Windows API) к тексту в кодировке UTF-8 и сохранить его в std::string
экземпляров.
Других решений пока нет …