诺离 2021-03-24 09:48 采纳率: 0%
浏览 24

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是报错的,所以有没有好的方案来达到这一目的? 由于这个回调是多线程在进行了,没法做成全局变量保存。

 

  • 写回答

1条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2023-06-11 14:22
    关注

    在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的实例。

    评论

报告相同问题?

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备