gpt4 book ai didi

c++ - 为什么 OutputDebugString 为空

转载 作者:太空宇宙 更新时间:2023-11-04 15:14:55 26 4
gpt4 key购买 nike

我创建了一个 Win32 应用程序并且有一个登录表单,但我无法获得编辑窗口值。我是这样做的,但什么也没得到。我的错误在哪里?

#define passwordWindowId 2

HWND passwordWindowHandle = CreateWindow(TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD, 10, 80, 150, 20, hWnd, (HMENU)passwordWindowId, NULL, NULL);
int len = GetWindowTextLength(GetDlgItem(passwordWindowHandle, passwordEditId));
LPWSTR passwordWindowValue;

GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1);
OutputDebugString(passwordWindowValue);

但是如果我执行 OutputDebugString(L"test"); 我会在输出选项卡中看到 test

最佳答案

您的代码中有很多错误,有些是细微的,有些是致命的。

#define passwordWindowId 2

一些低控件 ID 被对话管理器使用,不应该被用户定义的控件重载。一个常见的约定是从 100 开始分配数字(参见 Why do dialog editors start assigning control IDs with 100? )。

另一个常见约定是对预处理器符号使用全部大写名称。

HWND passwordWindowHandle = CreateWindow(TEXT("EDIT"), TEXT(""), ...

这是创建一个 编辑控件(参见 CreateWindow 的第二个参数)。这本身不是错误,但您不能假定该控件包含任何文本。

同样,这不是错误,但使用通用文本映射通常没有帮助。将 API 的 Unicode 版本与宽字符串和字符串文字一起使用:HWND passwordWindowHandle = CreateWindowW(L"EDIT", L"", ... .

LPWSTR passwordWindowValue;

LPWSTRwchar_t* 的类型定义,所以上面定义了一个指针而不初始化它。本身不是错误,但是当您开始使用该指针时,您会遇到未定义的行为。您需要为以下对 GetWindowText 的调用分配存储空间,或者通过创建固定大小的本地数组(如果您提前知道最大大小),或者使用动态大小的容器(例如 std::vector<wchar_t> buffer(len + 1);)。

GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1);

这就是问题所在:您正在请求 API 调用以写入未分配的内存,该内存由未初始化的指针指向。如上所述,您需要在调用 GetWindowText 之前分配内存。 .此外,您正在调用通用文本映射,但传递的是显式宽字符串类型。使用 GetWindowTextW相反。

OutputDebugString(passwordWindowValue);

参数仍然是一个未初始化的指针。即使不是,指向的内存也将是一个空字符串,因为控制文本是空的。同样,您正在调用通用文本映射,同时传递一个明确的宽字符串。使用 OutputDebugStringW相反。

另外,您根本没有检查错误。您正在使用的所有 Windows API 调用都可能失败,您需要检查失败情况。请参阅有关如何检查每个 API 调用的错误的文档。

关于c++ - 为什么 OutputDebugString 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36111920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com