问题标签 [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.
.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 中必须对此提供隐式支持。其次,通过这种方法,我立即失去了代表的支持。
有人对这个有经验么?提前致谢。
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
这让我相信有些东西没有被拉进来。关于如何摆脱这个错误的任何建议?
windows - 是否值得在 QueryInterface() 实现中检查空指针?
向 IUnknown::QueryInterface() 传递了一个 void** 参数,该参数表示将检索到的接口放置在哪里的地址。
QueryInterface() 的实现应该检查这个指针是否为空(然后立即返回 E_POINTER)还是只写在那里?
我见过很多与 COM 相关的代码,几乎所有地方都没有进行检查。假设有人当然可以将空指针作为这个参数传递,但真的需要这样的检查吗?
c# - 使用窗口句柄获取 IUnkown
我知道这可能是一个很长的镜头,所以请原谅我,因为我对 COM 不太了解。
基本上我要做的是获取指向正在运行的应用程序的 IUnknown 接口的指针,问题是我对应用程序唯一了解的是它的主窗口句柄。
这可能吗?
c# - 在托管 (C#) 代码中实现 COM“接收器”
我有一个接受接收IUnknown
器的旧 COM 控件(核心)。目的是让 Core 通过这个 sink 接口读/写数据。Core/Sink 指针目前在遗留系统中使用,不容易修改。
我遇到的问题是,当我尝试从托管代码调用 Core 并传入一个(尝试)在托管代码中实现接收器的对象时。我已经将核心调试到它准备调用接收器的程度。在通话之前(而不是之后),我收到类似于以下内容的消息:
运行时检查失败 #0 - ESP 的值未在函数调用中正确保存...
我已经在纯遗留代码中看到并解决了这些问题,但是托管代码的引入让我感到困惑。
这是我认为必要的两个接口的最小表示。
来自 IDL 的数据访问“接收器”(为简化问题演示而减少)
我在 C# 中尝试了各种接收器的实现,但无济于事或错误条件发生变化。这是最新的实现,是的,我手动编码了接口定义,因为使用类型库中的那个不起作用。(同样的问题)
windows - 在 C++ 中挂钩 IDispatch v-table
我正在尝试修改IDispatch
系统中已经存在的接口的行为。为此,我的计划是在运行时挂钩到对象 v-table 并修改指针,使其指向自定义挂钩方法。
如果我能让它工作,我可以向现有对象添加新方法和属性。好的。
首先,我尝试连接到 v-table for IUnknown
(从中IDispatch
继承)并且效果很好。但是,尝试更改条目IDispatch
根本不起作用。什么都没有发生,代码就像没有钩子一样工作。
这是代码,它非常简单,所以理解起来应该没有任何问题
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。
python - 如何从 WDM 驱动程序 CreateInstance 中获取 IUnknown
在文档中(C++ 示例)
我试试这个
如何获得 IUKNOWN 和 QueryInterface?
c++ - D3D 和 COM 的问题
所有的 D3D 接口都派生自 COM 的 IUnknown 接口,所以我会采取一种简单的方法来释放 D3D 对象并使用类似这样的东西:
但这不起作用,因为当我尝试使用它时,编译器会生成无效的类型转换错误。我能想到的唯一方法是:
但后来我失去了一些功能,它也看起来(并且)非常狡猾。有一个更好的方法吗?像我的第一个示例一样工作的东西将是最佳的,尽管我想避免使用任何宏(如果可能的话)
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 对象的内存泄漏