2012-10-08 25 views

回答

3

您需要的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(); 
} 
+0

谢谢你解决问题! – dare2k

0

您必须传递句柄的地址,而不是句柄本身。查看按引用和按值查看。您目前按价值致电,因此init()所做的任何更改均仅限本地使用。

你想要的是一样的东西:

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

.... 

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

谢谢! 你的答案也帮助了我。 – dare2k

0

呼叫init(&h)代替init(h)

,并定义为init

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

那么变化会在次可见主要也是。

而且小记:您可能需要的HANDLE指针/地址传递给dosomething()太(这取决于你想在那里完成的任务)

2

除了通过正如许多人所建议的地址,我建议返回函数的句柄,而不是。它使有些更清晰的代码:

HANDLE h = init(); 
0

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

在你的头文件:

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

不要忘了,包括你的头文件。

+0

感谢您的意见。不幸的是,我只能使用静态的东西没有处理的malloc。 – dare2k

相关问题