【问题标题】:How to Initialise a Handle如何初始化句柄
【发布时间】:2013-07-05 08:33:18
【问题描述】:

错误:

Run-Time Check Failure #3 - The variable 'TextLabelVar' is being used without 
being initialized.

说明代码:

HWND VarText;
char Disps[100];
float some_number;
WINAPI WndProc(..)
{   

    switch(...) 
    case WM_CREATE:
    TextLabelVar=CreateWindowEx(WS_EX_WINDOWEDGE,TEXT("Edit"), TEXT("Val."), WS_CHILD \
                | WS_VISIBLE, 380, 50, 140, 20, hwnd, NULL, NULL, NULL);
    break;

    case WM_MESSAGEFROMANOTHERWINDOW:
    some_number=1298.123123;
    sprintf(Disps,"%f",some_number);
    SetWindowText(TextLabelVar,TEXT(Disps));

}

问题: 好的,我收到错误 TextLabelVar is正在使用而没有初始化。对于 var Disps,我遇到了类似的错误。然后我宣布 char Disps[100];这显示没有错误。现在,错误转移到句柄上。我不确定我是否可以将句柄声明为数组,这是否有意义。我该如何解决?

【问题讨论】:

  • 你确定它进入了 WM_CREATE 的案例吗?
  • 我认为这是输出“运行时检查失败#3”的任何系统的简单情况,不知道变量实际已初始化,而是在另一个代码路径中。换句话说,它不知道它在另一种情况下被初始化。您可以通过简单地在其声明中将零分配给 TextLabelVar 来解决它。
  • @doctorlove 为什么?你什么意思?我想在创建窗口时创建一个文本字段。我也有主窗口。然后,我想在 WM_MESSAGEFROMANOTHERWINDOW 到来时更新文本字段。它应该放在哪里?
  • @JoachimPileborg 不完全是。这是一个运行时错误。因此,初始化为 0 只会抑制错误,然后使用 0 窗口句柄调用 SetWindowText
  • 顺便说一句,TEXT(Disps) 是错误的。该宏只能与文字一起使用。如果您需要我的建议,我建议您放弃尝试编写可编译为 ANSI 或 Unicode 的代码。由于 Win9x 已死,选择编写 Unicode 感知代码并放弃任何伪装。事实上,您的代码显然已经是 ANSI,因为您使用了char。这意味着如果您尝试为 Unicode 进行编译,代码将严重中断。

标签: c++ visual-studio-2010 winapi win32gui win32-process


【解决方案1】:

这是一个运行时错误。它告诉您的是 TextLabelVar 在初始化之前正在被读取。这意味着WM_MESSAGEFROMANOTHERWINDOW case 语句在WM_CREATE 之前执行。

从您分配给 0 的 cmets 到 TextLabelVar 以抑制警告,但是当然对 SetWindowText 的调用不会成功,因为您传递的窗口句柄是 0

要解决此问题,您需要了解为什么在 WM_CREATE 之前处理 WM_MESSAGEFROMANOTHERWINDOW

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2023-03-13
    相关资源
    最近更新 更多