Articles of com

Linux / UNIX中COM编程的模拟

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

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

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

有没有办法解码pywin32中的数字COM错误代码

这里是最近一次用Python编写的不可靠的应用程序运行的堆栈跟踪的一部分,该应用程序控制另一个用Excel编写的应用程序: pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146788248), None) 显然有什么问题…但是什么?[1]这些COM错误代码似乎过于隐晦。 我怎样才能解码这个错误信息? 有没有一个表,让我把这个数字错误代码转换成更有意义的东西? [1]我真的知道在这种情况下出了什么问题,它试图访问没有名称属性的Range对象的名称属性…并非所有的错误都很容易find!

如何在Python中区分不同types的NaN float

我正在编写Python 2.6代码,通过Windows中的COM与NI TestStand 4.2进行交互。 我想为一个variables创build一个“NAN”值,但是如果我把它传递给float('nan') ,TestStand将它显示为IND 。 显然,TestStand区分浮点“IND”和“NAN”值。 根据TestStand的帮助 : IND对应于Visual C ++中的Signaling NaN ,而 NAN对应于QuietNaN 这意味着Python的float('nan')实际上是通过COM传递的信号NaN 。 然而,从我所读到的有关NaN的信号来看,似乎NaN信号有点“异国情调”, 安静的NaN就是你的“常规”NaN。 所以我怀疑Python是否会通过COM传递一个Signaling NaN 。 我怎么能find一个Python的float('nan')是否通过COM作为一个信号NaN或安静的NaN ,或可能不确定 ? 在与其他语言进行交互时,有什么办法可以让NaN与QuietNaN或Python中的不确定 信号发生关系? (也许使用ctypes ?)我认为这将是一个特定于平台的解决scheme,我接受这种情况。 更新:在TestStand序列编辑器中,我尝试了两个variables,一个设置为NAN ,另一个设置为IND 。 然后我将它保存到一个文件。 然后我打开文件并使用Python读取每个variables。 在这两种情况下,Python都会将它们看作一个nan浮标。

沉迷于win32api + COM和SO的答案

从我这里的另一个问题,我问如何从Windows媒体播放器和Zune检索当前正在播放的歌曲,我从一个C ++开发人员的答案谁给了我一个解释我将如何做这个WMP。 但是,我不是C ++开发人员,也不是很熟悉pywin32库。 最重要的是,所有这些文件(特别是关于WMP)是非常可怕的 。 因此,我需要你的帮助,了解我将如何在Python中完成以下任务。 资源 我用C ++编写代码来打印当前在WMP中播放的媒体名称。 这是一个简单的控制台应用程序(78行代码)。 脚步: 1)实现了一个基本的COM对象实现IUnknown,IOleClientSite,IServiceProvider和IWMPRemoteMediaServices。 使用ATL模板CComObjectRootEx这很简单(你的里程可能会有所不同)。 需要(简单)代码的唯一方法是IServiceProvider :: QueryService和IWMPRemoteMediaServices :: GetServiceType。 所有其他方法可能会返回E_NOTIMPL 2)实例化“WMPlayer.OCX”COM对象(在我的情况下,通过CoCreateInstance) 3)通过QueryInterface从对象中检索一个IOleObject接口指针 4) Instanciate在1)中看到的类(我使用CComObject <> :: CreateInstance模板) 5)使用从3)得到的接口的SetClientSite方法,将一个指针传递给你的OleClientSite实现。 6)在SetClientSite调用期间,WMP会callback你:fisrt询问一个IServiceProvider接口指针,然后调用QueryService方法,询问一个IWMPRemoteMediaServices接口指针。 返回你的IWMPRemoteMediaServices的实现,第三,你将通过GetServiceType再次被调用。 您必须然后返回“远程”。 您现在连接到WMP运行实例 7)查询COM对象的IWMPMedia接口指针 8)如果7)没有给NULL,请阅读IWMPMedia :: name属性。 9)完成 以上所有内容都是使用VS2010 / Windows Seven进行testing,并且运行WMP(如果没有运行媒体播放器进程,则什么也不做)。 我不知道是否可以/想要在Python中实现COM接口和对象。 如果您对我的C ++代码感兴趣,请告诉我。 您可以在C ++ DLL中使用该代码,然后从Python中调用它。 我知道一点关于win32api。 在第一步,我真的不知道该怎么做,使用IOleClientSite在msdn文档中search结果,这是一个接口。 但是,这就是我已经陷入困境的地方。 我无法find任何东西(可能只是我可怕的search技巧)在Python中使用这些东西。 第二步: WMP = win32com.client.Dispatch("WMPlayer.OCX") […]

如何刷新Windows资源pipe理器

networking卷的名称可以更改。 我改名为Spinal Disk 为了更改networking名称,我这样做 在registry中写入新名称。 使用像DefineDosDeviceW这样的函数连接我的networking卷。 在这个时机,Windows资源pipe理器读取我的猜测registry。 SHChangeNotify(SHCNE_DRIVEADD,SHCNF_PATH,root,NULL); // 为了确定。 SendMessageTimeout(HWND_BROADCAST,WM_DEVICECHANGE,message,(LPARAM)(&dbv), – SMTO_ABORTIFHUNG,200,&dwResult); //再次确定! 它的工作,但有时不工作,即使我使用SHChangeNotify和WM_DEVICECHANGE确定。 有时,新的名称不适用于Windows资源pipe理器。 但是,如果我终止资源pipe理器并重新执行,名称应用。 我find一个界面,Windows资源pipe理器刷新(是否正确的语法?对不起,我不能很好地expression这个句子。) 有没有适当的function? 资源pipe理器应重新读取registry并刷新。

为什么COM的IUnknown :: Release的这个实现工作?

从我见过的例子COM IUnknown::Release()函数的实现是这样的: ULONG Release() { InterlockedDecrement(&m_count); if(m_count == 0) { delete this; } return m_count; } 所以,如果m_count是0,所以我们删除“this”对象,并返回ref数。 我不明白的是为什么它有效?!?! 删除对象不会破坏调用堆栈,或者是因为它正在被线程所持有,所以它与对象无关。 如果这个对象被删除了,怎么可能返回m_count,它应该被删除。 我本来可以说服自己,如果删除代码之后会返回硬编码的0,那怎么回事呢?!?! 非常感谢你的帮助! 🙂

为什么我不需要在COM线程中创build的线程中调用CoInitialize?

为了学习multithreading,我在COM线程( TRemoteDataModule )中创build了一个线程。 这是我的组件工厂: TComponentFactory.Create(ComServer, TServerConn2, Class_ServerConn2, ciMultiInstance, tmApartment); 在线程内部,我不需要调用CoInitialize来使用TADOQuery.Create , .Open … .Exec 我读过, 我需要在线程上初始化COM库,然后再调用除CoGetMalloc之外的任何库函数,以获得指向标准分配器的指针和内存分配函数。 但在这种情况下,CoInitialize的缺席并没有带来任何麻烦。 这与线程模型有关吗? 我在哪里可以find这个问题的解释? 更新: 当我说INSIDE时,它意味着在COM方法上下文中: interface type TWorker = class(TThread); TServerConn2 = class(TRemoteDataModule, IServerConn2) public procedure Method(); safecall; end; implementation procedure TServerConn2.Method(); var W: TWorker; begin W := TWorkerTread.Create(Self); end; 更新2: 用于连接数据库的TADOConnection当前正在COM线程上下文( TThread.Create constructor )中创build。 虽然TADOConnection.Open和TADOQuery.Create/.Open都在TThread.Execute中执行。 更新3 – Simulacrum […]

CoTaskMemAlloc的用法?

什么时候适合使用CoTaskMemAlloc? 有人可以举个例子吗?

COM不能启动Out-of-process .Net服务器编译为AnyCPU

我试图让COM启动我的进程外的.NET COM服务器。 如果服务器进程是用x64编译的,但是如果我使用AnyCPU(这是我想要的),那么它会挂起一段时间,并最终以0x80080005(CO_E_SERVER_EXEC_FAILURE)失败。 我怎样才能使这个工作? 我在64位计算机上运行:使用Visual Studio 2008 SP1的Windows 7。 我可以看到在任务pipe理器,它确实启动我的服务器。 所以我想问题是在COM和服务器之间的通信(类注册)。 我的testing客户端应用程序是用C#编写的,但不pipe它是为x86还是x64编译的。 用32位C ++编写的东西也会出现问题。 如果我使用x64重build服务器并运行它,然后重build为AnyCPU,则COM可以启动它。 重启将使我回到原来的情况。 也许COM预先不知道要使用的位数,而以前的执行是有帮助的。 我find了Andy McMullen的博客文章,并尝试将CLSCTX_ACTIVATE_64_BIT_SERVER传递给CoCreateInstance(),但是之前触发了一个失败:0x80040154(REGDB_E_CLASSNOTREG)。 我在COM注册中做错了什么? 你可以在下面看到,这很简单。 当以64位运行时会发生注册,并且当客户端是64位时会发生问题,所以不应该涉及Wow6432Node。 另一个人也有类似的问题 ,但MSFT的答案是混乱的。 他似乎暗示它只能通过DCOM(请参阅链接)或COM +工作。 我怀疑要么会是一个非常多的工作,而且比分配我的.exe作为x64和x86构build更差。 您可能想知道为什么我正在实施IPersistFile。 这是因为我真正的问题是从一个32位的C ++程序工作到我的AnyCPU .Net程序的BindMoniker()。 我已经减less了我的问题到这里提出的更简单的例子。 这里是客户端代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("ole32.dll", ExactSpelling = true, PreserveSig = false)] [return: MarshalAs(UnmanagedType.Interface)] static […]