我创建了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] 删除。
我来说两句