Articles of com

如何通过COM接口以编程方式激活OLE控件?

我有一个应用程序通过ActiveXembeddedbutton控件。 该button由第三方提供,实现了一系列的ActiveX接口(其中IOleInPlaceObject )。 我有一个对IUnknownbutton实现的引用。 我面临的问题是由对象提供的IOleWindow::GetWindow函数总是返回一个错误; 错误代码是0x80004005,这显然是一个常见的HRESULT值,意思是E_FAIL 。 不太具描述性。 对于什么是值得的,该对象还通过它的IDispatch实现公开hWnd属性; 查询成功,但财产的价值总是为零。 有一点谷歌search表明,我可能需要“激活”的OLE对象之前, hWnd属性产生一个有用的价值。 有谁知道如何做到这一点,有没有一个专用的COM接口来激活OLE对象? 有趣的是,button似乎有一个窗口句柄,如在Spy ++中可见的。 更新:我刚刚发现IQuickActivate这是由我正在处理的button控制,并可以用来'快速'(嗯…)激活一个项目。 然而,填补QACONTAINER结构似乎是一个相当痛苦的事情,所以我现在宁愿不这样做。

IUnknown.Release标准实现竞态条件?

下面是一个标准的(不是推荐的)实现IUnknown COM接口的Release方法(直接取自MSDN)的方法: ULONG CMyMAPIObject::Release() { // Decrement the object's internal counter. ULONG ulRefCount = InterlockedDecrement(m_cRef); if (0 == m_cRef) { delete this; } return ulRefCount; } 我想知道如果公寓模型不是STA,可能会发生竞争情况: 说有一个参考左边 线程1通过调用Release释放它 它会在delete this之前运行并停止 线程2被调度并且获得对该对象的新引用,例如通过调用QueryInterface或AddRef 线程1继续执行并运行delete this 线程2留下一个无效的对象 对于我来说,确保一致性的唯一方法就是创build一个标志,比如删除 ,locking整个关键部分,即除返回外的所有Release方法,并将标志设置为true 。 并在AddRef和QueryInterface方法中检查此标志,如果设置了,则拒绝请求新的引用。 我错过了什么? 提前致谢。

开始C ++的问题; 不能实例化抽象类(VS中的C2259)

我试图创buildIAudioEvents COM接口的具体实例(在Vista和更高版本中可用)。 这是我第一次进入COM编程,所以我可能只是在这里做一些愚蠢的事情。 无论如何,以下代码无法编译与“C2259:”AudioEndpointVolumeNotifierImpl“:不能实例化抽象类”。 类定义(AudioEndpointVolumeNotifierImpl.h): class AudioEndpointVolumeNotifierImpl : public IAudioSessionEvents { private: LONG _cRef; public: AudioEndpointVolumeNotifierImpl() : _cRef(1){} ~AudioEndpointVolumeNotifierImpl(){} HRESULT STDMETHODCALLTYPE OnSimpleVolumeChanged(float NewVolume, BOOL NewMute,LPCGUID EventContext); HRESULT STDMETHODCALLTYPE OnChannelVolumeChanged(DWORD ChannelCount, float NewChannelVolumeArray[], DWORD ChangedChannel, LPCGUID EventContext){return S_OK;} HRESULT STDMETHODCALLTYPE OnDisplayNameChanged(LPCWSTR NewDisplayName, LPCGUID EventContext){return S_OK;} HRESULT STDMETHODCALLTYPE OnGroupingParamChanged(LPCGUID NewGroupingParam, LPCGUID EventContext){return S_OK;} HRESULT STDMETHODCALLTYPE OnIconPathChanged(LPWCHAR NewIconPath, […]

在已发布的COM对象上调用调用

我创build了一个用于某些应用程序的自动化任务的COM对象。 发生这种情况时,应用程序启动并显示“主窗口”。 用户closures主应用程序窗口时发生问题。 下一个调用COM对象的调用不起作用。 问题是它不会失败,并且不会报告错误。 如果我在下一行代码中放置一个debugging器断点,它永远不会到达。 如果用try / catch包围Invoke调用,则不会发生exception。 在发布版本中,它只是崩溃。 这应该如何工作? 因为我使用CComDispatchDriver作为IDispatch *的包装,所以我希望我的AddRef可以使COM对象保持活动状态,即使用户closures了应用程序。 我希望至less得到一些HRESULT作为一个错误。

关于目前对COM的兴趣

我开始用C ++做一些开发,包括在Windows中使用COM接口。 我必须做出学习或不学习COM技术的决定。 那么,我想问一下,COM编程是被广泛使用还是比较陈旧呢? 投入一些时间来学习COM还是个好主意吗?

这个问题的根本原因是什么“R6016 – 线程数据空间不足”

我想知道可能的根本原因,使得我创build的应用程序(COM .exe)出现问题“R6016 – 线程数据空间不足”。

CoCreateInstanceEx在Win2003上返回带有无效凭据的S_OK

我正在编写一个远程连接到服务器的客户端应用程序。 我需要模仿我的客户将使用的用户。 这是我的代码摘录: COAUTHIDENTITY coAuthIdentity, *pCoAuthIdentity; COAUTHINFO coAuthInfo; CComBSTR bstrDomain(domain), bstrServer(server); CComBSTR bstrUser(user), bstrPassword(password); CComBSTR bstrServerPrincName(domain); bstrServerPrincName.Append(L"\\"); bstrServerPrincName.Append(server); coAuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; coAuthIdentity.Domain = (USHORT *)bstrDomain.m_str; coAuthIdentity.DomainLength = bstrDomain.Length(); coAuthIdentity.Password = (USHORT *)bstrPassword.m_str; coAuthIdentity.PasswordLength = bstrPassword.Length(); coAuthIdentity.User = (USHORT *)bstrUser.m_str; coAuthIdentity.UserLength = bstrUser.Length(); pCoAuthIdentity = &coAuthIdentity; *ppCoAuthIdentity = pCoAuthIdentity; coAuthInfo.dwAuthnSvc = RPC_C_AUTHN_DEFAULT; // Have COM negotiate […]

Windows Server 2008的FaxServer替代scheme

要在内部发送传真,我们一直使用以下Coldfusion代码来创build处理传真的对象: <cfobject type="COM" action="Create" name="objFaxServer" class="FaxServer.FaxServer.1"> 虽然我们仍然使用ColdFusion 8,但是我们将服务器移动到Windows Server 2008,这是一个64位系统。 因此,我们现在无法调用诸如FaxServer之类的COM对象来处理这样的请求。 我正在寻找一个内部的替代scheme(没有第三方像InterFax.net),但我一直没能find一个,也没有任何build议来处理这种情况。 有什么build议使用或如何内部通过ColdFusion发送传真?

让PHP访问64位操作系统中的32位COM对象

我最近把我的旧家庭服务器系统升级到了64位系统(Win 7),并且在访问PHP中的32位家庭自动化DCOM对象时遇到了问题。 我运行32位的Apache,据我所知,32位的PHP(我不认为有一个64位版本可用)。 这个设置和我以前(但工作)的设置之间唯一的区别是,我正在运行64位Windows 7而不是32位。 当我重新安装了所有东西的时候,最初我感到困惑,因为dcomcnfg.exe没有显示它,所以我无法configuration对DCOM对象的访问。 过了一段时间,我意识到必须启动32位版本的dcomcnfg.exe才能看到DCOM对象( mmc comexp.msc /32 )。 我现在试图在PHP中访问这个32位DCOM对象,但它不工作。 考虑到Apache和PHP是32位,我奇怪的是,我不能在PHP脚本访问这个COM对象。 有谁知道我怎么能访问这个(非常古老的)在PHP中的32位COM对象? 我想要做的代码片段显示在这里: $hs = new COM("HomeSeer.clsString") or die("Unable to get DCOM object"); $hs->ExecX10("a5","on","0","0"); unset($hs); 我真的希望有人能够帮忙,否则这个向64位Windows的过渡将会对我有点灾难! 我已经在各种地方阅读如何将文件放入c:\ windows \ syswow64 \文件夹可能是一个解决方法,但我不知道要放在那里的文件? 我们是否应该在该文件夹中安装家庭自动化软件? 当然不是…! 谢谢!

是否存在为nodeJS绑定的现有事件COM(组件对象模型)?

我有一个通过Windows组件对象模型(COM)与IRIS Exchequer会计套件接口的客户端。 我正在重写现有的Exchequer集成层,并希望将其replace为Express中的非阻塞RESTful服务。 我做了一个npmsearch和一些谷歌search,但似乎无法find任何绑定,这将直接连接到COM。 那里是否有这样一个模块,如果没有,那么如何实现这个模块呢?