我有以下代碼:如何在函數中設置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