有人可以告诉我为什么以下代码不起作用?我没有任何编译器错误。
short value = 10;
SetProp(hCtl, "value", (short*) value);
答案 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
。