Tag: com

如何获取开放资源管理器窗口的PIDL?

我知道如何使用Microsoft Internet Controls COM库获取所有打开的资源管理器窗口 。 从这里,我能够找到那些窗口的LocationURL 。 但是,这仅针对文件系统上的路径设置。 似乎何时显示虚拟对象 ,如网络打印机或回收站, LocationURL为空。 LocationName似乎仍设置为在开始栏上可见的名称。 设置LocationURL ,这足以让我知道资源管理器窗口指向的位置,但是如何找到这些特殊文件夹指向的内容? 读取指向项目标识符列表(PIDL)的指针 。 知道在资源管理器窗口中显示哪个PIDL可以识别出这一点。 有没有办法检索这个?

AxAcroPDF吞咽钥匙,如何让它停下来?

AxAcroPDF一旦获得焦点就会吞下所有与密钥相关的事件,包括快捷方式,按键等。我添加了一个消息filter,它也没有得到任何与密钥相关的消息。 这是一个COM组件,可能是相关的吗? 在控制开始吞咽之前有没有办法捕捉到这些?

Shell32.Folder.GetDetailsOf(..,..)有哪些可用选项?

我已经看到使用GetDetailsOf()来获取有关shell项目的详细信息的答案,但数字总是神奇的数字。 我查看了FolderItem和GetDetailsOf的文档但没有找到任何内容。 (后者中的列表并非适用于所有内容。它们不包括“描述”,“作者”,也不包括回收站删除日期…) 是否有一些方法可以返回项目的可能选项? 它被列在某个地方吗?

使用COM互操作从BS ++到C#编组BSTR

我有一个用C ++编写的进程外COM服务器,它由一些C#客户端代码调用。 其中一个服务器接口上的方法将大型BSTR返回给客户端,我怀疑这会导致内存泄漏。 该代码有效,但我正在寻找有关编组BSTR的帮助。 简化一下,服务器方法的IDL是 HRESULT ProcessRequest([in] BSTR request, [out] BSTR* pResponse); 并且实现如下: HRESULT MyClass::ProcessRequest(BSTR request, BSTR* pResponse) { USES_CONVERSION; char* pszRequest = OLE2A(request); char* pszResponse = BuildResponse(pszRequest); delete pszRequest; *pResponse = A2BSTR(pszResponse); delete pszResponse; return S_OK; } A2BSTR在内部使用SysAllocStringLen()分配BSTR。 在C#客户端中,我只需执行以下操作: string request = “something”; string response = “”; myserver.ProcessRequest(request, out response); DoSomething(response); 这样做,因为请求字符串被发送到COM服务器并且正确的响应字符串被返回给C#客户端。 但是每次往返服务器都会泄漏服务器进程中的内存。 crt泄漏检测支持显示crt堆上没有重大泄漏,所以我怀疑泄漏是用IMalloc分配的。 […]

IE8的InternetExplorer COM对象忽略活动选项卡

这是在.net 3.5 winform上运行的代码的Web单点登录。 只要ie8只有一个标签打开,代码就可以运行ie6或ie8。 问题是,如果用户打开一个新选项卡(选项卡2,3等)并导航到一个网站(组织内部的Web表单),将执行以下代码,但是COM自动化对象将返回HTMLDocument对于第一个选项卡(选项卡1),即使选项卡2是活动选项卡。 我无法在任何地方找到InternetExplorer或HTMLDocument类中的任何IE选项卡引用。 实际上,IE COM自动化文档中的IE标签相关文档很少。 AutoResetEvent ie2_NavigateCompleteAutoReset; /// /// Given the handle of an Internet Explorer instance, this method performs single sign on to /// several known web login forms. /// /// private void WebFormSignOn(int iEFramHandle) { foreach (SHDocVw.InternetExplorer ie2 in new SHDocVw.ShellWindows()) { if (ie2.HWND == iEFramHandle) { while (true) { […]

从.NET Windows服务调用Shell32.dll

我有一个.NET 4.0库,它使用Shell32和Folder.GetDetailsOf()从WTV文件中获取元数据。 我已成功使用它与控制台和Windows窗体应用程序没有问题。 但由于某种原因,从.NET 4.0 Windows服务调用组件时,启动Shell类的调用会导致COM错误。 库中失败的代码: Shell32.Shell shell = new Shell(); 错误: 无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“Shell32.Shell”。 此操作失败,因为IID为“{286E6F1B-7113-4355-9562-96B7E9D64C54}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULTexception:0x80004002(E_NOINTERFACE)) 。 我阅读了我的公寓线程,COM Interops,动态,PIA等等,但是我找到的解决方案没有解决问题。 它必须是来自另一个无法看到Interop的线程的调用。 请帮忙 :)

从BS#传递BSTR到COM函数的惯例(COM互操作)

我正在编写一个用C ++编写COM的API,还编写一个在C#中使用这个API的程序。 我的问题是关于将BSTR传递给COM函数时的BSTR内存管理语义。 说我的IDL看起来像: HRESULT SomeFunction([in] BSTR input); 目前这个function实现如下: HRESULT SomeFunction(BSTR input) { // Do stuff …, then: SysFreeString(input); } 当我用类似SomeFunction(myString)类的东西从C#调用它时,C#会生成这样的东西(伪代码): myString = SysAllocString(“string”); SomeFunction(myString); 或者更喜欢这样: myString = SysAllocString(“string”); SomeFunction(myString); SysFreeString(myString); 也就是说,C#是否释放了它生成的BSTR来编组COM接口,还是应该在我的函数中释放它? 谢谢!

MSHTML HTMLHeadElementClass COM错误

我目前正在使用MS HTML将JavaScript代码插入到网站中。 我引用了Microsoft HTML Object Library并输入了这段代码。 IHTMLDocument2 doc = BrowserHost.Document as HTMLDocumentClass; IHTMLElement head = (IHTMLElement) ((IHTMLElementCollection)doc.all.tags(“head”)).item(null, 0); IHTMLScriptElement scriptObject = (IHTMLScriptElement)doc.createElement(“script”); scriptObject.type = @”text/javascript”; scriptObject.text = TTS.TTSWebFactory.GetJavascript(); ((HTMLHeadElementClass)head).appendChild((IHTMLDOMNode)scriptObject); 我在脚本的最后一行收到错误,这是消息。 Unable to cast COM object of type ‘System._ComObject’ to class type ‘mshtml.HTMLHeadElementClass’. COM components that enter the CLR and do not support IProvideClassInfo or that […]

使用C ++将托管事件公开给COM

可以公开在C#中编写的托管事件,以便在使用c ++编写的COM对象中公开和使用。 不熟悉com和atl。 您能否展示一下MSDN文章中显示的C ++方面的内容 http://msdn.microsoft.com/en-us/library/dd8bf0x3.aspx 显示的VB6代码certificate它是可行的。

COM互操作对象在一个项目中抛出InvalidCastException但在其他项目中不抛出

我有一个我在测试C#解决方案中导入的COM对象。 一切正常,并继续这样做。 然后我在我的实际解决方案中导入了相同的COM对象,并且作为测试实现了与测试项目中完全相同的行 。 当我运行真正的项目时,我得到一个InvalidCastException 无法将“CTWebReport.WebReportCOMClass”类型的COM对象强制转换为接口类型“CTWebReport.IWebReportCOM”。 此操作失败,因为对于具有IID“{5DFA18E8-4E71-4ADC-A812-6B166C242561}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULTexception:0x80004002(E_NOINTERFACE)) 。 我在整个系统中搜索了对interop和com库的每个引用,这包括我能找到的所有bin和obj文件夹。 除了原始的COM库之外,我将它们全部删除,并且为了更好的措施清理了我的回收站。 没有区别,完全相同的情况。 测试项目工程,实际项目没有。 编辑 似乎COM在winforms应用程序中工作,但不在我的类librar中(由asp.net mvc web applicatoin使用)。 我不知道接下来该做什么。 建议?