即使COM功能失败,是否应设置out参数?
在实现COM接口时,我总是在成功时为out参数赋值,但在出错时是否也应该这样做 HRESULT CDemo::Div(/*[in]*/ LONG a, /*[in]*/LONG b, /*[out,retval]*/ LONG* pRet) { if (pRet == NULL) return E_POINTER; if (b == 0) { *pRet = 0; // is this redundant? return
在实现COM接口时,我总是在成功时为out参数赋值,但在出错时是否也应该这样做 HRESULT CDemo::Div(/*[in]*/ LONG a, /*[in]*/LONG b, /*[out,retval]*/ LONG* pRet) { if (pRet == NULL) return E_POINTER; if (b == 0) { *pRet = 0; // is this redundant? return
如果需要,谁负责呼叫CoInitialize和CouncInitialize 1-我在代理进程中托管COM dll(通过使用dcomcnfg实用程序或COM+向导) 2-我构建了一个包含COM对象的ISAPI DLL 不知道案例2,但在案例1中,代理进程肯定会调用CoInitialize()/CoUninitialize()。我是这样知道的 我们在COM+中托管了一个COM对象,它本身使用MS XML 4。当需要在MS XML 4中创建XML文档对象时,可以调用CoCreateInstance(
我正在编写一个C#程序,通过COM互操作与COM对象进行接口 我有一个第三方程序,在我执行应用程序时将自己注册为COM服务器。这在32位WindowsVista中运行良好,我可以很好地与interop交互。(单击“添加引用”时,引用将显示在Visual Studio的“COM”选项卡中) 但是,在我执行应用程序后,该引用不会显示在64位Windows 7计算机上的“COM”选项卡中。有没有想过,为什么会发生这种情况?实际上,我尝试使用regsvr32.exe手动注册应用程序,但也没有成功(错误消
在.rgs文件中,有一些注册表信息,我想知道.rgs文件中的信息是如何添加到regetry的 我有一个项目AAA,它将生成文件AAA.DLL,还有一个文件xxx.rgs,其中包含注册表信息,并且AAA.DLL已经构建,然后它将部署到另一台机器B上,所以我不知道如何在机器B上添加注册表信息,我需要使用regsvr32命令注册AAA.dll吗 通常您的代码调用,然后将控制权传递给ATL中实现的特殊机制,该机制执行作业-解析通过将.rgs文件嵌入模块并编辑注册表而生成的资源。ATL附带了源代码,因此您
我正在使用自动化(即COM自动化)在Internet Explorer中显示一些HTML(9): 出现Internet Explorer,显示我的html,其开头为: <!DOCTYPE html> <HTML> <HEAD> ... 编辑:一个更详细、不易理解或可读的代码示例,它无助于进一步解决以下问题: IWebBrowser2 ie; CoCreateInstance(CLASS_InternetExplorer, null, CLSCTX_I
假设在STA线程上创建COM对象。因此,对该对象的所有调用都在该线程中序列化。所以,如果对象的某个方法被阻塞,则使用该对象的所有线程都被阻塞 因此,在STA COM对象中使用阻塞方法是需要避免的设计缺陷吗 如果COM对象是自由线程,是否可以使用阻塞方法 谢谢是的,单线程单元上的对象通过消息进行同步,并且对它们的所有调用都以这样的方式序列化,即在任何时候都不能对任何此类对象调用多个方法(也不能在任何时候多次调用任何方法)。这是经过设计的,是为了达到一定程度的螺纹安全。拥有一个长时间运行的方法本身并
我正在尝试创建一个ManagedRapper dll,该dll可以从MFC应用程序调用,而不会使用/clr开关编译。在测试MFC的标题中,我声明了以下内容: #import "ManagedProxy.tlb" using namespace ManagedProxy; 尝试编译测试MFC应用程序时,出现错误C2871:“ManagedProxy”:不存在具有此名称的命名空间。我确信这一点直到昨天才奏效。如果指定了错误的tlb文件名,则会出现编译错误C1083,这表明tlb文件加载正确 为什么
我有一个COM dll,我想调试从一个外部应用程序运行,我相信这以前工作,但不再工作。(使用VS 2012 RC)我读过很多文章,但我没有看到一篇文章提到使用外部应用程序,这仍然可能吗 我收到“调试符号未加载”消息,当我转到调试>Windows>模块时,我的dll未列出,但外部应用程序已列出,对吗 任何帮助都将不胜感激我强烈建议使用MSVS的早期版本(如MSVS 2010 Pro),或下载WinDbg。任何一方都应该轻松完成这项工作: 当然,您无法调试未加载的DLL。为什么“外部应用程序
我试图在Embarcadero C++Builder 2010中使用智能指针,但在提供的任何标题中都找不到该定义。我得到了这个错误 [BCC32 Error] E2451 Undefined symbol 'CComHeapPtr' 它不在atlbase.h中(而且atalloc.h似乎完全缺失) 我打算用它来异常安全地释放从IShellFolder::ParseDisplayName返回的ItemIDList 它是否存在于这个版本中,或者C++Builder只是使用了一个非常旧的ATL版本
我正在寻找一种“典型”的方式来导航MSDN,让COM类做他们想做的事情 示例问题:我正在寻找一种API方法来解除阻止本地文件(以编程方式从文件中删除internet区域/web标记) 我在stackoverflow.com上找到一篇关于clsid_persistentzoneidentifier的帖子。所以我在MSDN中搜索,找到了。我所寻找的,是一个人在到达这个url后所做的事情。从这个位置,我无法计算操作的顺序。如何将此IZoneIdentifier连接到IPersistFile?等,必须有
我试图从COM dll的序号中获取实际的函数名。我尝试使用dumpbin.exe,但它只返回每个序号的[NONAME](前几个除外) 序号提示RVA名称 21 0 00002439 DLLCANNULOADNOW 25 1 00007F41 DllGetClassObject 116 2 0000539C DllMain 138 3 00008633 DllRegisterServer 176 4 00008640 DllUnregisterServer 1 0009152E[NONAME] 2
今天大部分时间我都在尝试将OCX文件加载到我的一个VB6项目中。我已经尽我所知在注册表中检查COM注册,并且多次尝试在文件上使用REGSVR32,但都没有效果。当我尝试加载组件(在Project-->Components下)时,从VB6得到的所有信息都是无法加载“FilePath\FileName.ocx”。其他人以前见过这个问题吗?如果是的话,有什么办法解决它吗?只是一些帮助隔离问题的提示 使用OleView查看控件 检查名称:如果它是保留字之一,如“菜单”,vb6将无法加载它。(尽管vb6很
大家好 我正在尝试修改MS提供的代码,尝试访问网络适配器配置 当我尝试使用VC++2005访问Mac地址或IPAddress属性im时,它中出现空指针异常。在此处检查//异常:vtProp作为NULL行返回,我在其中获取异常 #define _WIN32_DCOM #include "stdafx.h" #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h&
是否可以使用命名参数从PowerShell调用COM方法?我正在使用的COM对象方法有几十个参数: object.GridData( DataFile, xCol, yCol, zCol, ExclusionFilter, DupMethod, xDupTol, yDupTol, NumCols, NumRows, xMin, xMax, yMin, yMax, Algorithm, ShowReport, SearchEnable, SearchNumSectors, Sear
我有一个带有自定义注册过程的.NET COM dll,因此它可以在HKEY\U CURRENT\U USER\Software\Classes下注册,与HKEY\U LOCAL\U机器相对。因此有以下键(当前用户是Windows 7 PC上的管理员):
我想从ASP调用COM组件的某些函数。我想知道 How can I create a COM object?. How can I use VARIANTS to pass to the COM object? Can I pass reference parameters from ASP to COM object? What are the limitations of passing reference objects to COM? 我从哪里可以得到更多关于这方面的信息 如何创
其思想是COM接口有一个主要实现,需要处理不同的MIME类型(MIME只是一个示例)。主要实现处理客户站点上预期的几种常见MIME类型 要处理新的MIME类型,必须实现相同的COM接口,但只针对新的MIME类型(让我们称之为增强COM对象)。客户端首先调用增强的COM对象,该对象处理其MIME类型,或者在无法识别MIME类型时调用主COM对象。我们可以假设,可能不止一个增强的COM实现。因此,存在一系列责任 COM责任链是否可行?它实用吗 谢谢,理论上它可以,但我认为在这里使用工厂模式可能会更好
我不太清楚[in]和[out]如何与传递值和传递引用概念交互。MSDN文档明确指出,[in]表示数据从调用者流向被调用者,数据从被调用者流向调用者需要[out] 然而,有人建议我对调用方可以检索结果的对象使用[in]参数 IDL中的方法定义示例: HRESULT _stdcall a_method( [in] long *arg1, [in] BSTR arg2, [in] IAnObject *arg3 ); 在我的服务器实现此方法时(使用C++),我可以编写: *arg1 = 20; ar
鉴于: { 库姆萨雷; 变异ccv(L“测试”); sa.添加(ccv,正确); } 我希望CComSafeArray的dtor会对每个包含的成员调用::VariantClear,文档似乎表明: 在某些情况下,最好在不调用VariantClear的情况下清除代码中的变量。 例如,您可以将VT_I4变体的类型更改为其他类型,而无需调用此 功能BSTR的安全数组将在每个元素上调用SysFreeString而不是VariantClear。 但是,如果收到VT_类型但无法处理,则必须调用Variant
为什么COM服务器被称为“服务器” 服务器通常是运行在机器上的进程,它响应来自客户端的请求 COM“服务器”只是可由正在运行的进程调用的已编译代码文件。它们不应该被称为服务器。从技术上讲,“服务器”只是一个提供服务的程序。因此,在COM中,您有客户机和服务器。当然,今天我们认为HTTP/REST/SOA/micro服务等等,但是COM早在那之前就已经存在了,甚至在“网络”(甚至不说网络间/互联网)这样的明显概念还没有出现之前 让我们引用官方文件: COM客户机是任何代码或对象都可以获得指向COM
我想使用用户在开始时输入的变量样式将文件另存为 我还需要帮助将数据发送到具有可变份数的打印机 从这里开始,我需要帮助: ComObjActive("Word.Application").ActiveDocument.SaveAs("L:\10. 2016\TKT Issued\"%Style%") 请看下面的代码,我已经有了 #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releas
我正在编写一个用于修改Outlook文件夹的实用程序脚本。为此,我通过COM接口(Windows脚本主机/JScript)使用v5.14 我有以下两个函数,它们为RDOFolder的所有子文件夹获取一些信息数组: //枚举RDOF文件夹的所有子文件夹 函数getFolderList(rdoFolder){ 如果(!rdoFolder)返回; 返回foldersToArray(rdoFolder.Folders).map(getFolderDetails); } //找出有关单个RDOFolder
我发现使用这种语法,我会得到一个编译错误: importlib("MSADDNDR.dll"); 给出的错误是: error MIDL2337 : unsatisfied forward declaration : _IDTExtensibility2 [ Coclass '_Extension' ] 但那是一种谎言。在前面的输出中,我们看到: warning MIDL2015 : failed to load tlb in importlib: : MSADDNDR.dll 因此,如果
我发现了一个不错的NFC读卡应用程序,它在winforms中运行得非常好 可在此处找到代码: 吉特: 但我有个问题。我现在需要在com for vb6中实现这一点 我必须“复制”事件挂钩,如下面的代码所示 我成功地向vb6公开了方法和事件 NFC = new NFCReader(); NFC.CardInserted += new NFCReader.CardEventHandlerDelgate(Card_Inserted); NFC.CardEjected += new NFCReade
在IDL中声明如下不可处理类的原因是什么 [ uuid(uuidhere), noncreatable ] coclass CoClass { [default] interface ICoClass; }; 我的意思是这样的类无论如何都不会注册到COM。在IDL文件和编译该IDL文件生成的类型库中提到它的原因是什么?当您想阻止客户端使用默认类工厂实例化对象,但仍然有一个用于日志记录、调试和c的正确CLSID时,不可处理是很好的;请参阅以这种方式正确解决的问题的示例。如
VB6说“不能使用GetObject获取对使用Visual Basic创建的类的引用”(最后一句!)。我的VB6 GUI将对象公开为ActiveX exe,供其他组件操作。我希望其他组件连接到已经运行的GUI,而不是启动exe的新实例。如果您使用以下语法,我发现使用GetObject确实有效: Set myobj = GetObject("", "ProjectName.ClassName") 虽然我已经做了很多测试,到目前为止还没有发现任何问题,但帮助人员说这不应该起作用,这让我很担心。有哪
我正在开发一个.NET应用程序(使用C#),它需要处理一些Adobe InDesign文件并将其内容输出为PDF。我可以使用InDesign的脚本,但是对于这种非交互式工作,COM接口似乎更干净一些 不幸的是,我不得不猜测InDesign的COM接口的语义,因为我不知道它们记录在哪里。我在Adobe的支持网站上找不到任何东西 所以问题是:对于InDesign的COM接口的语义,我应该去哪里 提前谢谢大家。我终于找到了接近我需要的东西。由于InDesign的COM类实际上与其Javascript接
我在Windows客户端应用程序中有一个指向COM本地(进程外)服务器的IUnknown指针。要获取运行本地COM服务器的窗口进程的句柄 有没有什么方法可以通过COM实现这一点,而无需向服务器添加新接口来请求进程句柄?(我无法轻松更改服务器) 我为什么要这样做?因为我正试图确保,如果我的应用程序崩溃,脱离proc的COM服务器将被关闭。我想使用它。我想您指的是进程外服务器。不,COM在阻止您检索此信息方面投入了大量资金。重要信息,以便它可以根据需要承载COM对象。它支持代理、DCOM和COM+之
我真的在和WiX斗争。我有需要为COM互操作注册的.NET程序集要安装,它们必须向另一个框架注册,该框架需要在GAC中的.NET程序集中调用Register()方法。此注册方法是一个带有隐藏存储机制的“黑盒”,因此我无法以声明方式执行此操作 我知道去极化方法最适合COM注册,但使用heat.exe有两个问题: RegAsm正常工作,但Heat.exe在我的程序集上阻塞,并显示以下消息: heat.exe:警告HEAT5151:可能 不从已删除的文件中获取数据 预计将成为大会: C:[…].dll
我正在尝试使用visual studio 2010中的OneNote互操作。我已安装OneNote 2010,正在构建.net 2.0 win forms应用程序。我添加引用,选择COM选项卡,然后选择Microsoft OneNote 12.0对象库或Microsoft OneNote 14.0对象库。无论我选择什么,当我单击“确定”时,我的项目中的“引用”列表将显示Microsoft.Office.Interop.OneNote,旁边有一个黄色警告图标。如果我试图编译,我会得到一个错误: 输
Windows Server 2008(r2)计算机上是否有记录,我可以在其中查找该计算机何时加入其域 在登记处的某个地方?或COM对象?Windows将事件记录在事件日志中,但事件日志会很快被覆盖。您可以使用自己的服务不断地查看事件日志,但这可能会很慢且无效。您还可以对netsetup.log进行解析 AD中的计算机记录中存在a,但如果a)计算机记录在加入之前在域中创建,b)计算机离开域然后重新加入,或c)数据从另一个DC复制,则可能是错误的。如果您没有这些实践,可以使用whenCreated
我在执行以下代码时遇到一些内存访问冲突: UINT cDims = 1; SAFEARRAYBOUND rgsabound[1]; long lLbound = 0; long lUbound = 0; rgsabound[0].lLbound = 0; rgsabound[0].cElements = pList1->rgsabound[0].cElements + pList2->rgsabound[0].cElements; SAFEARRAY* mergeResul
My COM对象有一个方法,在IDL中定义为: HRESULT _stdcall my_method( [in] long value, [in, out] IAnotherObject **result ); 是否允许调用方这样调用此方法: ptr->my_method(1234, NULL); 或者调用方这样做是否违反了COM规范 换句话说,实现此函数的代码是否应该检查result!=继续之前为空;如果是这样,COM规范是否要求我返回E_INVALIDARG或E_指针或其他东西;或
实际上,我参与了一个已经编写好的遗留系统维护 我的实际目标是处理连接到对象时可能发生的错误 COM对象是在VB.NET中编写的,主要是Web服务 我已经定义了一个基本工厂,它通过PB函数处理COM对象的实例化 因此,当我实例化一个COM对象时,我得到一个 在要替换的代码中,我可以看到使用的对象可能会立即被销毁。在其他一些地方,情况并非如此。更令人困惑的是,有时它以前是断开的 因此,我可以遇到: oleobject lole_new_com_object lole_new_com_object =
我正在开发一个小应用程序。我想嵌入ActiveX控件,并想在mfc应用程序中对其进行远程控制。因为我需要一个COM的IServiceProvider接口IServiceProvider提供对IWMPMRemoteMediaAccess接口的访问。 为此,我使用以下方法: 但它每次都返回E_INVALIDARG。谁能告诉我出了什么问题 IOleObject* oleObject; CComPtr<IServiceProvider> m_spProvider; CComPtr<
有没有一种方法可以监视和记录COM调用(带有参数)进入特定的EXE/DLL模块,而无需向模块本身显式添加日志功能?我在考虑如何在Spy++中跟踪windows消息,但不针对COM 其动机是为了诊断和自动测试目的而记录呼叫-例如,单击客户端PC上窗口上的按钮,监视发送到服务器模块的COM呼叫,然后在不需要客户端PC的情况下“重播”这些呼叫 如果存在这样做的工具,那就太好了。如果不是,它是可以写的吗?如果是,如何写?COM方法的调用者只是按照约定调用函数。调用方和被调用方之间没有中间层,除非代理/存
我的疑问是,在STA中,对同一接口中不同方法的调用是否排队?或者在同一接口中对同一方法的调用已排队?首先,过于简化: 单线程单元(STA)是用于同步COM对象的构造,而不是方法。只要每个人都遵守规则,就可以保证对象一次只能被一个客户机访问,也就是说,一次只能调用一个方法。在同一个对象中没有方法(当然,我的意思是“同一个实例”,而不是同一个类的方法)将在不同的调用中间由一个不同的线程随机调用。 例如,如果您需要提供更细粒度的同步,则只需要同步一个方法体,那么单元不是适合您的机制。最灵活的方法是使对
我试图使用python启动多个进程,使用COM异步处理多个文件(使用concurrent.futures),但一次只能启动一个进程 以下是使用Excel查看问题的简单方法: import win32com.client # start first instance exl1 = win32com.client.Dispatch("Excel.Application") # start second instance exl2 = win32com.client.Dispatch("Excel
据我所知,隔离是每个进程,而不是每个模块。因此,应用程序清单中的任何内容都适用于从该应用程序启动的任何进程 想想CoCreateInstance需要做些什么来支持reg free COM—它需要以某种方式找到清单文件,如果它存在,就不要去注册表获取激活信息 因为CoCreateInstance没有参数告诉它清单的路径,所以它需要从上下文派生它 对于.DLL没有真正的上下文,但是对于.EXE,当前进程句柄可用于派生可执行文件的路径,等等,所以我怀疑他们就是这样做的
嗨, 我正在客户端计算机上部署VB6应用程序。应用程序需要从C#.NET dll访问代码。我创建了一个.NETDLL的COM对象,并使用VB6使用并行版本控制(免注册COM)。它在开发机器上运行良好 但在客户端计算机上,它抛出了一个错误“ActiveX组件无法创建对象” 我创建了两个清单文件,一个用于VB应用程序,另一个用于C#应用程序。 我通过VisualStudio2008将C#manifest文件嵌入到C#.NET dll中 我错过了一些步骤。 请帮帮我。 提前感谢。您是否在GAC中注册了
Matlab提供了一个COM接口,支持远程执行任意函数(和代码段)。特别是,它有一个调用给定Matlab函数的Feval方法。此方法的第三个参数pvarArgOut具有COM类型VARIANT*,并作为以下类型的参数出现在Visual Studio F#editor中: pvarArgOut: byref<obj> 这段代码编译得很好,但在调用interp1时,我遇到一个COM异常: A first chance exception of type 'System.Reflecti
我已经用VB编写了一些代码,用于验证Windows防火墙中的某个特定端口是否打开,并以其他方式打开一个端口。该代码使用对三个COM DLL的引用。我编写了一个WindowsFirewall类,它导入DLL定义的主命名空间。在WindowsFirewall类的成员中,我构造了由引用的DLL定义的一些类型。下面的代码不是整个类,但演示了我正在做的事情 Imports NetFwTypeLib Public Class WindowsFirewall Public Shared Functio
当我使用MIDL将IDL文件编译为.h和.c时,我得到一个错误,上面写着: midl:命令行错误MIDL1004:无法执行C预处理器cl.exe。 请帮助我,我不知道为什么 我使用的MIDL编译器是VC++6.0的一部分 谢谢。看来您的环境设置不正确。编译之前,请尝试调用vcvars32
我的问题是: a。这似乎是正确的方式吗 b。在VisualStudio 2010中,如何在C++中创建COM.DLL?我尝试创建一个简单的.dll,使用tlbexp生成一个.tlb文件,但这似乎不起作用。我可以将我的.tlb拉入VB5项目,但没有要实例化的类。如果尝试使用regsvr32注册.dll,则会出现“无入口点”错误 我在VS2005中看到了一个选项“注册COM互操作”,但在VS2010中我还没有找到一个等价的选项 提前感谢您的帮助 您必须创建一个ATL项目: 然后将COM对象添加到组件
这就是我想要实现的目标。我识别了一个我定义为存储类数据的结构的类。类的其中一个方法使用类字段,就好像它是指向vtable的指针一样 int __thiscall SignOn(struc_4 *this) { v1 = this; if ( !v1->vtable_40194AE0 ) return E_UNEXPECTED; v1->field_3E8 = 0; if ( !sub_686F7193(v1) ) return (*(*v1->v
我想在Windows上创建一个ISO映像,也就是一个.ISO文件。这可以使用COM组件实现,我在中找到了有关如何使用PowerShell实现这一点的说明 在第3步之后,这些说明说“在这一步中,您可以停止并将结果图像保存到本地硬盘,这将是一个纯iso图像。” 我的问题:如何在PowerShell中获取$resultStream,即从检索中得到的COM对象,并将其内容保存到文件中?您需要使用FileStream writer。请查看此链接,了解如何在c#中执行此操作的示例。 该函数可用于创建帮助您
WMI中使用COM API的WQL查询返回SWbemObjectSet。由此,我们可以使用该方法对集合中的所有对象进行迭代,从而产生许多。它们有一个属性属性,返回一个 此对象有一个Count属性,但没有ItemIndex方法,而只有一个Item方法,该方法获取属性的字符串名称。我想迭代所有可用的属性,因此我没有可用的名称。我尝试调用ItemIndex方法,但(根据文档)此对象上不存在该方法。有许多VBScript文档对object.Properties中的每个道具执行类似于的操作,因此我认为这是
我正在旧版VB6应用程序中引用MSXML6(MSXML6.dll)。无论我使用DOMDocument40还是DOMDocument60,我仍然看到msxml4.dll与msxml6.dll一起使用。然而,我在项目中找不到任何其他应该使用的东西,除了我解析一个小配置的地方 为什么我会看到msxml4.dll,因为它没有被项目引用?VB6是否将msxml4用于某些用途?MSXML6在其COM实现中似乎是msxml4的新版本,而不仅仅是作为“营销”版本号 在OLEView中查看两者的IDL可以看到以下
如果您不关心跨平台部署,是否可以将COM组件嵌入AIR应用程序 谷歌搜索没有显示这一点 提供一个如何实现的示例链接就好了。不,据我所见,AIR 1.5不支持现成的COM互操作
MSCOMCTL蓝调 请原谅我写了这么长的帖子,但我正在努力提供所有相关信息 我正在将一个VB6应用程序从Windows server 2008 R2移动到运行在vm上的Windows server 2012 R2。 这是一个完全手动的过程 我用文本编辑器打开了vbp文件,并将依赖项保存在文本文件中 我在2008服务器上的注册表中搜索每个DLL和ocx,以查找它们在文件系统中的位置。然后,将它们全部复制到2012服务器,并开始使用SysWoW64文件夹中的regsvr32注册每个人 我对一些DL