2010-07-19 84 views
0

我有一個DLL,它需要我爲它設置一個回調函數(實際上它是一個相機sdk,它會回調我的函數,當它接收圖片)。 我想有多個(用戶輸入)攝像頭,但我不能。 因爲我應該使未知數量的回調函數。C++多個回調函數

簡單的方法是製作一個類(相機),它有一個回調函數。 但我不能通過類的成員的指針到DLL(它只接受(void)(image *))

任何可能的解決方案?

+0

沒有可能通過上下文參數,你是運氣不好。也許'image *'參數攜帶一些可用於識別上下文的數據? – 2010-07-19 07:45:33

回答

0

相機SDK是否支持多臺相機連接?如果不是,您需要與SDK提供商交談。

如果SDK支持多重連接,則必須提供在回調函數中識別相機的方式。但實際的答案是在SDK本身。什麼是「圖像」類型,也許它包含相機ID?當客戶端代碼進行回調訂閱時,可能會提供攝像頭ID?就像這樣:

 
void Callback0(image*); 
void Callback1(image*); 

SubscribeImageCallback(0, Callback0); // camera 0 
SubscribeImageCallback(1, Callback1); // camera 1 

您的問題的實際答案取決於相機SDK接口。

+0

非常感謝你的回答。 識別相機ID的唯一可能方法是從圖像的內存地址。但它會解決問題:) – MBZ 2010-07-19 08:34:34

1

嘗試創建要調用的所有函數對象的全局列表,然後添加一個函數,該函數使用所需的數據調用每個回調函數。例如:

std::vector<ICallback*> g_callbacks; 

void callback_wrapper(image * image) 
{ 
    for(unsigned int i=0; i<g_callbacks.size(); ++i) 
    { 
    g_callbacks[i]->process(image); 
    } 
} 

然後,您將SDK使用的回調設置爲callback_wrapper函數。

+0

感謝您的回覆,這不會爲我工作。 這樣所有的相機都會收到所有相機的所有圖像! 我需要每臺相機才能得到它自己的圖像。 – MBZ 2010-07-19 07:36:25

0

根據操作系統的不同,您可以爲每個回調對象創建動態函數。我已經完成了對傳統代碼的回調,這些代碼沒有任何功能將值傳遞給回調函數。

創建與庫的預期,其類型,然後用一個容易看到額外的參數

void Call01020304() { 
    CallWithValue(0x01020304); 
} 

編譯它,並期待在16進制,大會呼籲真正的回調函數小樣機轉發功能。這應該是顯而易見的常數。

然後,您使用VirtualAlloc + PAGE_EXECUTE_READWRITE或mmap + PROT_EXEC分配一些可以執行的內存。分配通常是4K塊,因此創建一個類來管理這些函數,因爲您將一次分配足夠多的資源。

當您需要一個具有唯一值的新回調函數時,將具有適當更改值的原型的字節複製到可執行內存中,並將指針返回爲回調函數。