首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么OutputDebugString是空的

为什么OutputDebugString是空的
EN

Stack Overflow用户
提问于 2016-03-20 09:08:21
回答 2查看 306关注 0票数 0

我创建了一个Win32应用程序,我有一个logIn表单,但是我无法获得一个编辑窗口值。我就是这样做的,但一无所获。我的错误在哪里?

代码语言:javascript
复制
#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");,则会在output选项卡中看到test

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-20 12:28:43

代码中有很多错误,有些是微妙的,另一些是致命的。

代码语言:javascript
复制
#define passwordWindowId 2

对话框管理器使用一些较低的控件ID,不应使用用户定义的控件重载。一个常见的惯例是从100开始分配编号(请参阅为什么对话框编辑器开始用100分配控件ID?)。

另一个常见的约定是使用所有大写名称作为预处理符号。

代码语言:javascript
复制
HWND passwordWindowHandle = CreateWindow(TEXT("EDIT"), TEXT(""), ...

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

同样,这不是一个bug,但是使用泛型文本映射通常是没有帮助的。使用API的Unicode版本以及宽字符串和字符串文本:HWND passwordWindowHandle = CreateWindowW(L"EDIT", L"", ...

代码语言:javascript
复制
LPWSTR passwordWindowValue;

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

代码语言:javascript
复制
GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1);

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

代码语言:javascript
复制
OutputDebugString(passwordWindowValue);

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

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

票数 4
EN

Stack Overflow用户

发布于 2016-03-20 09:40:30

更新了!!

代码语言:javascript
复制
 LPWSTR passwordWindowValue;
 GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1);

这应该是

代码语言:javascript
复制
 LPWSTR passwordWindowValue = new wchar_t[len + 1];
 GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1);

您正在传递一个指向GetWindowText的非独立指针。

并在完成后删除[] passwordWindowValue。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36111920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档