我正在尝试使用具有回调机制的(C)第三方库,该回调机制缺乏任何可能的方式来识别调用上下文。我的主要项目是 C#,我的包装器是一个 C++/CLI 项目,用于调用 C 库 API。
为了解决这个问题,我尝试使用 Marshal::GetFUnctionPointerForDelegate。这是我的 C# 代码:
void Init(Handler Callback)
{
// Create a wrapper lambda in case Callback is a non-static method.
instance.CreateBuffers((x, y) => Callback(x, y));
}
然后,在 C++/CLI 代码中:
void CreateBuffers(Handler^ Callback)
{
pinCallback = GCHandle::Alloc(Callback);
void (*callback)(int, int) = (void (__stdcall *)(int, int))Marshal::GetFunctionPointerForDelegate(Callback).ToPointer(),
// Use 'callback' in third party library...
}
这一切的问题在于,根据http://msdn.microsoft.com/en-us/library/367eeye0.aspx,来自 Marshal::GetFunctionPointerForDelegate 的函数指针是一个 stdcall 函数,但我的 C 回调是 cdecl。如何在这里获得与 cdecl 兼容的功能?