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

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

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境