C++ 回调将文本发送回 C#

2023-12-02

我是 C++ 新手。我被告知使用 C++ 的“回调”是最好的解决方案。这是我的情况。

我有一个用 C++ 编写的 DLL
这个 DLL 有一个方法来启动通过 C# 代码运行的服务(这工作正常)
当 DLL 中的服务运行时,我希望 DLL 将文本传递回 C# 代码,这只是进度代码,例如“第一阶段开始”和“第一阶段完成”


我环顾四周,被告知实现这一目标的最佳方法是使用回调,我真的不知道如何实现这一点。有人有什么建议或文章可供我查看吗?请包括 C++,因为我对 C++ 的经验为零。


Cheers


可能有更干净的方法,但以下是我用来使其发挥作用的一些步骤。

定义委托和将其传递给 DLL 的函数。这些参数将被发送回 C# 委托:

  public delegate uint CallbackFn( uint param1, uint param2 );

  [DllImport("yourdll.dll",  CallingConvention=CallingConvention.Winapi, EntryPoint="RegisterTheCallback" )]
  private static extern uint RegisterTheCallback( CallbackFn pfn );

创建一个变量来存储委托。确保这不会超出范围。在我的测试中,我发现 GC 会回收它(它没有“意识到”我的 DLL 仍在使用它):

  CallbackFn mCmdCallback = null;

然后在某处初始化它:

  mCmdCallback = new CallbackFn( YourCallback );

然后将其传递给您的 DLL:

RegisterTheCallback( mCmdCallback );

并定义将接收调用的实际方法:

  private uint YourCallback( uint param1, uint param2 )
  {
    // report progress etc.
  }

DLL 中的代码可能如下所示:

DWORD _declspec( dllexport ) WINAPI RegisterTheCallback
(
   DWORD (WINAPI *lpfnCallback)( DWORD param1, DWORD param2 )
)
{
// Store lpfnCallback somewhere so that it can be called later
...
}

然后 DLL 中的代码可以在需要时使用适当的数据调用它:

ret = (lpfnCallback)( 234, 456 );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 回调将文本发送回 C# 的相关文章

随机推荐

  • Google 表单将“文件上传”文件重命名为“问题 - 提交者”

    我正在使用 Google 表单收集团队成员的图像 我想确保上传到 Google 表单并保存在 Google 云端硬盘中的每个文件都具有相同的命名约定 有五个上传文件要求团队成员上传图像的问题 这些文件被放置在 Google Drive 文件
  • 双倍改变一位

    我试图改变双精度中的一位 例如 双x 1 500912597这是 Binary 10111111 11111000 00000011 10111100 11101101 01100100 01001111 10010011 更改底层二进制代
  • ModSecurity:访问被拒绝,代码 403

    我已经为我的一台服务器启用了 mod 安全性 但是如果我提交带有 unicode 字符的表单 它会在日志中显示以下错误 并且不允许访问该网页 Wed May 192 168 0 1 2013 error client 192 168 0 1
  • 如何更新 SQL 表逻辑

    我有一个表结构为 Table 3 Fruit ID Foreign Key Primary Key of Table 1 Crate ID Foreign Key Primary Key of Table 2 现在我需要执行一个查询 Upd
  • 为什么 OpenGL 混合在 HTC Desire 上不起作用?

    有谁知道如何在 HTC Desire 上启用 OpenGL android 混合 我正在尝试绘制彩色三角形并使用颜色缓冲区的 alpha 值将它们与背景 或另一个三角形 混合 它可以在模拟器 2 1 和 htc Hero 2 1 上运行 但
  • Pygame:奇怪的位块传送错误

    我一直在使用 Python 3 1 和 PyGame 2 7 开发一个简单的主菜单 当鼠标光标位于特定区域内时 屏幕上的文本应变为白色 我正在使用函数来块传输屏幕 第一个函数通常会按块传送主菜单 而其他两个函数会按块传送菜单并突出显示一些文
  • 使用 HTTP POST 发送 > 1MB 的文件

    我正在将视频和音频文件从 Android 应用程序发送到Wampserver 其中一些可能会变得相当大 我倾向于得到OutofMemory文件即将结束时出现问题1MB在尺寸方面 我将每个文件单独转换为字节流 我认为字节流太大 因此Outof
  • SQL Server 日志文件混乱

    我正在寻找有关 SQL Server 日志文件的一些说明 我有一个较大的数据库 2GB 最近由于某种原因没有备份 数据库的日志文件增长到大约 11GB 据我了解 这是数据库中发生的所有事务和语句 我的问题 是什么原因导致数据库日志文件被刷新
  • 从笛卡尔集中选择特定集的逻辑

    我正在制作一个密码暴力破解工具作为学习练习 并且我希望它可以恢复 所以 我想要的是能够说 这是可能的字符集 如果我计算该集的每个可能组合的笛卡尔集 长度为 n 那么点 x 的集是什么 但是 我想在不计算整个集合的情况下执行此操作 我在网上的
  • sqlite全文搜索中的sql注入

    考虑 sqlite3 fts4 表 c execute CREATE VIRTUAL TABLE docs USING fts4 content 以下内容是否可以避免 txt 包含字符串的 sql 注入 我不确定参数化查询是否安全 因为只有
  • Visual Studio 部署项目可选桌面快捷方式

    您好 我正在尝试获取与 VS2010 部署项目集成的可选桌面快捷方式 我在设置的部分添加了 TargetMachine 文件系统的 用户桌面 的快捷方式 并且在用户界面中设置了一个复选框对话框 如何让 Checkbox1Property 转
  • 在每个jsp页面中包含css和js文件

    我有常见的 css 和 js 文件 它们包含在每个 jsp 文件中 那么将它们包含在每个页面中的最佳实践是什么 我以前用过但我想知道这是否是最好 最干净的继续方式 我喜欢为此使用片段 它们是 JSP 支持的标准 因此不需要其他依赖项 正如您
  • Excel 2010 VBA 单步执行字符串并按顺序将一个字符放入每个单元格中

    很多很多年前 我已经习惯在 C 中进行字符串切片 但我正在尝试使用 VBA 来完成此特定任务 现在我已经创建了一个字符串 这是一个字符串 并创建了一个新的工作簿 我现在需要的是使用字符串切片将 t 放入 A1 h 放入 A2 i 放入 A3
  • AngularDart:路由名称的命名空间也分层?

    考虑以下分层路由的初始化 摘自AngularDart 教程 router root addRoute name add path add enter view view addRecipe html addRoute name recipe
  • 如何在IntelliJ IDEA中设置SDK?

    我没有找到任何在 IntelliJ IDEA 中设置 SDK 的方法 在 ubuntu 16 04 LTS 中找不到为 IntelliJ IDEA 设置 SDK 的任何路径 我正在使用这个 IDE 来处理 mongodb 但由于这个问题无法
  • Delphi 中的库项目是否有条件定义?

    我有一个实用程序单元 其中的代码在一些应用程序和 DLL 之间共享 我想根据当前项目类型有选择地编译本单元的部分内容 应用程序 包或库 我在中找不到库或包的任何条件定义System单位 Google 没有找到任何相关内容 那么 是否有任何条
  • 删除行后释放 postgres 数据库中的存储空间的步骤?

    我超过了 Heroku 上 postgres 数据库的 GB 限制 我找到了一个 非常大的 已弃用的表并运行Plot delete all 现在 17k 行表中有 0 行 我现在可以看到行号有差异 但 GB 没有差异 这是之前的数据大小 3
  • 将 NSPredicate 应用于 [(String, Array)]

    我以这种方式存储数据 var data String Array
  • Javascript 中两个日期初始化的差异

    为什么要做这些两个日期不同 var date1 new Date date1 setFullYear 2012 year four digits date1 setMonth 10 month from 0 11 date1 setDate
  • C++ 回调将文本发送回 C#

    我是 C 新手 我被告知使用 C 的 回调 是最好的解决方案 这是我的情况 我有一个用 C 编写的 DLL这个 DLL 有一个方法来启动通过 C 代码运行的服务 这工作正常 当 DLL 中的服务运行时 我希望 DLL 将文本传递回 C 代码