如何在函数中设置HANDLE? (C)

时间:2012-10-08 13:50:08

标签: c pointers

我有以下代码:

    HANDLE h = NULL;
    init(h);
    dosomething(h);

如何在init函数中设置“h”以便在dosomething函数中使用它?

5 个答案:

答案 0 :(得分:3)

当C传递值时,您需要将h的地址传递给init()

void init(HANDLE* a_h)
{
    *a_h = ...; /* some handle. */
}

并调用:

init(&h);
if (h)
{
    dosomething(h);
    CloseHandle(h);
}

除了将HANDLE的地址传递给init()之外,根据无法获取HANDLE时所需的操作,您还可以传递DWORD的地址1}}如果未能将此信息提供给调用者,则存储最后一个错误:

void init(HANDLE* a_h, DWORD* a_last_error)
{
    *a_h = /* code to acquire handle. */;
    if (NULL == *a_h) *a_last_error = GetLastError();
}

答案 1 :(得分:2)

除了传递许多建议的地址外,我还建议从函数中返回句柄。它使代码更清晰:

HANDLE h = init();

答案 2 :(得分:0)

您必须传递句柄的地址,而不是句柄本身。查看按引用调用和按值调用。您目前正在按值进行调用,因此init()所做的任何更改都只是本地更改。

你想要的是:

void init(HANDLE *h)
{
    *h = something;
}

....

    ...
    HANDLE H=NULL;
    init(&h);

答案 3 :(得分:0)

致电init(&h)而非init(h)

init定义为

void init(HANDLE * h)
{ /* do whatever */ }

然后,主要内容也会显示更改。

另外一个小注意事项:您可能需要将HANDLE的指针/地址传递给dosomething()(取决于您希望在那里完成的内容)

答案 4 :(得分:0)

阐述早期的答案。要使用数据隐藏,您需要将句柄定义为实现之外的void指针和内部的实际结构,因此只有实现才能看到结构的构成。

在您的标头文件中:

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);

不要忘记包含您的头文件。