2012-10-08 69 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

相關問題