c++如何给使用__clrcall作为导出函数传递参数?

在dll中有一个callback需要传递一个c#对象给外部程序,之后外部程序在调用回dll内的函数回传这个c#对象应该如何实现?

 

typedef void (WINAPI *CallbackFun)(Session ^, unsigned int adder);

callback(os,addr)//传递给调用程序

 

 void  __clrcall RecvRepeatHtml(Session^ os, char* n1, char* n2)

RecvRepeatHtml(os,"test1","teset2")//调用程序重新将callback给的os调用dll的RecvRepeatHtml函数

 

显然这样定义__clrcall是报错的,所以有没有好的方案来达到这一目的? 由于这个回调是多线程在进行了,没法做成全局变量保存。

 

在C++ CLI和C#中处理类似这种情况通常涉及到对托管和非托管代码的混合编程。在C++ CLI中,您通常会使用委托来进行回调,而不是使用函数指针,这主要是因为C#对象需要在托管堆中管理,而函数指针无法访问托管堆。

下面是一个示例,介绍了如何在非托管代码中创建托管的委托和调用它。请注意,这个例子的目的是给出一个大致的方向,您可能需要根据您的实际需求进行调整:

public delegate void CallbackDelegate(Session^, unsigned int adder);

public ref class CallbackHolder
{
public:
    CallbackHolder(CallbackDelegate^ callback)
        : m_callback(callback)
    {
    }

    void InvokeCallback(Session^ session, unsigned int adder)
    {
        m_callback(session, adder);
    }

private:
    CallbackDelegate^ m_callback;
};

extern "C"
{
    __declspec(dllexport) void SetCallback(CallbackHolder^ callbackHolder)
    {
        // Store callbackHolder in some way, e.g. as a global or thread-local variable.
        // Then you can call callbackHolder->InvokeCallback() when needed.
    }
}

在这个例子中,我们创建了一个CallbackHolder类,它接受一个托管的委托并在需要的时候调用它。非托管代码可以存储CallbackHolder的实例并在需要的时候调用InvokeCallback。

这样做的一个限制是需要使用C++ CLI编译器(/clr)编译您的代码,因为它涉及到托管和非托管代码的混合。如果你无法这样做,你可能需要通过其他方式来实现,例如COM互操作或者使用C++/CLI创建一个包装类。

请注意,这个例子只是为了给出一个大致的思路,并没有涉及到如何正确地存储和管理CallbackHolder的实例。你可能需要根据你的实际需求进行调整,例如使用智能指针或其他资源管理技术来管理CallbackHolder的实例。