问题标签 [iunknown]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
501 浏览

delphi - 在 Delphi 6 类声明中分配接口指针?

尽管进行了多年的 Delphi 编程,但我还是遇到了一种我从未见过的支持 IUnknown 的类的类声明风格:

如您所见,将类方法分配给 IUnknown 接口方法是在类声明中完成的。这对我来说看起来真的很奇怪,特别是因为在调用构造函数之前我看不到如何分配 IUnknown 方法。这是某种编译时快捷方式,用于在类的方法和类接受的接口的接口指针之间进行分配,稍后在运行时解决?如果有人能提供一些关于它是如何工作的信息以及德尔福成语支持这种结构的信息,我想知道。

0 投票
1 回答
624 浏览

.net - 在 .NET 中使用 IUnknown 派生的 ATL COM 对象

我的 IDL:

我的 COM 类:

我的 .NET 客户端:

客户端收到异常“System.AccessViolationException: Attempted to read or write protected memory...”。为什么?

我正在使用 Visual Studio 2008、Windows Vista x64。C++ 和 C# 项目具有 x86 配置。

0 投票
1 回答
1161 浏览

.net - 'object[]' 的托管到非托管封送处理为 IUnknown

我正在使用 P/Invoke 从 C# 调用非托管 C 函数,并传递对象数组。在非托管代码中,我为 IDispatch 查询 IUnknown。这适用于简单的情况,但如果其中一个对象是数组本身,则获取 IDispatch 失败。

托管代码:

非托管代码:

QueryInterface 大部分时间都是成功的。但是,如果托管对象实际上是“System.Object[]”,则无法获得 IDispatch 接口(hr = 0x80004002 = E_NOINTERFACE = '不支持此类接口')。

我可以以某种方式使用 MarshalAs(...) 来解决这个问题吗?还是有另一种方法可以让它发挥作用?

0 投票
0 回答
383 浏览

silverlight - Silverlight 的 Marshal.GetObjectForIUnknown 替代品

在 WPF 中,我可以使用以下内容:

我的 INuiFrameTexture 看起来像这样:

现在我试图在 Silverlight 中实现相同的目标,但该框架没有 GetObjectForIUnknown 方法。有人知道在 Silverlight 中是否有办法做到这一点?

0 投票
2 回答
958 浏览

c# - 将 .NET 位图对象传递给 COM(DirectShow 过滤器)

我正在尝试创建一个源过滤器,该过滤器根据一系列图片制作实时视频流。为此,我创建了一个 IUnknown 接口:

在我的程序中,我明白了:

当我传递简单类型时,一切正常。但是当我尝试传递一个 C# Bitmap 对象时,我得到一个错误unable to cast Com object to <my object type>。或应用程序因错误 APPCRUSH 而关闭。

我知道这不是正确的方法,但我不知道其他可能的参数传递方式。我试图将 IntPtr 传递给 BitmapData,然后我得到了相同的应用程序迷恋。那么如何将位图传递给 DirectShow 过滤器呢?

结果:完整的代码图片请参考创建界面:

执行:

在应用中:

0 投票
2 回答
4127 浏览

c++ - C++ 指向未知类成员函数的指针

免责声明我不使用BOOST或其他库

最后,我了解了PointerToMemberFunction 的工作原理。这是我的示例代码

现在,问题是什么。Bar::bar必须以某种方式进行修改,因为在实际项目中它不会知道,什么类fooFnPtr是指向. 换句话说Bar::bar,必须与任何类一起工作,而不仅仅是Foo. 我不知道,一个指向传递给什么类的实例的指针Bar::bar

可以帮助的一件事是,所有将与之合作Bar::bar的班级都是一个班级的孩子!

这可以实现吗?如何实现?如何修复我的代码?提前致谢!

0 投票
2 回答
2388 浏览

c# - 将 IUnknowns 的 SAFEARRAY 转换/转换为接口指针的可迭代数组

我在 C# 中有以下接口,其中一个具有相同名称(没有我)的类实现它。

公共类 Order 的实现: IOrder 只是三个私有字段和一个带有所需 3 个参数的构造函数。

在其他地方,我有以下方法,其结果是我想在 C++ 非托管代码中工作,通过 COM 和 .tlb/.tlh 文件传输到那里。

我已经设法使用 C# 托管代码在 C++ 非托管代码之间进行基础工作。

但是类数组被证明是一个不同的挑战......

我承认,对我来说,COM 是新的,令人困惑,C++ 早已被遗忘......,但我正在开发这两个库,所以我不会放弃;我希望 C++ DLL 在某些程序和我的 C# 代码之间充当代理。

澄清:我既没有使用 MFC 也没有使用 ATL。我在 C++ 代码中使用#import 来获取 C# 生成的接口和类指针以及其他我不太了解的 COM 内容。

经过一个小时的研究,我只是去这里寻求帮助>.<

以下是我想要实现的 C++ 代码。

现在,我需要一些我还不明白的 COM 魔法来将 SAFEARRAY* 转换为 IOrderPtr* 或其他东西,这样我就可以遍历返回的整个数组并调用“Order”类型的方法

  • 获取数量()
  • 获取订单类型()
  • 获取位置类型()

因此,对于第一个周期,我将获得值 1、2、3,对于第二个周期,我将获得值 4、5、6。

因为我是 C++ 和 C# 库的作者,所以我可以跳过所有这些 COM 疯狂的东西,并制作方法来获取集合计数和其他方法来获取特定索引上的属性值。

但这似乎并不好。我怀疑我想要的机制很简单,但我在谷歌上找到的所有答案总是缺少一些东西。

0 投票
1 回答
317 浏览

.net - 如何处理返回未记录的 IUnknown 的 COM 服务器方法

我从类型库(硬件 SDK 的一部分)导入的 COM 接口的一些方法返回或接收 IUnknown 类型的值。例如,SDK 文档指定方法如下:

但是 Delphi 像这样导入了这些方法:

InputSelection 类型似乎是一个简单的整数或枚举类型,但没有在任何地方指定。该文档仅提供了 14 种不同可能值及其含义的表格。

理想情况下,我想声明我自己的类型:

以下是类型库如何定义这些函数:

但我怎样才能使这项工作?

0 投票
1 回答
348 浏览

c++ - DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备参考?

我正在编写一个带有directX api的程序。我开始使用 DXUT。我在尝试控制 directX 设备的引用计数时遇到问题。似乎每次我调用 D3DXCreateMesh()、D3DXCreateTextureFromFile() 或 IDirect3DDevice9::CreateVertexBuffer() 时都会向设备添加一个引用。我尝试使用“SYSTEMMEM”标志将新创建的对象(网格、纹理或顶点缓冲区)存储在系统内存中,而不是将其存储在设备的分配中。这是一个添加了对设备的引用的调用示例...

有关此问题的任何想法或信息链接?这是可以预料的吗?到目前为止的解决方案是在每次调用上述函数后直接释放设备 (m_pd3dDevice->Release())。当 DXUT 尝试释放设备时,会抛出一个错误,指出设备的引用计数大于零。

0 投票
3 回答
795 浏览

c++ - 将 DirectX 接口转换为 IUnknown 指针

我的代码中有很多接口,我想将重复Release代码封装在另一个方法中,而不是宏中,因为这是 C++,我讨厌使用宏。我最初的尝试是编写一个方法,例如

但是,将此方法应用于IDirect3DSurface9 *例如类似会SafeRelease(&mySurface)产生错误IDirect3DSurface9 **IUnknown **.

  1. 我在这里做错了什么?
  2. 有没有更好的方法(希望不使用宏)来实现这样的功能?