我使用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