Articles of com

Linux / UNIX中COM编程的模拟

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

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

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

以编程方式创buildWindows Media Player的基本播放

我试图通过COM “快速集成” Windows Media Player来播放本地文件系统或HTTP源中的单个文件 – 但是由于稀疏的文档和在线资源的使用,当没有embedded某种types的Ole容器时,我无法得到所谓的微不足道的用例。 初始化等工作正常,但实际上播放一些文件总是失败。 示例代码,从初始化开始(剥离的error handling,基本上从MSDN上的C#示例转换,在主线程上执行): CComPtr<IWMPPlayer> player; player.CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER); CComQIPtr<IWMPCore3> core(player); CComPtr<IWMPControls> controls; core->get_controls(&controls); CComPtr<IWMPPlaylist> playlist; core->get_currentPlaylist(&playlist); CComBSTR path("c:\\bar.mp3"); // alternatively http://foo/bar.mp3 玩的第一种方法是“命令不可用” : core->put_url(path); // … waiting after that for WMP to load doesn't make a difference controls->play(); // returns 0x000D1105 – NS_S_WMPCORE_COMMAND_NOT_AVAILABLE 第二种方法只产生S_OK s,但实际上没有任何东西被发挥: CComPtr<IWMPMedia> media; core->newMedia(path, […]

从C ++函数返回string到JavaScript

我有一个实现了IDispatch接口的类(JSObject)。 该类暴露于运行在我的托pipe的Web浏览器控件(IWebBrowser2)中的JavaScript。 在这里看到更多关于这是如何工作的: 调用Web浏览器控件中运行的JavaScript脚本的C ++函数 我可以从我的JavaScript代码中调用JSObject,并且可以接收返回的整数/多个。 但是当函数返回一个string(BSTR)时会出错。 这是IDispatch::Invoke()代码的一部分: int lenW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, NULL, 0); BSTR bstrRet = SysAllocStringLen(0, lenW); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, bstrRet, lenW); pVarResult->vt = VT_BSTR; pVarResult->bstrVal = bstrRet; // Who calls SysFreeString(bstrRet);? 通过上面的代码,你可以alert()返回的string,但是你不能添加它。 alert(returnedString + "foo"); 只会显示“返回的string”。 “foo”部分不会添加到string中。 这个string的结尾似乎有些问题。 任何想法的人? 另外,我在这里泄漏内存,因为我没有调用SysFreeString() ? 编辑: 我暂时包含atlbase.h,所以我可以使用CComBSTR 。 上面的代码现在看起来像这样: pVarResult->vt […]

在Win 10中卸载DLL时debugging崩溃,但不是Win 7

不完全确定我已经确定了这个问题,但是这里是我所看到的和我所想的 。 我有一个主要用C语言编写的加载C ++ DLL的Win32程序。 该DLL通过COM对象将C程序中的数据传递给另一个应用程序 – 这可能是由DLL本身实例化的。 至lessWindows XP和Windows 7(可能是Win95和Win98,我需要更深入地回顾代码历史logging以了解何时引入此接口),但是在Windows 10中,程序崩溃在FreeLibrary()调用此DLL期间。 在debugging器中检查这个时,DLL_DETACH_PROCESS似乎被成功处理(处理该消息时没有执行代码)。 崩溃发生在离开入口点的代码之后(或同时)。 如果我继续步入,我最终在一个名为utilcls.h,这似乎是Borland C Builder 6头文件之一的头文件。 我相信其中的模板代码与COM对象被拆除有关。 一个Unbind()调用会通过,这是在崩溃之前我可以进入的最后一行代码。 如果我使用debugging器的CPU窗口并继续步进,那么在崩溃到来之前,所有剩下的事情似乎都与释放内存有关,但是到了那里,CPU执行了很多步骤。 崩溃引发APPCRASHexception0xc0000602,指的是Combase.dll。 简单地说,不要为FreeLibrary调用这个DLL就可以让应用程序成功closures,但我的假设是FreeLibrary调用很重要。 COM对象在FreeLibrary()调用之前由数据共享应用程序释放,从而允许该应用程序closures。 我目前的假设是,这种不连贯的一些在新的操作系统中发生了不同的事情,这导致了崩溃,但是我不知道如何被发现。 我的问题: 如果对其他人更了解他们正在做的事情是显而易见的,那么导致这次事故的原因是什么? 试图进行debugging的下一步是什么? 我已经用尽了我所使用的debugging环境的知识,不知道COM或DLL是否足够了解下一个要问的问题。 一些debugging器输出RbMm请求: 0:000:x86> t ntdll_77b40000!RtlIsCriticalSectionLockedByThread+0x1b: 77b7256b c20400 ret 4 0:000:x86> t combase!DecrementMTAUsageHelper+0x5b: 7527a2d6 85c0 test eax,eax 0:000:x86> r eax eax=00000001 0:000:x86> t combase!DecrementMTAUsageHelper+0x5d: 7527a2d8 0f859a000000 jne combase!DecrementMTAUsageHelper+0xfd […]

过程边界的CRTtypes

我正在拖放一个activeX控件。 在拖动,我提供了一个CComQIPtr有COM方法实现传递信息到放置目标。 拖放时,放置目标的进程调用我的COM方法来获取信息。 我不允许在接口边界附近使用CRTtypes或指向CRTtypes的指针吗? 我喜欢我的IDataObject有一个私人的std ::列表和一些std ::string,并在接口的外部能够调用我的COM方法,可以访问这些私人成员。 我认为这是可以的,因为我并没有真正将 CRTtypes通过边界。 MSDN:跨越DLL边界传递CRT对象的潜在错误

如何检索COM类的接口ID,以便它可以传递给CoCreateInstance?

我想编程地检索任何类的接口ID,以便我可以将它传递给CoCreateInstance。 很感谢任何forms的帮助!! 请参阅下面的“我如何得到这个” HRESULT hResult; CLSID ClassID; void *pInterface; if(!(hResult = SUCCEEDED(CoInitialize(NULL)))) { return 1; } if(S_OK == CLSIDFromProgID(OLESTR("Scripting.FileSystemObject"), &ClassID)) { hResult = CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER, <<How Do I Get This?>>, (LPVOID *)&pInterface); } CoUninitialize(); 编辑:感谢所有的帮助,似乎现在完美的工作! : HRESULT hResult; CLSID ClassID; IClassFactory *pClf; void *pVdb; if(!(hResult = SUCCEEDED(CoInitialize(NULL)))) { return 1; } if(SUCCEEDED(CLSIDFromProgID(OLESTR("Scripting.FileSystemObject"), &ClassID)) { […]

什么是使用win32inet.WinHttpGetProxyForUrl正确的方法

我正在尝试使用Win32com开发人员公开的Microsoft WinHttp库的function。 不幸的是,大多数的库似乎没有被logging,也没有正确的方式通过win32com库使用win32inetfunction的例子。 这是我迄今为止: import win32inet hinternet = win32inet.InternetOpen("foo 1.0", 0, "", "", 0) # Does not work!!! proxy = win32inet.WinHttpGetProxyForUrl( hinternet, u"http://www.foo.com", 0 ) 正如你所看到的,我所要做的就是使用win32inetfunction找出哪个代理是适用于给定URL的代理,在他的情况下是foo.com。 你能帮我纠正最后一行的语法吗? MSN有一些很好的包装函数的文档,但参数似乎并没有完全映射到Python库的那些文件。 这个脚本的固定版本应该: 能够查找哪个代理使用任何给定的url。 它应该总是做什么Internet Explorer会做(即使用相同的代理) 它应该在任何有效的Windows XP设置上有效。 这意味着它应该使用一个明确configuration的代理,也没有代理。 它只需要在Python 2.4.4上使用Windows XP 32bit。 它可以使用任何官方发布的win32com版本。 我在Windows XP上使用Python2.4.4和Win32Com。 更新0: 或者…你可以给我一个在cTypes的替代实现? 只要我能使它工作,我很高兴!

只为进程初始化关键部分一次

在一个multithreading的应用程序,有没有一种方法来确保只有一个关键部分初始化,除了把代码放在DLL main()?

你能把LPTSTR投给BSTR吗?

将LPTSTR直接投射到BSTR是否合法? 根据我对BSTR的理解 ,将LPTSTR直接投射到BSTR将会给你带来一个损坏的长度前缀。 示例代码明确指出,string文字不能存储到BSTR。 任何人都可以确认一个LPTSTR / LPCTSTR不能直接转换到BSTR而不会破坏长度前缀? 编辑: 我的困惑是看到这个用于COM对象的调用。 事实certificate,编译COM DLL时,生成一个.tli文件,创build一个中间方法。 此方法采用_bstr_ttypes。 _bstr_t可以在其构造函数中使用LPTSTR ,所以一切正常。