问题标签 [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 投票
1 回答
69 浏览

c++ - 如何知道 C2259 VS 2017 错误没有实现哪种方法?

我正在定义一个新接口和一个实现它的类。我在 idl 文件中添加了我的类(XXX)和接口(IXXX)(我生成了两个 uuid)。我的界面有两个简单的方法。我已经实现了它们(文件 XXX.h 和 XXX.cpp)。我在 InprocServer.cpp 中包含以下行。

我收到以下错误:错误 C2259 'XXX': cannot instantiate abstract class (compileing source file InprocServer.cpp) 单击错误将我带到以下行

我怎么知道哪个方法没有实现?

0 投票
2 回答
113 浏览

c++ - COM 客户端连接 COM 服务器需要哪些文件(进程外场景)?

我想了解本文中提到的文件的用途,并将知识链接到我当前的 COM 服务器和 COM 客户端场景,以便我可以实现我的 COM 服务器以使用 COM 服务器:这个

我有一个 COM 服务器,它是一个在后台运行的 exe 或服务。现在,我知道有一个继承自 IUnknown 和 IDispatch 的公开接口。此外,我还生成了以下文件:

  1. xxx_i.c 定义了所有的 CLSID 和 IID

  2. xxx_i.h 定义了接口支持的所有方法

  3. xxx_pc ?

  4. dlldata.c ?

我现在使用自动化方式 IDispatch -> Invoke() 来访问接口方法。尽管这种方式在不使用上述任何文件的情况下似乎可以正常工作,但我仍然想了解它们的用途,同时使用常规方式 IUnknown -> QueryInterface() 来访问这些方法。

由于我是 COM 世界的新手,任何建议的阅读将不胜感激!谢谢!

0 投票
0 回答
539 浏览

arrays - 为什么在尝试分配一个变体时,某个非 IDispatch 公开对象类型的数组,而是分配了数组指针?

概括

在为某些对象类型声明数组后,该类型不使用派生COM接口的IDispatch接口(&因此未正确设置以启用 [OLE] Automation的后期绑定技术),尝试根据我的期望,将数组分配给Variant变量不起作用。

具体来说,似乎发生的是指向数组的整数指针被分配给Variant变量,而不是数组的副本。

谁能解释这种行为?它是 VBA 7.1 语言的标准行为吗?[EDIT-A1]是不是 VBA 的Variant类型不能处理这样的数组?[编辑-A2]


[EDIT-A1] -目前(2019 年 4 月 6 日),它看起来像是一个错误。
[EDIT-A2] -不,因为参数的内部过程参数ByRef Variant可以正确指向此类数组,如果此类数组作为此类参数的值传递。



背景

有关似乎正在发生的事情的更多详细信息

在检查了各种内存地址和指针之后,似乎正在发生的事情是,当将此类数组分配给Variant变量时,指向数组的“VB 安全数组指针”Long的(或LongPtr)指针被分配了。与 VBA 语言规范中记录的数组复制行为相反,这是预期的行为。在查看了关于 VB 数组及其内存布局的 VB6 文档(存储在此处)后,我推断出这种指针分配正在发生。

我对以前是否记录过问题的研究

我搜索了互联网、Office VBA 参考文档和VBA 语言规范,以查看其他人是否记录了此问题。我发现这个问题可能已经部分记录的唯一地方是在此处发布的 Stack Overflow 答案中。不幸的是,这篇文章并没有对这个问题说太多。

我已经测试过这个问题的特定数组类型

我在以下对象类型的数组中遇到了这个问题,这些对象类型使用的接口不是来自IDispatch

  • stdole.IUnknown *
  • stdole.IFont
  • mscoree.CorRuntimeHost
  • mscorlib.AppDomain
  • mscorlib.Type

* 来自stdole2.tlb. † 来自.NET 框架v4.0.30319
的 COM 类型库。

更多关于使用非派生接口的对象类型IDispatch

这样的对象类型就是vbDataObject类型。不幸的是,当前关于vbDataObject常量的 VBA 文档是不准确的。我正在更新文档,您可以在此处查看我对常量的更新定义。

[编辑 - COM 规范链接已删除,因为它不再相关。]


关于其他对象类型的数组

类型数组vbObject(支持 [OLE] 自动化后期绑定技术的 COM 对象类型)似乎以Variant直接和预期的方式分配给变量 -数组被复制并直接分配

使用 VBE 手表检查此类数组时,VBE 曾经崩溃

一个可能相关的问题与一个错误有关,当 VBE监视表达式被放置在一个类型的数组上时,该数组使用的接口不是IDispatch. 用于导致 VBE 意外崩溃的错误。微软似乎已在上个月修复了此错误。

软件版本

‡ 版本全文为“Retail 7.1.1088”——最新版本。
§ 更具体地说,最新版本和内部版本(2019 年 6 月 3 日发布,版本 1905,内部版本 11629.20214),以及更早的内部版本号 11629.20196 和 11601.20204(首次发布于 2019 年 5 月 14 日)。
ver.exe程序打印“Microsoft Windows [版本 6.3.9600]”

代码

代表

我希望存储数组MyVariant的副本。MyArray

相反,在 32 位版本的 VBA 中,MyVariant存储一个Long看起来是指向MyArray.

调试问题

单击此处 获取 VBA 代码以帮助调试问题。

0 投票
1 回答
126 浏览

winapi - 指向 IFileOperation::DeleteItems 方法的 IShellItemArray 的 IUnknown 的指针

我正在尝试实现 IFileOperation 接口,需要帮助理解 IFileOperation::DeleteItems 方法的 punkItems 参数。在文档页面上,punkItems 参数被描述为

指向 IShellItemArray、IDataObject 或 IEnumShellItems 对象的 IUnknown 的指针,该对象表示要复制的项目组。

以下代码显示了我如何使用 SHCreateShellItemArrayFromIDLists() 函数来生成 IShellItemArray:

但感觉就像我错过了一些东西,例如参数描述的 IUnknown 部分。上述代码有效,但 A_LastError 产生 ERROR_NO_TOKEN - 尝试引用不存在的令牌 (1008)。您能帮我理解如何获得“指向 IShellItemArray 的 IUnknown 的指针”吗?

谢谢你。

0 投票
3 回答
491 浏览

c++ - 为什么 COM 指针参数转换为 void 而不是 IUnknown?

如果这是一个愚蠢的问题,我深表歉意,但我不清楚为什么 COM 指针参数通常被转换为(void**)而不是(IUnknown**). 然后有时IUnknown实际上会使用指针,例如 with IObjectWithSite::SetSite。谁能解释一下?

0 投票
1 回答
162 浏览

c# - 源自“System.Transactions.JitSafeGetContextTransaction”的“无法转换”异常?

就在最近,我的应用程序一直不一致地抛出各种异常,例如:

(最后一个可能是其他的次要效果)

其中一些的堆栈跟踪粘贴在下面,但请注意,它们都具有以下 3 个最后步骤:

观察 - 这些例外:

  1. 经常发生,但不是一直发生(50%?)
  2. 当确实发生时不要总是产生相同的异常
  3. 与我的应用程序中导致它们的代码没有明显的联系
  4. 可在各种 PC 上重现
  5. 在我所做的任何搜索中都无法准确找到

该应用程序是一组通过 COM 从旧 VB6 代码调用的 C# DLL。然而,这已经存在多年,我们最近没有改变任何关于如何完成的事情。

它不是一个多线程的应用程序,所以涉及的演员表System.Threading.Thread似乎不合适。有一个第三方模块使用了线程,但我们把它作为实验拿出来:这样做并没有解决问题,但似乎减少了错误的频率。这使我认为这是某种资源破坏问题。


我正在寻找建议,例如:

  • 如果您以前确实见过这种异常模式,那么原因是什么?

  • 关于如何调试根本问题的建议


示例堆栈跟踪:


编辑:

我尝试使用 windbg(使用托管代码的 SOS 扩展)对此进行调查。

它能够打破异常。这是从那时起的堆栈跟踪:

这与上面的 CLR 异常堆栈同步。

我主要想确定的是是否存在堆“腐败”。但显然不是:

所以我认为这排除了我们的任何本机代码(或第 3 方)只会造成严重破坏。但是仍然没有真正理解这个问题。在我看来,它更像是数据库层中的一个错误。


这已在此处作为问题提交:https ://developercommunity2.visualstudio.com/t/Unable-to-cast-object-of-type-varies/1241378

0 投票
1 回答
165 浏览

vba - 使用 VTable hacking 使用标准模块中的方法重载 COM 类方法

快速提问 - 我刚刚通过使用低级复制内存 API 更改其 VTable 中的条目来测试类的覆盖方法。

背景

我取得了一些成功,如果它们具有相同的签名,则可以交换类的 VTable 中的 2 个条目。所以像这样的类定义:

... 生成一个像这样的 VTable:

虚拟表

...我可以交换位置 7 和 8 的条目以进行cls.Meow打印Woof,反之亦然。我还可以将一个类的 VTable 中的条目与完全不同的 VTable 交换(前提是我不尝试this通过调用来取消引用隐式指针Me.anything

所以我可以再上课

并交换Woof来自另一个的行为Tweet。不太复杂,如果有人需要,我可以分享代码。

我不能做什么...

...但是,是否弄清楚如何将类方法与标准模块中的方法交换?

根据这篇文章,似乎构建 VBA 的 COM 机制需要 VBA 隐藏的两个类方法:

  • 他们有一个隐式this指针
  • 他们返回一个 HRESULT ( typedef long)

所以我认为

在类模块Class1中相当于

我也试过

等但是当我尝试从 VTable 调用该方法时,VBA 总是崩溃。所以我有点茫然。我想知道 64 位计算机上的情况是否有所不同,或者标准模块函数是否对调用堆栈做了一些奇怪的事情。问题是我已经看到了整个 VTable 由标准模块函数组装而成的代码示例,所以我知道这是可能的,但只是不确定如何正确转换签名

如何使用标准模块中定义的方法覆盖 VTable 条目?

0 投票
1 回答
62 浏览

c - 为什么我的 IUnknown 释放函数会阻塞我的子线程?

在我的 C 应用程序中,我有一个子线程在他生命的开始时检索一个 IUnknown 接口:

一切都很好,它用于调用一些activeX函数并且可以正常工作!但是,当我的程序结束时,它要求线程终止,所以我的线程调用正在结束函数:

我的头永远不会回来,因为我的 IUnknow ptr 上的 Release 会阻止它。(如果我删除 Release 那么 COUnitialize() 块)

我做错了什么?(朋克初始化不能在主线程中完成)

0 投票
0 回答
33 浏览

c++ - 在智能指针中隐藏类型化类的特定方法

我使用以下代码

将 COM 对象转换为 shared_ptr,因为这更适合我的代码库的其余部分。问题是我仍然可以(偶尔会)调用内部指针AddRef()Release()导致过度释放/过度保留问题。

在这种情况下,有没有办法只隐藏这两种方法,以便使用它们会导致编译错误,同时让接口的其余部分保持可访问性?