什么是让C ++和WPF应用程序进行通信的好方法

时间:2012-09-14 08:41:19

标签: c++ wpf ipc

我有一个C ++ DLL,它是ADOBE Acrobat的一个插件。它需要经常(来回)和相当数量的复杂数据结构与WPF流程进行对话 任何想法可能是最好的方式。需要一些有点长期和可维护的东西,换句话说,会喜欢一些关于某些东西的想法,这些想法可以让两个流程都做出类似于方法调用的东西,而某些基础架构片段可以进行编组和调度。我已经尝试过Windows消息,但在ADOBE上遇到了一些冲突问题,对于导致dll加载adobe以加载CLR的任何事情也没有真正感兴趣。只有我想到的其他东西才是管道或http 在此先感谢

3 个答案:

答案 0 :(得分:1)

命名管道可以做,但你不会觉得只是调用函数。命名管道是相当低级的IPC。其他IPC选项包括:

  • Windows RPC,你肯定会觉得只是调用函数。
  • 如何在WPF应用程序中托管COM对象并从Adobe插件调用它?

答案 1 :(得分:1)

我会选择COM:

  • 在WPF应用中实现界面
  • 生成一个类型库(例如,使用regasm
  • 将typelib导入C ++ dll
  • 通信

如果你需要双向通信,C ++ DLL也可以实现一个COM接口,然后从WPF应用程序访问。

这是我用来将旧版C ++应用程序与新的.NET服务连接起来的,它运行得很好。最大的问题是找到了解COM的人,但幸运的是,这并不需要深入了解COM。

答案 2 :(得分:0)

你对COM的暗示非常有趣。我试图实现这个概念。 我在WPF CallDllFromWpf3Interface项目中创建了一个接口:

using System.Runtime.InteropServices;

namespace CallDllFromWpf3Interface
{
  [Guid("F6E0E2E8-CCC6-487B-8BF1-261265061E6A")]
  public interface SetValueInterface
  {
    void SetValue(int value);
  }
}

然后我用regasm工具生成了typelib: regasm CallDllFromWpf3Interface.exe / tlb

使用“oleview”工具,我可以看到typelib和界面。

下一步是创建一个名为“CallSetValueInterface”的c ++ dll项目。

在我的CallSetValueInterface.cpp文件中,我写了这一行:

#import "D:\Thomas\Programming\WPF\Basics\CallDllFromWpf\CallDllFromWpf3Interface\CallDllFromWpf3Interface\bin\Debug\CallDllFromWpf3Interface.tlb"

void
CallSetValueInterface::startAcq(void)
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    CallDllFromWpf3Interface::SetValueInterfacePtr Svip("f6e0e2e8-ccc6-487b-8bf1-261265061e6a");
    Svip->SetValue(55);
    Svip = NULL;
    CoUninitialize();
}

成功构建dll项目后,我将“CallSetValueInterface.dll”复制到“CallDllFromWpf3Interface”项目中。

最后我将我的WPF代码更改为:

#region SetValueInterface Members

public void SetValue(int value)
{
  MyValue = value;
}

#endregion

[DllImport("CallSetValueInterface.dll", EntryPoint = "startAcq", ExactSpelling = true, SetLastError = true)]
public static extern void StartAcqFromDll();

private void Button_Click(object sender, RoutedEventArgs e)
{
  StartAcqFromDll();
}

当调试器进入StartAcqFromDll()时,出现了一个错误对话框“在CallDllFromWpf3Interface.exe中发生了'System.Runtime.InteropServices.SEHException'类型的未处理异常”。

有人知道什么是错的吗?

此致

ThomasL。