问题标签 [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 回答
3416 浏览

.net - 从 .NET 向 COM 公开事件

最近我遇到了将事件从 .NET 公开到 COM 的问题。

我在这个例子中取得了成功(概念上取自http://blogs.msdn.com/andreww/archive/2008/10/13/exposing-events-from-managed-add-in-objects.aspx):

// 我们自定义事件的委托类型。

这很好用,因为 IAddInEvents 接口被定义为IDispatch。但是,我需要发布一个 IUnknown 事件源接口。我无法控制事件接口,因为它来自第三方库(也将是已发布事件的消费者)。每当我尝试挂钩事件时,VB 环境(我试图接收事件的地方)就会崩溃,第三方产品(ESRI ArcMap)使用的 VBA 环境也会崩溃。

我已经能够(部分)手动实现IConnectionPointContainer接口(COM 在后台使用它来处理事件),然后我能够接收事件并进入我的 IConnectionPointContainer 实现。但是,这对我来说似乎有点矫枉过正,我认为 .NET 中必须对此提供隐式支持。其次,通过这种方法,我立即失去了代表的支持。

有人对这个有经验么?提前致谢。

0 投票
2 回答
2399 浏览

windows - 实现 IUnknown,未解析的外部符号

我正在尝试创建一个实现IUnknown接口的类。我在头文件中有以下代码:

我已经包括了相关的uuid.lib和其他几个。但是,当我尝试编译时,出现错误:

错误 2 错误 LNK2001: 无法解析的外部符号 "public: virtual long __stdcall Vmr9Presenter::QueryInterface(struct _GUID const &,void * *)" (?QueryInterface@Vmr9Presenter@@UAGJABU_GUID@@PAPAX@Z) Vmr9Presenter.obj VmrPresenter

这让我相信有些东西没有被拉进来。关于如何摆脱这个错误的任何建议?

0 投票
3 回答
949 浏览

windows - 是否值得在 QueryInterface() 实现中检查空指针?

向 IUnknown::QueryInterface() 传递了一个 void** 参数,该参数表示将检索到的接口放置在哪里的地址。

QueryInterface() 的实现应该检查这个指针是否为空(然后立即返回 E_POINTER)还是只写在那里?

我见过很多与 COM 相关的代码,几乎所有地方都没有进行检查。假设有人当然可以将空指针作为这个参数传递,但真的需要这样的检查吗?

0 投票
2 回答
409 浏览

c# - 使用窗口句柄获取 IUnkown

我知道这可能是一个很长的镜头,所以请原谅我,因为我对 COM 不太了解。

基本上我要做的是获取指向正在运行的应用程序的 IUnknown 接口的指针,问题是我对应用程序唯一了解的是它的主窗口句柄。

这可能吗?

0 投票
1 回答
839 浏览

c# - 在托管 (C#) 代码中实现 COM“接收器”

我有一个接受接收IUnknown器的旧 COM 控件(核心)。目的是让 Core 通过这个 sink 接口读/写数据。Core/Sink 指针目前在遗留系统中使用,不容易修改。

我遇到的问题是,当我尝试从托管代码调用 Core 并传入一个(尝试)在托管代码中实现接收器的对象时。我已经将核心调试到它准备调用接收器的程度。在通话之前(而不是之后),我收到类似于以下内容的消息:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存...

我已经在纯遗留代码中看到并解决了这些问题,但是托管代码的引入让我感到困惑。

这是我认为必要的两个接口的最小表示。

来自 IDL 的数据访问“接收器”(为简化问题演示而减少)

我在 C# 中尝试了各种接收器的实现,但无济于事或错误条件发生变化。这是最新的实现,是的,我手动编码了接口定义,因为使用类型库中的那个不起作用。(同样的问题)

0 投票
2 回答
1813 浏览

windows - 在 C++ 中挂钩 IDispatch v-table

我正在尝试修改IDispatch系统中已经存在的接口的行为。为此,我的计划是在运行时挂钩到对象 v-table 并修改指针,使其指向自定义挂钩方法。

如果我能让它工作,我可以向现有对象添加新方法和属性。好的。

首先,我尝试连接到 v-table for IUnknown(从中IDispatch继承)并且效果很好。但是,尝试更改条目IDispatch根本不起作用。什么都没有发生,代码就像没有钩子一样工作。

这是代码,它非常简单,所以理解起来应该没有任何问题

0 投票
1 回答
576 浏览

visual-studio-2008 - 将 IID_IDXGIDevice 传递给 IUnknown::QueryDevice 时 DXGI 出现链接器错误

我试图在我的渲染框架中将 Swapchain 和 Window 创建与 D3D10 设备创建分开,这意味着我不能真正使用 D3D10CreateDeviceAndSwapChain。我在尝试构建我的测试应用程序时遇到了意外的链接器错误。

我包括 DXGI.h 并链接到 DXGI.lib 以及 D3D10 库,但仅此而已。

问题代码如下:

if(FAILED(hr = pDXGIFactory->QueryInterface(IID_IDXGIDevice, reinterpret_cast(&pDXGIDevice)))) 返回 hr;

我得到的链接器错误与 _IID_IDXGIDevice 是一个未解析的外部符号有关,但我找不到有关我应该链接到哪些附加库的信息。任何建议,将不胜感激。

我正在使用 Win7 x64、VS2008 和最新版本的 DirectX SDK。

0 投票
1 回答
402 浏览

python - 如何从 WDM 驱动程序 CreateInstance 中获取 IUnknown

在文档中(C++ 示例)

我试试这个

如何获得 IUKNOWN 和 QueryInterface?

0 投票
4 回答
295 浏览

c++ - D3D 和 COM 的问题

所有的 D3D 接口都派生自 COM 的 IUnknown 接口,所以我会采取一种简单的方法来释放 D3D 对象并使用类似这样的东西:

但这不起作用,因为当我尝试使用它时,编译器会生成无效的类型转换错误。我能想到的唯一方法是:

但后来我失去了一些功能,它也看起来(并且)非常狡猾。有一个更好的方法吗?像我的第一个示例一样工作的东西将是最佳的,尽管我想避免使用任何宏(如果可能的话)

0 投票
2 回答
2032 浏览

com - 使用 ATL 和 IUnknownPtr 时正确的转换方法是什么?

在修改现有 ATL COM 对象的过程中,我看到了一篇来自“The Old New Thing”博客的文章,名为“人们搞砸 IUnknown::QueryInterface 的方式”,评论部分开始讨论其中一个受访者 (Norman Diamond) 指出,在文章的一个示例中,强制转换为 void** 是不正确的。

但是,当我尝试纠正我的代码以正确进行转换时,我最终会出现内存泄漏。

示例如下:

诺曼说

朋克不是虚无*。朋克是一个未知数*。

void** 不是通用指针类型。void* 是一种通用指针类型,并且 char* 和亲戚以这种方式被视为等价,但 void** 不是。

如果你想遵守调用约定并避免可怕的死亡,你必须这样做:IUnknown *punk; 无效*朋克无效;psf->QueryInterface(IID_IUnknown, &punkvoid); 朋克 = (IUnknown *)punkvoid;

许多其他 MSDN 贡献者犯了同样的错误……有些人可能会说它在迄今为止的所有 VC++ 实现中都有效,但这并不能使它成为正确的代码,而且它仍然违反了调用约定。

鉴于此,我去更改我的旧代码 - 如下:

然后我将其更改如下:

但是现在我的应用程序有一个来自 COM 对象的内存泄漏