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结构似乎是一个相当痛苦的事情,所以我现在宁愿不这样做。

COM部署VISTA

什么是COM接口,需要实施以在Vista / win7机器部署COM DLL。 我听说用COM来处理UAC帐号是有的,但是我找不到这个MSDN页面,请大家帮忙。 谢谢

我在哪里可以find有关Microsoft在未来版本的Windows中支持COM +的计划的可靠信息?

当看到一个有着许多竞争优先级的大型Web应用程序时,我面临的一个问题是大量的COM +组件。 在某些情况下,这些东西需要在其他一些技术(WCF,.NET等)中进行重新devise。 在微软停止支持它之前,我将如何优先考虑这一努力的一部分将是“低多久? 我有一个时间魔鬼find任何从微软的官方信息,关于他们目前的计划是在未来版本的Windows中的COM +支持。 任何指导将大大推进。

Linux / UNIX中COM编程的模拟

组件对象模型(COM)是(或者…)在Windows中提供与语言无关的软件组件的方式。 在Linux / UNIX中是否有任何编程模型,具有通过二进制组件重复使用代码的相同原理?

在* nix系统上是否有与COM等价的function? 如果不是,那么nix的可重用性是什么?

我对Windows COM及其背后的想法有所了解。 我想了解* nix系统是否具有相同的function,或者为什么不具备这些function?

Ruby可以导入一个.NET DLL吗?

我有兴趣在一个项目中使用/学习RoR,我必须使用.NET DLL。 Ruby能够导入.NET DLL吗?

为COM接口启用编组需要什么?

我有一个没有types库的32位ATL COM组件。 它有一个给定的类的类工厂,实现了几个接口。 当我使用它作为进程内服务器时,一切正常 – 客户端调用CoCreateInstance(),对象被实例化,QueryInterface()检索指向所请求的接口的指针。 但是,当我把组件到COM +中,我不再可以实例化类 – CoCreateInstance()现在返回E_NOINTERFACE。 我相信问题是COM +不能执行编组,因为没有types库 – 它不知道该怎么做。 我是否需要生成并注册一个types库来解决这个问题,或者还有其他方法吗?

为什么通过同一个COM对象的不同接口获取的I​​Unknown *指针具有相同的值?

我有以下层次的COM接口和一个类实现它们: interface IX : public IUnknown{}; interface IY : public IUnknown{}; class CA: public IX, public IY{}; 这里class CA有效地inheritance了两次IUnknown 。 我们知道class CA有两个vtable指针 – 一个指向IX ,另一个指向IY 。 所以存储在IX子对象中的IUnknown存储在IY子对象中的IUnknown不同。 然而,当我们在同一个对象上调用IX::QueryInterface()或IY::QueryInterface()并查询IUnknown我们得到了相同的IUnknown*指针。 为什么会发生?

setEvent被调用,没有ResetEvent

如果使用setEvent设置手动重置事件但不使用ResetEvent重置会发生什么情况; 并且该事件被多次触发。当事件正在处理时,再次设置事件。 以下是示例任务: void foo() { … SetEvent(hEvent1); … } void foo1() { … SetEvent(hEvent2); … } int MainHandler() { … dwEvent = WaitForMultipleObjects(2, ghEvents, // array of objects FALSE, // wait for any object 5000); switch(dwEvent) { case hEvent1: //do something break; case hEvent2: //do something break; } } 现在,假设hEvent1的情况正在执行(即它仍然被设置),不知何故hEvent1被触发。 我故意不把ResetEvent(hEvent1),即使它是一个手动重置事件。 那么,我们有竞争条件吗?

RegAsm如何使它涵盖32位和64位?

我有一个由C#编写的DLL文件,我的系统是Windows 7 64位。 当我应用RegAsm时,不会将registry添加到64位path,而只是将其添加到32位path。 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /register /codebase "C:\o.dll" 那么如果我检查我的GUID regedit.exe我看到我只有在32位registrypath: HKEY_CLASSES_ROOT\CLSID\{… my guid is found here ….} 而不是HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{… not found my guid …} 所以我有这个问题的其他问题。 任何人都可以请build议发生了什么,为什么不使32位和64位registry项?