问题标签 [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.
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) 单击错误将我带到以下行
我怎么知道哪个方法没有实现?
c++ - COM 客户端连接 COM 服务器需要哪些文件(进程外场景)?
我想了解本文中提到的文件的用途,并将知识链接到我当前的 COM 服务器和 COM 客户端场景,以便我可以实现我的 COM 服务器以使用 COM 服务器:这个
我有一个 COM 服务器,它是一个在后台运行的 exe 或服务。现在,我知道有一个继承自 IUnknown 和 IDispatch 的公开接口。此外,我还生成了以下文件:
xxx_i.c 定义了所有的 CLSID 和 IID
xxx_i.h 定义了接口支持的所有方法
xxx_pc ?
dlldata.c ?
我现在使用自动化方式 IDispatch -> Invoke() 来访问接口方法。尽管这种方式在不使用上述任何文件的情况下似乎可以正常工作,但我仍然想了解它们的用途,同时使用常规方式 IUnknown -> QueryInterface() 来访问这些方法。
由于我是 COM 世界的新手,任何建议的阅读将不胜感激!谢谢!
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 代码以帮助调试问题。
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 的指针”吗?
谢谢你。
c++ - 为什么 COM 指针参数转换为 void 而不是 IUnknown?
如果这是一个愚蠢的问题,我深表歉意,但我不清楚为什么 COM 指针参数通常被转换为(void**)
而不是(IUnknown**)
. 然后有时IUnknown
实际上会使用指针,例如 with IObjectWithSite::SetSite
。谁能解释一下?
c# - 源自“System.Transactions.JitSafeGetContextTransaction”的“无法转换”异常?
就在最近,我的应用程序一直不一致地抛出各种异常,例如:
(最后一个可能是其他的次要效果)
其中一些的堆栈跟踪粘贴在下面,但请注意,它们都具有以下 3 个最后步骤:
观察 - 这些例外:
- 经常发生,但不是一直发生(50%?)
- 当确实发生时不要总是产生相同的异常
- 与我的应用程序中导致它们的代码没有明显的联系
- 可在各种 PC 上重现
- 在我所做的任何搜索中都无法准确找到
该应用程序是一组通过 COM 从旧 VB6 代码调用的 C# DLL。然而,这已经存在多年,我们最近没有改变任何关于如何完成的事情。
它不是一个多线程的应用程序,所以涉及的演员表System.Threading.Thread
似乎不合适。有一个第三方模块使用了线程,但我们把它作为实验拿出来:这样做并没有解决问题,但似乎减少了错误的频率。这使我认为这是某种资源破坏问题。
我正在寻找建议,例如:
如果您以前确实见过这种异常模式,那么原因是什么?
关于如何调试根本问题的建议
示例堆栈跟踪:
和
和
编辑:
我尝试使用 windbg(使用托管代码的 SOS 扩展)对此进行调查。
它能够打破异常。这是从那时起的堆栈跟踪:
这与上面的 CLR 异常堆栈同步。
我主要想确定的是是否存在堆“腐败”。但显然不是:
所以我认为这排除了我们的任何本机代码(或第 3 方)只会造成严重破坏。但是仍然没有真正理解这个问题。在我看来,它更像是数据库层中的一个错误。
这已在此处作为问题提交:https ://developercommunity2.visualstudio.com/t/Unable-to-cast-object-of-type-varies/1241378
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 条目?
c - 为什么我的 IUnknown 释放函数会阻塞我的子线程?
在我的 C 应用程序中,我有一个子线程在他生命的开始时检索一个 IUnknown 接口:
一切都很好,它用于调用一些activeX函数并且可以正常工作!但是,当我的程序结束时,它要求线程终止,所以我的线程调用正在结束函数:
我的头永远不会回来,因为我的 IUnknow ptr 上的 Release 会阻止它。(如果我删除 Release 那么 COUnitialize() 块)
我做错了什么?(朋克初始化不能在主线程中完成)
c++ - 在智能指针中隐藏类型化类的特定方法
我使用以下代码
将 COM 对象转换为 shared_ptr,因为这更适合我的代码库的其余部分。问题是我仍然可以(偶尔会)调用内部指针AddRef()
或Release()
导致过度释放/过度保留问题。
在这种情况下,有没有办法只隐藏这两种方法,以便使用它们会导致编译错误,同时让接口的其余部分保持可访问性?