【问题标题】:Parameters referenced from the same variable point to different locations从同一个变量引用的参数指向不同的位置
【发布时间】:2013-01-01 17:24:45
【问题描述】:

我正在尝试将 HWND 指针与其他数据一起存储在 int 向量中,我正在使用以下代码获取数据并将其存储在创建时:

void createscalingwindow(HWND &cswpara0,DWORD cswpara1,const CHAR* cswpara2,
                         const CHAR* cswpara3,DWORD cswpara4,int cswpara5,
                         int cswpara6,int cswpara7,int cswpara8,HWND cswpara9,
                         HMENU cswpara10,HINSTANCE cswpara11,LPVOID cswpara12)
{
    cswpara0 = CreateWindowEx (cswpara1, cswpara2, cswpara3, cswpara4, cswpara5,
                               cswpara6,cswpara7,cswpara8,cswpara9,cswpara10,
                               cswpara11,cswpara12);                     
    sizevalues.push_back((int)&cswpara0);
    snprintf (buffer, 20,"%d", sizevalues[zero]);
    MessageBox (NULL, buffer, "pointer", NULL);
    sizevalues.push_back(cswpara5);
    sizevalues.push_back(cswpara6);
    sizevalues.push_back(cswpara7);
    sizevalues.push_back(cswpara8);
    return;
}

以下代码是一个原型,目前仅在消息框中显示值,但我稍后计划让它调整子窗口的大小以与父窗口一起缩放

void scalewindowsize (HWND &ownerwin, HWND &childwin)
{
    /*check owner window*/
    char buffer[100];
    int checknumber = 0; 
    while (checknumber < sizevalues.size())
    {
        if (sizevalues[checknumber] == (int)&ownerwin)
        {
            snprintf (buffer, 100,"%d", sizevalues[checknumber]);
            MessageBox (NULL, buffer, "foundit", NULL);
            break;
        }
        snprintf (buffer, 20,"%d", (int)&ownerwin);
        checknumber = (checknumber + 5);
        MessageBox (NULL, buffer, "fail", NULL);
    }
    return;
}

问题是createscalingwindow 中的第一个Messagebox 产生的值是 4235304,而第二个产生的数字完全不同(数字不同)。这是为什么呢?

更新:找到了部分原因,为了重现这一点,作为scalewindowsize 的参数的 HWND 必须在窗口过程中使用,并且在该窗口过程中具有相同的参数 HWND。

【问题讨论】:

    标签: c++ winapi pointers vector casting


    【解决方案1】:

    不要将非int 值存储在int 向量中。这是自找麻烦。

    改为创建一个包含所有值的字段(具有正确类型)的类,并创建一个包含该类对象的向量。

    但是,您的数字更改可能是由于您获取局部变量的地址并在声明变量的函数返回后使用它。您应该只推送HWND 的值,而不是存储它的地址。句柄是纯数字,因此无需通过引用传递它们,除非您打算在函数中更改它们(我不明白为什么您需要在 createscalingwindow 中这样做 - 您可以只返回值)

    【讨论】:

    • 为什么?我想如果它们具有相同的值,它们会转换为相同的 int 值,这不是它的工作原理吗?
    • @user1934608:如果它们超出了int 的范围,则不会。
    • 所以如果我使用intptr_t 来确保它足够大以容纳它应该没问题?
    • @userrandomnumbers:如果您找到的文档可以保证所有这些不同的类型都足够小以适合intptr_t,那么,也许。但是你为什么不想创建一个类来保存你的价值观呢?你会得到它们的描述性名称,以及很好的类型检查。例如,我不想记住myVector[n*5 + 3] 是“CreateWindowEx 的第 7 个参数”。
    • @userrandomnumbers:是的,学习 C++ 的基础知识(例如类)将是一个好主意,甚至在冒险使用诸如 WinAPI 之类的大型外部库之前...(但是,您拼写为 Stroustrup正确,这是一个开始!)
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多