从同一变量引用的参数指向不同的位置

时间:2013-01-01 17:24:46

标签: c++ winapi pointers vector casting

我正在尝试将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;
}

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

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

1 个答案:

答案 0 :(得分:2)

不要在int向量中存储非int值。那是在惹麻烦。

而是创建一个包含所有值的字段(具有适当类型)的类,并创建一个包含该类对象的向量。

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