我有以下代码:如何在函数中设置HANDLE? (C)
HANDLE h = NULL;
init(h);
dosomething(h);
我如何才能在DoSomething的功能,使用它设定为“H”的初始化函数?
我有以下代码:如何在函数中设置HANDLE? (C)
HANDLE h = NULL;
init(h);
dosomething(h);
我如何才能在DoSomething的功能,使用它设定为“H”的初始化函数?
您需要的h
地址传递给init()
为C经过值:
void init(HANDLE* a_h)
{
*a_h = ...; /* some handle. */
}
和调用:
init(&h);
if (h)
{
dosomething(h);
CloseHandle(h);
}
除了将HANDLE
的地址传递给init()
,取决于未能获得HANDLE
的事件要求的动作,你也可以通过在DWORD
地址的最后一个错误存储在失败的情况下,使提供给调用者这样的信息:
void init(HANDLE* a_h, DWORD* a_last_error)
{
*a_h = /* code to acquire handle. */;
if (NULL == *a_h) *a_last_error = GetLastError();
}
您必须传递句柄的地址,而不是句柄本身。查看按引用和按值查看。您目前按价值致电,因此init()
所做的任何更改均仅限本地使用。
你想要的是一样的东西:
void init(HANDLE *h)
{
*h = something;
}
....
...
HANDLE H=NULL;
init(&h);
谢谢! 你的答案也帮助了我。 – dare2k
呼叫init(&h)
代替init(h)
,并定义为init
void init(HANDLE * h)
{ /* do whatever */ }
那么变化会在次可见主要也是。
而且小记:您可能需要的HANDLE
指针/地址传递给dosomething()
太(这取决于你想在那里完成的任务)
除了通过正如许多人所建议的地址,我建议返回函数的句柄,而不是。它使有些更清晰的代码:
HANDLE h = init();
在阐述前面的答案。要使用数据隐藏,您需要将您的句柄定义为实现外的空指针和内部的真实结构,因此只有实现才能看到构成的结构。
在你的头文件:
typedef void * HANDLE;
void init(HANDLE *h);
void dosomething(HANDLE h);
void destroy(HANDLE *h);
实施:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int contents;
} * HANDLE;
void init(HANDLE *h) {
*h = (HANDLE)malloc(sizeof *h);
(*h)->contents = 2;
}
void dosomething(HANDLE h) {
printf("Contents are: %d\n", h->contents);
}
void destroy(HANDLE *h) {
free(*h);
*h = NULL;
}
并调用函数:
HANDLE h = NULL;
init(&h);
dosomething(h);
destroy(&h);
不要忘了,包括你的头文件。
感谢您的意见。不幸的是,我只能使用静态的东西没有处理的malloc。 – dare2k
谢谢你解决问题! – dare2k