c#如何调用c++的指向指针的指针的接口?

caxton8310 2014-09-25 05:57:52
问题描述:

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


欢迎高手指教!!
...全文
377 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
caxton8310 2015-01-04
  • 打赏
  • 举报
回复
最后用com的方式 搞定了,谢谢各位!结贴。
caxton8310 2014-10-10
  • 打赏
  • 举报
回复
呼唤高手!!!
mjp1234airen4385 2014-10-09
  • 打赏
  • 举报
回复
引用 10 楼 caxton8310 的回复:
[quote=引用 9 楼 Saleayas 的回复:] 首先按照你的接口定义方法定义一个带布局的接口,其成员为接口方法的委托。 委托必须和接口中的方法一致。(这就是虚表) 然后,定义一个托管版的接口。这个接口自己定义,怎样都可以,只要语义一致就可以。 这个接口将暴露给你的使用者。 定义一个数据结构,实现托管版的接口。在这个数据结构中保存两个数据, 1、 void Get(IInterface** pInterface); 获取的接口。(定义为 IntPtr) 2、根据接口获取其指向的虚表,并转换为托管版的那个带布局的接口。(PtrToStruct 必须使用接口指向的虚表,不能直接用接口做参数)。 实现每一个托管版的接口就可以了。 如果,简单一点, 不需要实现那个带布局的接口。 你可以直接根据接口,获取虚表,进而或者指定的方法的指针,然后转换为托管的委托,然后,直接使用这个委托来呼叫。
高手啊,麻烦给点代码示例下. [c++] Interface test1 { void a(); void b(char*a); }; Interface test { void GetTest1(test1**pptest); void b(char*a); }; dll 对外发布唯一接口: void Get(test** a); 请问c#部分如何实现,给点伪代码展示下如何访问 test1 的 a()函数, 谢谢了! [/quote] 如果是这种的话,想实现就困难了。 这相当于传递接口实例了,这种的情况还是另觅他途吧。 用C++做个中间类库什么的,然后导出简单的数据类型供C#调用
caxton8310 2014-10-09
  • 打赏
  • 举报
回复
引用 9 楼 Saleayas 的回复:
首先按照你的接口定义方法定义一个带布局的接口,其成员为接口方法的委托。 委托必须和接口中的方法一致。(这就是虚表) 然后,定义一个托管版的接口。这个接口自己定义,怎样都可以,只要语义一致就可以。 这个接口将暴露给你的使用者。 定义一个数据结构,实现托管版的接口。在这个数据结构中保存两个数据, 1、 void Get(IInterface** pInterface); 获取的接口。(定义为 IntPtr) 2、根据接口获取其指向的虚表,并转换为托管版的那个带布局的接口。(PtrToStruct 必须使用接口指向的虚表,不能直接用接口做参数)。 实现每一个托管版的接口就可以了。 如果,简单一点, 不需要实现那个带布局的接口。 你可以直接根据接口,获取虚表,进而或者指定的方法的指针,然后转换为托管的委托,然后,直接使用这个委托来呼叫。
高手啊,麻烦给点代码示例下. [c++] Interface test1 { void a(); void b(char*a); }; Interface test { void GetTest1(test1**pptest); void b(char*a); }; dll 对外发布唯一接口: void Get(test** a); 请问c#部分如何实现,给点伪代码展示下如何访问 test1 的 a()函数, 谢谢了!
Saleayas 2014-09-30
  • 打赏
  • 举报
回复
首先按照你的接口定义方法定义一个带布局的接口,其成员为接口方法的委托。 委托必须和接口中的方法一致。(这就是虚表) 然后,定义一个托管版的接口。这个接口自己定义,怎样都可以,只要语义一致就可以。 这个接口将暴露给你的使用者。 定义一个数据结构,实现托管版的接口。在这个数据结构中保存两个数据, 1、 void Get(IInterface** pInterface); 获取的接口。(定义为 IntPtr) 2、根据接口获取其指向的虚表,并转换为托管版的那个带布局的接口。(PtrToStruct 必须使用接口指向的虚表,不能直接用接口做参数)。 实现每一个托管版的接口就可以了。 如果,简单一点, 不需要实现那个带布局的接口。 你可以直接根据接口,获取虚表,进而或者指定的方法的指针,然后转换为托管的委托,然后,直接使用这个委托来呼叫。
caxton8310 2014-09-30
  • 打赏
  • 举报
回复
global.ITest test = new global.CTest(); int size = Marshal.SizeOf(test); //出错 显示信息为: 其他信息: 类型“global+CTest”不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量
mjp1234airen4385 2014-09-28
  • 打赏
  • 举报
回复
引用 3 楼 caxton8310 的回复:
[quote=引用 2 楼 mjp1234airen4385 的回复:] 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转换成指针?[/quote] int size = Marshal.SizeOf(interf); IntPtr pinterf = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(interf, pinterf, false); } finally { Marshal.FreeHGlobal(buffer); } 就是这个方法
caxton8310 2014-09-28
  • 打赏
  • 举报
回复
引用 5 楼 Saleayas 的回复:
[ComVisible(true)] [Guid("E40223B3-DE70-4109-ADED-92A394618778")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 首先确定你的 DLL 是否只 COM 。 如果是,可以注册后,直接导入。 C# 对 COM 有完成的包装。 可以当作托管的 DLL 直接使用。 如果不是 COM 的。那么需要自己主动导出 接口 和相关的函数。 你可以在 C# 里面模拟虚表。 如果,觉得这个很麻烦,可以使用 C++/CLI 建立一个中间 DLL 。
不是 COM 的,求解?怎么写
caxton8310 2014-09-26
  • 打赏
  • 举报
回复
引用 2 楼 mjp1234airen4385 的回复:
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转换成指针?
mjp1234airen4385 2014-09-26
  • 打赏
  • 举报
回复
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); } 试试这个方法行不行
caxton8310 2014-09-26
  • 打赏
  • 举报
回复
没人会?没人会?
Saleayas 2014-09-26
  • 打赏
  • 举报
回复
[ComVisible(true)] [Guid("E40223B3-DE70-4109-ADED-92A394618778")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 首先确定你的 DLL 是否只 COM 。 如果是,可以注册后,直接导入。 C# 对 COM 有完成的包装。 可以当作托管的 DLL 直接使用。 如果不是 COM 的。那么需要自己主动导出 接口 和相关的函数。 你可以在 C# 里面模拟虚表。 如果,觉得这个很麻烦,可以使用 C++/CLI 建立一个中间 DLL 。
caxton8310 2014-09-26
  • 打赏
  • 举报
回复
c++中实现大概是这样的 interface ITest { int Hello() = 0; } class Ctest: public ITest { ............... } dll 导出函数是这样的 void GetITest(ITest** pTest); c# 尝试如下: 1)定义接口 [ComVisible(true)] [Guid("E40223B3-DE70-4109-ADED-92A394618778")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface ITest { int Hello(); } 2)定义 导出函数 [DllImport("SpeedData.dll")] public static extern int GetITest(ref IntPtr speedObj); 3)调用 IntPtr test = IntPtr.Zero; GetITest(ref test); PtrToStructure(...) //发现不成功 我刚用c#不太会,求解!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧