我使用C++/CLI封裝了一個C函數庫。 C庫設計用於從非託管C++類中使用。這意味着庫函數接受一個C++對象指針,然後在回調中提供該指針。這使回調代碼可以將請求重定向到調用C++對象中的適當事件函數。c庫的C++/CLI類封裝器 - 回調函數
的實際功能是相當複雜的,所以我簡化了問題空間只有幾個基本項目:
// C library function signature
void CLibFunc(CLIBCALLBACK *callback, void *caller);
// C callback signature
// Second parameter is meant to point to the calling C++ object
typedef int (__stdcall CLIBCALLBACK) (int param1, void *caller);
// C callback implementation
int CallBackImpl(int param1, void* caller)
{
// Need to call the ManagedCaller's EventFunction from here
// ???
}
// C++/CLI caller class
public ref class ManagedCaller
{
public:
void CallerFunction(void)
{
// Call the C library function
// Need to pass some kind of this class pointer that refers to this object
CLibFunc(CallBackImpl, ????);
}
void EventFunction(param1)
{
}
}
現在的C庫函數需要從一個託管C++類調用。在C++/CLI下,垃圾收集器在內存中移動對象,因此傳遞一個簡單的固定指針到類不再工作。我可以通過固定對象來解決問題,但不建議這樣做,因爲這會導致內存碎片。看起來,另一種選擇是使用auto_gcroot指針,但我對託管C++來說是相當新的,我不知道如何使其工作。
有誰知道如何使這項工作?什麼樣的指針應該傳遞給C函數?回調實現應該如何重定向到調用對象的事件函數?
這只是與我的問題相切。這顯示瞭如何在託管C++類中包裝非託管C++類並使用回調。我遇到過很多這方面的例子,包括http://tweakbits.com/UnmanagedToManagedCallback.cpp等示例。我正在尋找的是如何在C++/CLI類中包裝C庫並使用回調的示例。在這一天結束時,我面臨的問題與這些樣本中解決的問題有所不同。 – Theo 2011-02-13 18:26:27