当前位置: 代码迷 >> C# >> c#怎么调用c++的指向指针的指针的接口
  详细解决方案

c#怎么调用c++的指向指针的指针的接口

热度:544   发布时间:2016-05-05 05:19:27.0
c#如何调用c++的指向指针的指针的接口?
问题描述:

    有一个c++ 写的dll,里面有对外发布的接口类似   void Get(IInterface** pInterface);    pInterface 是 in/out 参数。IInterface是继承于 Iunknown的接口。  
     现在有一个c#程序需要调用这个dll,请问改如何定义这个导出函数?貌似没有合适的参数传?


欢迎高手指教!!
------解决思路----------------------
 void Get(IInterface** pInterface); 

IInterface*这是个对象指针,在C#里你定义一个同样的对象就可以了,直接使用IntPtr。

IInterface interf = new IInterface ();
把interf转换成指针,把指针pinterf传入,
  Get(pinterf); 
得到pinterf后,再转换回去。
int size = Marshal.SizeOf(interf);
            IntPtr pinterf = Marshal.AllocHGlobal(size);
            try
            {
                Marshal.StructureToPtr(interf, pinterf, false);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }


试试这个方法行不行
------解决思路----------------------
 [ComVisible(true)]
    [Guid("E40223B3-DE70-4109-ADED-92A394618778")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

首先确定你的 DLL 是否只 COM 。
如果是,可以注册后,直接导入。 C# 对 COM 有完成的包装。
可以当作托管的 DLL 直接使用。

如果不是 COM 的。那么需要自己主动导出 接口 和相关的函数。
你可以在 C# 里面模拟虚表。
如果,觉得这个很麻烦,可以使用 C++/CLI 建立一个中间 DLL 。

------解决思路----------------------
引用:
Quote: 引用:

 void Get(IInterface** pInterface); 

IInterface*这是个对象指针,在C#里你定义一个同样的对象就可以了,直接使用IntPtr。

IInterface interf = new IInterface ();
把interf转换成指针,把指针pinterf传入,
  Get(pinterf); 
得到pinterf后,再转换回去。
int size = Marshal.SizeOf(interf);
            IntPtr pinterf = Marshal.AllocHGlobal(size);
            try
            {
                Marshal.StructureToPtr(interf, pinterf, false);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }


试试这个方法行不行



IInterface interf = new IInterface ();
怎么把interf转换成指针?


int size = Marshal.SizeOf(interf);
            IntPtr pinterf = Marshal.AllocHGlobal(size);
            try
            {
                Marshal.StructureToPtr(interf, pinterf, false);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
就是这个方法
  相关解决方案