c++ - 为什么 OutputDebugString 为空

标签 c++ winapi visual-studio-2015

我创建了一个 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/

相关文章:

c++ - 在 Win32/C++ 中获取已安装的 Flash ActiveX 的版本

c++ - C++ 函数声明中,右括号前的 & 符号有何作用?

c++ - 如何从 std::istream 中读取数据(使用运算符>>)?

javascript - UWP:如何访问应用程序数据

c# - 如何在 Visual Studio IDE 中查看来自 github 的源代码,但使用来自 Nuget 的 dll 进行编译?

c# - VS2015 : warning MSB3884: Could not find rule set file

c# - IIS服务器找不到index.aspx文件-404错误

c++ - SFML OpenGL 绘图文本

c++ - 是否存在返回 RValue 引用 (&&) 有用的情况?

c - 使用 Win32 Api 在 C 程序中进行串行连接