【发布时间】:2011-08-11 03:17:31
【问题描述】:
我有一个 Delphi 编写的 DLL,它向 vb.net 应用程序公开了一些接口。 接口继承自 IUnknown(但如果需要,可以更改),简化示例:
IWindow = interface(IUnknown)
['{E9A11D0B-8A05-4CBA-83FA-C5CC6818DF6E}']
function GetCaption(var Caption: PChar): HRESULT; stdcall;
end;
vb.net 应用程序中的相同界面:
<ComImport(), Guid("E9A11D0B-8A05-4CBA-83FA-C5CC6818DF6E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IWindow
ReadOnly Property Caption() As <MarshalAs(UnmanagedType.LPWStr)> String
End Interface
一切正常。
现在我想将 IWindow 的集合传输到 vb.net,并且在 vb.net 应用程序中,我希望能够使用 for in 循环遍历它。
我读到可以使用 IEnumerable/IEnumerator,但我不太了解如何实现它们。有没有关于这个的好的教程,特别是显示双方的声明?示例代码会很棒。
请注意,我不希望创建应该注册和导入的 com dll。目前我导出了一个函数,使我能够获得一个接口。
【问题讨论】:
-
您确定 var Caption: PChar 吗?看起来您在 Delphi 中分配内存,但在 .net 代码中释放它。还是我看错了?
-
它是实现类中char数组的PChar,所以只要接口的refcount> 0,内存就有效。我正在使用接口,所以我不用担心关于分配和释放。
-
为了它的价值,我会用一个超级简单的 COM BStr 来做这件事。它是 Delphi 端的 WideString 和 .net 端的 UnmanagedType.BStr。它是使用 COM 分配器分配的。我知道这不是问题,但你还是一样。
-
@David Heffernan:出于特定的性能原因,我选择了它。不过,我真的很感谢“思考”!