SetProp问题

时间:2011-05-06 21:12:41

标签: c winapi

有人可以告诉我为什么以下代码不起作用?我没有任何编译器错误。

short value = 10;
SetProp(hCtl, "value", (short*) value);

2 个答案:

答案 0 :(得分:2)

第三个参数被输入为HANDLE,因此IMO要满足函数的显式契约,您应该通过分配HANDLE内存块将属性保存为HGLOBAL。但是,如下面的评论中所述,MSDN声明可以指定任何值,实际上当我在Windows 7上使用...时尝试...

SetProp(hWnd, _T("TestProp"), (HANDLE)(10)); // or (HANDLE)(short*)(10)
...
(short)GetProp(hWnd, _T("TestProp"));

......我从GetProp回来了10。我怀疑你的SetProp和GetProp之间发生了两件事之一:(1)hWnd的值是不同的 - 你正在检查一个不同的窗口或(2)一个时间问题 - 该属性尚未设置或已被删除。


如果您想使用HGLOBAL代替功能签名的特定类型,则可以关注this example in MSDN

即使HANDLE只是一个指针,它也是通过调用Windows API分配的特定数据类型。很多东西都有句柄:图标,光标,文件......除非文档另有明确说明,否则当函数调用short时要使用一串数据,例如HANDLE,你需要内存句柄(HGLOBAL)。

上面链接的示例代码将数据复制为字符串,但您可以将其设置为另一种数据类型:

// TODO: Add error handling
hMem = GlobalAlloc(GPTR, sizeof(short));
lpMem = GlobalLock(hMem);
if (lpMem != NULL)
{
    *((short*)lpMem) = 10;
    GlobalUnlock(hMem);
}

要阅读它,当您GetProp获取HANDLE时,您必须将其锁定以读取内存:

// TODO: Add error handling
short val;
hMem = (HGLOBAL)GetProp(hwnd, ...); 
if (hMem)
{
    lpMem = GlobalLock(hMem);
    if (lpMem)
    {
        val = *((short*)lpMem);
    }
}

答案 1 :(得分:0)

我会在堆上创建short,以便它继续存在,或者可能使它成为全局的,这也许就是你所做的。另外,short地址的广告需要为void *HANDLE