为什么OutputDebugString为空

rel1x

我创建了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开始分配数字(请参阅为什么对话框编辑器开始从100开始分配控件ID?)。

另一个通用约定是将所有大写名称用作预处理器符号。

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

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

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

LPWSTR passwordWindowValue;

LPWSTR是的typedef wchar_t*,因此以上代码定义了一个指针,而没有对其进行初始化。本身不是错误,但是当您开始使用该指针时,您会遇到未定义的行为。您需要为以后的调用分配存储空间GetWindowText,方法是创建一个固定大小的本地数组(如果您提前知道最大大小),或者使用动态大小的容器(例如std::vector<wchar_t> buffer(len + 1);)。

GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1);

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

OutputDebugString(passwordWindowValue);

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

另外,您根本不会检查任何错误。您正在使用的所有Windows API调用都可能失败,并且您需要检查是否失败。请参阅有关如何检查每个API调用的错误的文档。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章