标签: com

如何为Windows Vista编写有效的IThumbnailProvider

我按照MSDN上指定的接口编写了缩略图提供程序.但是,我一直无法弄清楚如何以Vista实际调用它的方式注册它.有没有人让一个缩略图提供商为Vista工作?示例代码或链接将特别有用.

com thumbnails windows-vista

9
推荐指数
1
解决办法
3037
查看次数

COM,VARIANT包含BSTR.谁分配?

好的,所以我真的不能想到一个总结这个的apropos标题.

IPrintPipelinePropertyBag接口具有AddProperty方法,该方法恰当地"将属性添加到属性包".

http://msdn.microsoft.com/en-us/library/aa506384.aspx

AddProperty([in,string] const wchar_t*pszName,[in] const VARIANT*pVar);

我们使用以下代码将字符串添加到属性包中.

CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);
Run Code Online (Sandbox Code Playgroud)

但是很明显,创建的CComBSTR和CComVariant在一段时间后超出了范围.我不确定PropertyBag是否处理字符串并制作自己的副本.由于我们可以在VARIANT中存储各种内容,因此情况并非如此.

假设没有处理字符串,我的问题是,在COM中执行此操作的模式是什么?我应该如何传递包含已分配字符串的VARIANT,使该字符串可用于其他线程,即使调用AddProperty的线程首先死亡,并正确地取消分配字符串?

c++ windows com bstr variant

9
推荐指数
1
解决办法
4312
查看次数

Win32:注册ActiveX控件所需的注册表项?

我需要编写调用DllRegisterServer时运行的代码.即当有人打电话时:

regsvr32 myActiveX.ocx
Run Code Online (Sandbox Code Playgroud)

我正在尝试找到所需注册表项的最终列表(而不仅仅是我可以通过注册表拼写一起拼凑起来).

到目前为止,我的探险队发现:

HKEY_CLASSES_ROOT
   \MyCoolLibrary.MyCoolControl
      \Clsid
         (default) = "{myClassId}"
   \CLSID
      \{myClassId}
         \Control
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \MiscStatus
            \1
               (default) = 205201
         \ProgID
            (default) = "MyCoolLibrary.MyCoolControl"
         \ToolboxBitmap32
            (default) = "c:\foo\myActiveX.ocx,1"
         \TypeLib
            (default) = "{myTypeLibraryGuid}"
         \Verb
            \0
               (default) = "Properties,0,2"
         \Version
            (default) = "1.0"
   \TypeLib
      \{myTypeLibraryGuid}
         \1.0
            (default) = "MyCoolLibrary.MyCoolControl"
Run Code Online (Sandbox Code Playgroud)

现在,关注点: - Control文件夹包含什么?它的存在是否表示控制? - 什么是205201的MiscStatus呢?205202会做什么呢? - 什么是动词"属性,0,2"?哪里是"属性,0,0"和"属性,0,1"?

换句话说,我正在寻找文档.

com registry winapi activex

9
推荐指数
3
解决办法
6823
查看次数

是否有像IDE库的Reflector这样的工具?

是否有像IDE库的Reflector这样的工具?我想打开一个COM库并浏览类和接口,就像在Reflector中一样.如果可能的话,我宁愿不安装Visual Basic 6.0来执行此操作.

com reflector

9
推荐指数
1
解决办法
886
查看次数

如何在C#中销毁COM对象?

除了这些之外,在C#中销毁Excel COM Interop对象的方法有哪些:

object_instance = null;
System.GC.collect();
&
System.Runtime.InteropServices.Marshal.ReleaseComObject(object);
Run Code Online (Sandbox Code Playgroud)

请建议只使用内置技术,而不是像bigcannon等其他工具.

c# com vsto

9
推荐指数
2
解决办法
4374
查看次数

Powershell如何在COM对象上查询接口

我使用Powershell创建了一个COM对象:

$obj = new-object -com MyLib.MyObj
Run Code Online (Sandbox Code Playgroud)

然后我需要查询该"MyLib.MyInterface"对象的接口,但我不知道如何使用PowerShell.

按顺序,假设我有以下C++代码

CComPtr<IInterface1> pInterface1;
CComPtr<IInterface2> pInterface2;
pInterface1->CoCreateInstance(CLSID_XXXX);   //in PowerShell: $obj = new-object -com MyLib.MyObj
pInterface1->QueryInterface(IID_YYYY, &pInterface2); //how to do this in PowerShell?
Run Code Online (Sandbox Code Playgroud)

我如何使用Powershell完成同样的工作

任何意见?

谢谢

com powershell queryinterface

9
推荐指数
2
解决办法
5155
查看次数

Visual Studio的调试器/交互式窗口如何在.NET中转储COM对象的属性?

在这个相关的问题中,我注意到Visual Studio的调试器能够枚举System.__ComObject引用的属性,这是"当包装器类型不明确时使用的隐藏类型" - 例如,当您从另一个获取它时获得的对象类型COM对象,不要自己实例化它:

COM对象调试视图

此外,如果您只是将COM对象的标识符写入立即窗口,其属性和值将被类似地转储:

COM对象立即窗口

请注意,这与VS2010的" 动态视图 " 是分开的,我认为它使用IDispatchCOM反射来枚举COM对象的属性,而不使用PIA和.NET反射.我正在使用的对象没有实现IDispatch(也没有实现IProvideClassInfo),因此,"动态视图"无法获取有关它们的任何信息:

动态视图

有趣的是,SharpDevelop的调试器无法列出System.__Comobjects(例如point.Envelope)的成员,只能列出强类型的RCW(例如point).

SharpDevelop调试器

那么Visual Studio如何才能做到呢?

我相信在这种情况下,这是因为主互操作程序集存在这些对象支持的接口的定义,并且Visual Studio可能使用反射来枚举支持的接口和属性.那是准确的吗?如果是这样,它是如何工作的?

对于初学者,它如何访问PIA?它只查看当前加载的PIA还是动态加载它们(如果是,如何)?它如何确定哪个界面可以有多个枚举属性?它似乎只使用一个,而不一定是第一个.从我正在使用的API(ArcObjects)的文档中,这些对象的默认接口是IUnknown,所以它不仅仅使用默认接口.

在屏幕截图的示例中,它枚举成员的IEnvelope接口是接口,它继承自IGeometry接口.VS2010如何知道不会枚举成员IGeometry,在我的测试中,如果你只是枚举PIA中的所有接口类型,它首先出现?一些非常聪明的事情或者我错过了一些明显的东西?

我问的原因是LINQPad 的开发人员似乎愿意实现相同的功能,如果他知道VS如何做到这一点.所以这里一个好的答案可以帮助改进这个非常受欢迎的工具.

com arcobjects com-interop visual-studio-2010 linqpad

9
推荐指数
1
解决办法
1167
查看次数

签署F#程序集(强名称组件)

我在CodeProject上发现了这篇文章:http: //www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menus

并且认为尝试一下会很好,但在F#中.所以我想出了以下代码:

open System
open System.IO
open System.Text
open System.Runtime.InteropServices
open System.Windows.Forms
open SharpShell
open SharpShell.Attributes
open SharpShell.SharpContextMenu

[<ComVisible(true)>]
[<COMServerAssociation(AssociationType.ClassOfExtension, ".txt")>]
type CountLinesExtension() =
    inherit SharpContextMenu.SharpContextMenu()

    let countLines =
        let builder = new StringBuilder()
        do 
            base.SelectedItemPaths |> Seq.iter (fun x -> builder.AppendLine(sprintf "%s - %d Lines" (Path.GetFileName(x)) (File.ReadAllLines(x).Length)) |> ignore  )
            MessageBox.Show(builder.ToString()) |> ignore

    let createMenu =
        let menu = new ContextMenuStrip()
        let itemCountLines = new ToolStripMenuItem(Text = "Count Lines")
        do
            itemCountLines.Click.Add (fun _ -> countLines)
            menu.Items.Add(itemCountLines) …
Run Code Online (Sandbox Code Playgroud)

com f# strongname shell-extensions code-translation

9
推荐指数
1
解决办法
1272
查看次数

WebBrowserSite:如何在派生类中调用私有COM接口方法?

这是挑战.我来自Framework的WebBrowserSite类.我的派生类的实例ImprovedWebBrowserSite是通过WebBrowser.CreateWebBrowserSiteBase,我在我的WebBrowser类的派生版本中重写- 特别是提供自定义站点对象.Framework的WebBrowser实现进一步将其传递给底层的非托管WebBrowser ActiveX控件.

到目前为止,我已经设法IDocHostUIHandler在我的ImprovedWebBrowserSite实现中覆盖(像这样).我现在正在寻找更多核心COM接口,比如IOleClientSite,我想要传递给它WebBrowserSite.所有这些都暴露在与COM ComImport,但声明privateinternal由框架实施的WebBrowserSite/ UnsafeNativeMethods.因此,我无法在派生类中明确地重新实现它们.我必须像我一样定义自己的版本IDocHostUIHandler.

所以,问题是,如何WebBrowserSite从我的派生类中调用定义的私有或内部COM接口的方法?例如,我想打电话IOleClientSite.GetContainer.我可以使用反射(像这样),但这将是最后的手段,其次是WebBrowser从头开始重新实现.

我的想法是,因为Framework的私有UnsafeNativeMethods.IOleClientSite和我自己ImprovedWebBrowserSite.IOleClientSite都是COM接口,用ComImport属性声明,相同的GUID和相同的方法签名..NET 4.0+中有COM类型等价,因此必须有一种方法可以在没有反射的情况下完成.

[更新]现在我已经有了一个解决方案,我相信它为自定义WinForms版本WebBrowser控件开启了一些新的和有趣的可能性.

这个版本的问题是在我最初尝试以更抽象的形式表达问题之后创建的,被评论员称为误导.评论已被删除,但我决定保留这两个版本.

为什么我不想用反射来解决这个问题?原因如下:

  • 依赖于实现者给出的内部或私有方法的实际符号名称WebBrowserSite,与COM接口不同,它与二进制v表合同有关.

  • 庞大的反射代码.例如,考虑调用base的私有TranslateAcceleratorvia Type.InvokeMember …

.net c# com com-interop webbrowser-control

9
推荐指数
1
解决办法
1939
查看次数

通过 Powershell 关闭时无法停止所有 Excel 进程

使用此代码,我打开 excel(使用visible = false,以便用户看不到它),写入工作簿,然后在脚本结束后打开 excel(使其可见)或完全关闭它而不保存。当我保存 Excel、使其保持打开状态、结束脚本,然后稍后手动关闭 Excel 时,任务管理器中没有后台进程。但是,当我使用脚本关闭 Excel 时,它仍保留在任务管理器中。

以下是我开始使用 Excel 的方法:

    $script:excel = new-object -ComObject excel.application # create excel object
    $excel.visible = $false # hide excel window
    $script:workbook = $excel.Workbooks.Add() # add excel file
    $script:ws1 = $workbook.Worksheets.Item(1) # create new sheet
Run Code Online (Sandbox Code Playgroud)

这是我关闭它的方法:

        [gc]::Collect()
        [gc]::WaitForPendingFinalizers()
        if ($script:closeOnX) {
            #only do this if not keeping excel open
            Write-Host "Closing Excel"
            $excel.Quit()
        }
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
Run Code Online (Sandbox Code Playgroud)

closeOnX 只是一个标志,因此它仅在某些情况下实际关闭 Excel 应用程序。其余部分在每次脚本结束时执行。

当我结束脚本并同时关闭 Excel 时,我只想关闭当前的 Excel 进程(这就是我不想停止进程的原因),而不关闭用户可能正在处理的其他工作簿。

当我结束脚本、保存并打开 Excel 时,我希望当用户手动关闭 Excel 时所有进程都消失。(这是工作)

com excel powershell user-interface rcw

9
推荐指数
1
解决办法
4252
查看次数