gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:07:02 25 4
gpt4 key购买 nike

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

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


我环顾四周并被告知实现此目的的最佳方法是使用回调,我真的不知道如何实现它。有没有人有任何我可以查看的建议或文章?请包括 C++,因为我对 C++ 的经验为零。


干杯

最佳答案

可能有更简洁的方法,但这里是我用来让它工作的一些步骤。

定义委托(delegate)和函数以将其传递给您的 DLL。参数是将被发送回 C# 委托(delegate)的内容:

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

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

创建一个变量来存储委托(delegate)。确保这不会超出范围。在我的测试中,我发现 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 );

关于c# - C++ 回调将文本发送回 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5030936/

25 4 0