win7系统,用c#调用Interop.SHDocVw.dll时,报了个对“ COM 组件的调用返回了错误 HRESULT E_FAIL”的错误。...网上有人说要开启dtc服务,然后去组件服务里把本地DTC设置成开启网络DTC服务,并允许入站和允许出站,并且设置成不要求进行验证,如下图: ?...但我设置完之后还是不行,后来看到组件服务里的COM+应用程序点开报错,所以又开启了System Event Notification Service服务,结果还是不行。...无奈之下重启电脑反而好了,又去禁用了DTC,并把DTC的开启网络DTC服务勾掉,又禁用了System Event Notification Service服务,但再也不报错了。
和脚本语言相比,C++对WMI有强大的控制和定制性,当然也具有更大的复杂性。本文将主要讲述使用VC如何搭建一个使用WMI的框架。...在WMI Consumers层,我们发现,C++程序是直接和WMI COM API进行交互。所以我们要先初始化COM组件库。...如果我们不调用该函数,COM将通过读取注册表中的相关键值去决定我们应用的认证信息和扮演等级。然而,往往注册表中记录的认证信息和扮演等级是非常低的。...HRESULT CWMI::ObtainLocator2WMI(CComPtr& pLoc) { HRESULT hr = E_FAIL; do {...最后一个参数返回了IWbemServices结构的代理。我们可以通过该代理访问WMI服务。
实际上,C#调用DCOM服务器的时候,只需要在C#这边做一些手脚,对于原先的C++ DCOM服务器来说,是不需要做任何改动的。...查询注册表,启动CLSID对应的COM服务器,并激活COM对象。 2. 根据IID获取COM的指针,然后调用COM对象提供的服务。...每次C#程序调用这个类的抽象函数的时候,CLR会自动将调用转换成对应的COM调用。...获取已经激活的DCOM对象的指针,接着再是查询对应的COM接口,本文的例子里是IStream接口,这样在C#程序里面才能调用。...但是又涉及到另外一个问题,C#是强类型语言,所有的对象调用都是要有明确的类型定义的。为了解决这个问题,我们需要在C#程序里自己定义好COM对象和接口的定义。
_GetCount()); return E_FAIL; } } 调用的代码如下: // 被动关闭/关闭超时 void CTcpPort::EndClose(HRESULT reason) {...S_OK是COM服务器返回正确 S_FALSE是COM服务器返回错误,不过这个错误是可以不处理的,不影响程序正常运行。只是结果不是想要的 E_FAIL是必须处理的错误。...返回E_FAIL,是告诉调用程序--某些地方出错,必须进行处理。否则,程序不能进行下去了。 返回S_FALSE,不是表示出现错误。 而S_OK和S_FALSE,则程序逻辑的不同表示。...调用程序只需对返回的S_OK和S_FALSE进行判断,然后决定程序的走向。 最主要的误解是由S_FALSE的名称带来的。 ...当自己写的函数接口返回值为HRESULT的时候,如果想要指明其出错,并且必须被处理时,应返回E_FAIL。
1.COM组件聚合由来 聚合源自组件重用。当有两个组件A和B,他们分别实现了自己的接口IA和IB。...这时候有两种做法:一种是客户程序创建B对象,还有一 种方法是A组件内部创建B组件,然后客户通过某种途径调用B的接口方法。 ...ATL对聚合的内部组件的支持 ATL通过CComCreator2模板类以及和聚合相关的宏来支持聚合。...同样,如果组件仅支持聚合,那么T1就是CComFailCreatorE_FAIL>,创建时直接返回E_FAIL。 CComAggObject提供了两个IUnknown的实现。...另外也可以使用CComPloyObject来支持组件聚合。 3.ATL对聚合的外部组件的支持 ATL通过以下的宏来支持外部组件聚合其他组件的接口。
使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 发布于 2018-07-21 13:51...这不是欺骗,是真的具备了对早期系统的兼容性。 ? 于是,一些广泛使用的 UWP 应用终于不用各种自己写控件来兼容低版本的 Windows 10 了。...当然除了在 XAML 中,也可以在 C# 代码中使用库中的新 API。 解决意料之外的错误 一切可以那么顺利?...=0x80004005 Message=Error HRESULT E_FAIL has been returned from a call to a COM component....欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布
(3)LOGO资源使用Windows自带的解码库来进行解码,也就是Windows Image Component(WIC). 这么一思考,还是挺靠谱的。...在另外一台Win7机器上测试时,缩略图中并没有出现想象中的LOGO。一看日志文件,发现一直在报:CoCreateInstance()调用返回0x80040154。...也就是说COM类并没有注册,在注册表\HKEY_CLASSES_ROOT\CLSID\下面也就没有类ID了。我们程序中使用了WIC组件来解码图片,那么难道是WIC组件类没有注册吗? ...再一想,开发时采用的一直是Windows10,可以正常运行。到了Windows7上为啥就不行了呢?难道是WIC在Windows7上不支持?...而这个GUID在Windows7上是不存在的(搜索注册表即可看到结果): ? ? 自然CoCreateInstance()调用就会返回0x80040154了。
使用 COM 的方式可以调用本机的 Office 组件进行 PPT 以及 Word 和 Excel 等文件的读写,在打开文件的时候,如果提示 System.Runtime.InteropServices.COMException...(0x80004005) 就意味着这是一个通用的错误,没有具体的原因 调用 COM 组件,提示 System.Runtime.InteropServices.COMException (0x80004005...): Error HRESULT E_FAIL has been returned from a call to a COM component....表示发现通用的错误,或者未知的错误。.../// 使用密码打开ppt(如果课件无密码则正常导入,密码错误则会抛密码错误异常,这里我们使用一个密码“PASSWORD”进行解密);详见:https://stackoverflow.com
ATL的QueryInterface调用追踪 a...._InternalQueryInterface函数调用InternalQueryInterface函数,定义在BEGIN_COM_MAP宏内部 #define BEGIN_COM_MAP(x) public...如果piid为NULL,则不管请求的IID是什么,都会调用pFunc。如果接口是S_OK,则返回结果给客户。否则继续搜索下一个表项。...,例如当盲目聚合某些组件时,可能需要屏蔽一些接口 //2.相关的宏: COM_INTERFACE_ENTRY_NOINTERFACE(x) // {&_ATL_IIDOF(x), ...,还要将内部对象组件的指针保存 //2.相关的宏: a.
不同的使用方式只要完成其核心功能即可,回顾下CWMI类的执行主体 HRESULT CWMI::ExcuteFun() { HRESULT hr = E_FAIL; CComPtr的主体函数Excute中,我们首先使用WMI类名获取类 HRESULT CExcuteMethod::Excute( CComPtr pSvc ) { HRESULT...spInParamsDefinition) { break; } 实例化入参定义的一个实例,然后对这个入参实例进行参数赋值。...这儿有个地方需要注意下,就是调用ExecMethod方式存在两种方式: 类的静态方法直接使用类名调用 类的非静态方法使用对象名调用,这种调用我们将在之后的讲解WMI Provider时介绍。 ...这其中主要的原因是我们CWMI类中控制了COM组件的初始化和卸载操作。
Init() throw() { HRESULT hRes = E_FAIL; __try { InitializeCriticalSection...} HRESULT Term() throw() { return S_OK; } }; 2.线程锁的封装,实现锁类型的参数化 [cpp] view plain copy template...我们在程序中使用“临界区”时,只需要调用这四种操作就可以达到保护数据成员不被其他线程修改的目的。...else #pragma message ("No global threading model defined") #endif ATL内部使用CComObjectThreadModel来保护组件内部实例数据...在聚合的情况下,COM对象的AddRef()和Release()操作都和独立激活时候完全不同。
组件对象模型(COM)是微软推出的一种软件组件技术,它允许不同的软件组件在多种编程语言中被创建和调用。COM组件的安装和卸载是管理和维护COM应用程序的关键步骤。...COM组件的安装COM组件的安装涉及到在Windows注册表中添加相应的条目,以便COM库能够识别和加载组件。...= ERROR_SUCCESS) return E_FAIL; TCHAR szModule[MAX_PATH]; GetModuleFileName(NULL, szModule...组件的卸载COM组件的卸载涉及到从Windows注册表中删除或修改组件的条目。...= ERROR_SUCCESS) return E_FAIL; lRes = RegDeleteKey(hKey, NULL); // Delete more registry
核心原因是在 CShapeBase::GetCachedBounds 对 Geometry 的 Bounds 进行校验失败,因此导致此方法返回了 WGXERR_BADNUMBER 错误。...接下来我将细细告诉大家这个调用链是如何一步步使用错误的上层业务代码传入的 Geometry 数据,获取到错误的参数。...先看一下最开始投毒的逻辑,在 PathGeometryWrapper.cpp 定义的 GetStartPoint 方法,返回了本文使用的代码里面传入的包含 NaN 的点的值,如以下代码,拿到的 m_pFigure...在本文的例子代码里,其实也进入了这个分支,调用堆栈如下 wpfgfx_cor3.dll!...记得替换 csproj 文件的 C:\lindexi\Code\WPF 为你的 WPF 文件夹 当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT
\src\PresentationCore\System\Windows\Input\Stylus\Wisp\WispLogic.cs 的 HandleMessage 将获取 Windows 消息,代码如下...-A999-940F526219C2 组件只是 WPF 用的,而不是系统等给的接口 实际调用底层的代码是在 PenImc 层的 C++ 代码,但 PenImc 层的 C++ 代码只是一层转发调用而已,换句话说...,如果使用 C# 调用底层的系统的组件也是完全可以的 如上面代码通过 GetTabletCount 方法获取当前的触摸设备,此方法是通过 COM 调用到在 PenImc.idl 文件定义的 GetTabletCount...HRESULT 的值,如果失败了,将会调用 CLEANUP 标签的内容。...接口调用,实际使用的就是系统提供的 ITabletManager 组件 在底层系统组件,先调用 ITabletManager 的 GetTabletCount 方法 获取触摸设备数量,然后遍历触摸设备序号拿到
上一次说到,COM为了跨语言,有一套完整的规则,只要COM组件按照规则编写,而不同的语言也按照对应的规则调用,那么就可以实现不同语言间相互调用。...但是根据那套规则,只能识别接口,并调用没有参数和返回类型的接口,毕竟不同语言里面的基本数据类型不同,可能在VC++中char * 就表示字符串,而在Java或者c#中string是一个对象,二者的内存结构不同...HRESULT类型: 在COM中接口的返回值强制定义为该类型,用于表示当前执行的状态是完成或者是出错,这个类型一般在VC中使用,别的语言在调用时根据接口的这个值来确定接下来该如何进行。...一般在COM的调用者看来,有的时候只要最高位不为0就表示成功,这个时候可能会继续使用,所以在我们自己编写组件的时候要根据具体情况选择返回值,不要错误了就返回S_FALSE,其实我们看它的定义可以知道它是等于...为了简化操作,COM中也对它进行了一个封装——_variant_t,该类型可以直接使用任何类型的数据对其进行初始化操作。
相信大家对Windows的组件对象模型(COM) 都已经非常熟悉了。而DCOM可能相对来说要陌生一些。DCOM是 分布式的COM, 类似于CORBA, 也就是说调用的COM 可以在远程主机上。...看一下PREMQIRESULT的定义 typedef struct tagREMQIRESULT { HRESULT hResult; STDOBJREF std; } REMQIRESULT;...不难看出,IRemUnknown::RemQueryInterface 只是返回了对象的部分信息,而IRemUnknown2::RemQueryInterface2返回了整个对象的信息。...背景知识: 如果将COM 接口注册PSOAInterface或者PSDispatch后,oleaut32.dll 会查找注册的Type Library信息(存放在注册表中),如果找到的话,将调用LoadTypeLibrary...如果调用其 IBackgroundCopyJob::SetNotifyInterface(IUnknown *pNotifyInterface) 并传入一个精心构造的COM 接口,引发类型混淆,便可利用该漏洞来加载一个
严格意义上讲,c#是不能生成纯正ocx控件的,我们在vs.net中新建项目时,也找不到专门的"ActiveX项目"新建项,最多也只就能新建"类库"得到一个dll而非ocx(因此我们也无法用传统的regsvr32...来注册该dll),但是c#能开发com组件,activeX控件本质上讲跟com是一类技术,所以用c#开发"能够让网页调用的com类库"还是可行的。...不要修改 (5)新建一个:Windows Forms-->“用户控件”,我们的主要逻辑就写在这里(还可以在它上面随便放置其它windows常用控件,跟winForm开发一样),不过首先要修改类定义,让其实现我们刚才定义的接口...#endregion这一段的内容是固定的,不要修改,其它内容根据自己的业务要求自行修改,另外类前面要加上Guid的标识,以便网页调用时,能用CLSID="xxx"来调用 基本上这样弄完后,就可以在网页中...,用类似下面这样的代码来本机调用了: 注意:c#定义的public方法,如果想直接让js调用,只能返回string,DateTime,int,double这一类基本值类型,其它返回类型比如array,object
Windows 协议文档中所描述的协议规范中,错误码使用 HRESULT、Win32 错误码和 NTSTATUS 来描述。本文科普一下 HRESULT。...对 Win32 开发来说,0x7 是很常见的,表示 FACILITY_WIN32。...下载地址:Download Microsoft Error Lookup Tool from Official Microsoft Download Center 在 .NET/C# 代码中的使用 例如.../blog.walterlv.com/post/hresult-in-windows.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。...欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
ActiveX控件Demo 新建一个Window窗体控件库项目 在自动生成的UserControl1页面上添加一个button 点击事件里我们只弹出一个MesageBox private...一是查询ActiveX组件是否实现了IObjectSafety接口,并且 返回脚本安全;二是查询ActiveX组件是否在注册表的Component Category Manager里表明自己实现了 CATID_SafeForInitializing...ProgId里的ActiveXDemo.UserControl1是我自己工程里的,修改成你自己的 gui生成是在 菜单 工具 下边 打开项目属性, 在应用程序里 点击程序集信息 勾选 使程序集COM可见...在生成里边,勾选 为Com互操作注册 做到这里我们的ActiveX控件就做完了接下来我们把它发布 先是把它打包 Vs2012 打包我之前有些不同 新项目——其他项目 安装和部署 选择application...ok 因为我们的demo就一个dll所以不用再有别的操作 如果想修改一下安装的窗体可以在Installation Interview里设置 在Express\DVD-5\DiskImages\DISK1
这是自 Vista 以来就提供的功能——Restart Manager。 ---- 应用程序实现这一功能只需要调用 RegisterApplicationRestart 即可。...传入两个参数: 重启后使用的命令行参数(例如当前正在打开的文件,以及正在阅读或编辑的位置) 决定是否进行重启的限制标记(任何时候都能重启还是在某些条件下关掉重启功能) 我封装了以下这个函数的调用并将其放到...)](https://msdn.microsoft.com/en-us/library/windows/desktop/aa373347) /// ...codes. /// - E_FAIL: Internal error. /// - E_INVALIDARG: The specified command line...) Restart Manager Support For Windows Application - CodeProject c# - Restart a crashed program with RegisterApplicationRestart