有一个VC.NET的程序A,虽然.NET,但是是MFC的,它能实时地取得摄像头的视频帧。另有C#的程序B,实现移动侦测算法以及将视频帧写成avi的算法。该如何把A得到的BMP视频帧实时地、有效地传递给B呢?同时还要传递一些标志FLAG

解决方案 »

  1.   

    WIN32下的进程通信方法在.NET下好像几乎行不通
      

  2.   

    试过用dll的数据段通信,但是很奇怪的似乎无法在WIN32和.NET下兼容,照着书做的,其中DLL的头文件里有:#ifdef _cplusplus
    #define _DLLCOM_ extern "C" _declspec(dllexport)
    #else
    #define _DLLCOM_ _declspec(dllexport)
    #endif如果这么写的话,.NET里面找不到入口函数,如果只留一句
    #define _DLLCOM_ extern "C" _declspec(dllexport)
    的话,WIN32下又找不到了。崩溃啊~CreateFileMapping在.NET下似乎也不灵那GlobalAlloc呢?在.NET下导入后能否有效使用???
      

  3.   

    我也知道有很多种方法,但是不一定都管用我需要实时传递结构化数据,另外WIN32下的各种方法是否能在.NET下兼容,实现机制是否相同?比如CreateFileMapping,本身这个函数就是非托管函数,用在托管环境下就很麻烦,而且“非托管”和“托管”的环境所映射的内存似乎是不一样的
      

  4.   

    对于C#了解的不多,如果支持命名管道的话,就好办了,结构化的数据是肯定能传递的,只使调用WriteFile向管道句柄里写数据就可以,VC下的命名管道几个基本函数:
    CreateNamedPipe
    ConnectNamedPipe
    DisconnectNamedPipe
    FlushFileBuffers
    PeekNamedPipe
      

  5.   

    看看下面这个会不会对你有用:
    .Net中封装Windows 消息实现进程间通讯 
    http://www.cnblogs.com/PeanutLee/archive/2006/11/03/548538.html
      

  6.   

    我介绍另外一种方式:将你的c#导出为一个com组件接口,这样无论什么语言都可以直接使用了。导出方法详细解答:
    15. 使用C#写的组件(创建类型为Class Library):
    1> C#必须使用interface,且实现类中需要将构造函数显示的声明为public:
        public interface ISUPCommand
        {
            Boolean SendCommand(string sCom);
        }
        public class SUPCommand : ISUPCommand
        {
            public SUPCommand()
            {
            }        public Boolean SendCommand(string sCom)
            {
                return true;
               
          }
    2> 需要将AssemblyInfo.cs中的ComVisible改为true:
    [assembly: ComVisible(true)]
    3> 为了使其它C++程序可以使用编译好的DLL,需要将该程序集标记为带签名的强类型(强类型可以全局使用,非强类型只能在同一目录下被使用).使用以下命令产生一个签名文件,并将它加入到C#工程里面:
    sn -k ATLCOMTest.snk     然后在工程属性页中指定该签名文件:        重新编译之.4> 使用以下命令生成并注册生成的DLL程序集文件:
    regasm /tlb:ATLCOMTest.tlb ATLCOMTest.dll
    5>  注册好类型库后,可以在oleview看到,实际上C#组件是通过.NET提供的一个代理DLL来向外公布接口的,因为C#是托管的,而COM组件是非托管的.为了能让大家都可以使用该C#组件,还需要用以下命令将该程序集安装到全局程序集里去:
    gacutil /i ATLCOMTest.dll 
        OK,你现在可以在C:\WINNT\assembly目录下看到你的程序集了.这个过程我理解只是将此DLL的信息注册到了了全局程序集中,真正的DLL还是位于你当前的目录下.
    6>   到此为止,这个C#的DLL现在就”变成”了一个COM了.C#的interface对应的被映射成了COM的接口,数据类型也被一一映射了.具体对应关系,请查看MSDN。如果还搞不定,请发mail至[email protected],大家一起探讨
      

  7.   

    上面的方案如果对你有帮助,别忘记给俺加分哟。本人很少上csdn,最近上来看到上面有很多问题没什么人给出好的方案,所以我就来瞎说了。但我还是想捞点分,嘿嘿
      

  8.   

    谢谢各位,我用createfilemapping解决了