标签: 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
查看次数

Delphi 2009 COM/ActiveX类型库支持稳定性

参考TLB和维护问题 ......

我的人们(通常)使用的问题新的COM/ActiveX类型库支持,2009年德尔福:
如何稳定是实现?

特别是,我感兴趣的是:添加/删除类,更改GUID,重命名方法/属性,重新排序方法/属性,大型类型库(50多个类),...

它是否像Delphi 2007(噩梦)或Delphi 7一样稳定(相当不错,但有时你必须从SVN恢复TLB文件)或超稳定(如...,嗯,....你呢?记住任何Delphi版本)?

编辑:是的,当然,文本RIDL是一个很好的主意,但我的问题是:TLB
的(新)实现是否支持稳定(特别是RIDL文件与可视TLB编辑器和实现类的同步)我上面描述的任务).

delphi com activex typelib delphi-2009

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

COM的跨平台替代方案

我一直迷恋于基于组件的编程(无论是COM,另一个系统,还是只使用普通C++中的范例).它需要一点习惯,如果一个人习惯于"传统的"OOP模型,但它是值得的.它使我的代码更易于维护和扩展.

我目前正在研究的项目是使用范例,但没有设置系统.但是,我真的很想找到一些可以满足以下要求的系统.从我现在的状态切换到新系统需要花费一些时间,但是我稍后会节省多倍的时间.

要求:

  1. 跨平台
  2. 快速
  3. 适用于C++
  4. 支持跨进程编组

让我详细说明这些要求:

跨平台

基本上,我需要它在Windows和Mac上工作.Linux会很好,但绝不是必不可少的.此外,它确实需要满足所有平台的其他要求.有一个适用于Mac的COM,这将是理想的,但它不支持要求4.此外,它必须支持GCC和MSVC.

快速

不幸的是,这就是CORBA失败的地方,尽管它满足了其他三个要求.进程内方法调用需要尽可能快(理想情况下,如COM),因为某些例程也可能从音频中断调用.

适用于C++

......我想这一点大多是显而易见的.我不介意不使用C++类来实现组件,虽然这将定义有用,并且替代方案必须仍然易于使用,特别是因为最终我打算发布第三方扩展的API.

支持跨进程编组

我的意思是至少能够序列化呼叫.如果这是通过IDL生成的代码完成的,那对我来说完全没问题,而且我也不介意实现跨进程通信本身.

COM会很棒,但它不能完全满足要求1.CORBA也会很棒,但它不符合要求2(即使有最快的ORB).XPCOM可能不符合要求2,并且不适用于MSVC,因此不符合要求1.

有什么想法吗?我的下一步是使用protobufs或类似的东西来推销自己,但我当然希望避免这种情况.

更新

详细说明 - 在此上下文中的音频中断可以低至2-3ms.那个时间甚至不能完全提供给我,因为其他组件需要在那个时间处理,而我的软件本身就包含了另一个需要在那个时间处理的软件.这就是为什么在进程和跨进程编组都需要非常快的原因.

c c++ com cross-platform corba

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

通过C#启动的PowerPoint不会退出

嘿,我是从C#WinForms应用程序自动化PowerPoint和Excel; 我所做的是从PowerPoint中读取幻灯片并将其保存在Excel中,然后退出这两个应用程序.Excel已成功退出,但PowerPoints未退出.问题是,当我第一次转换它不退出时,但当我再次转换时它确实.

这是我的代码

try
{
    PowerPoint.Application ppApp;
    PowerPoint.Presentation ppPres;
    List<Company> companies = new List<Company>();

    ppApp = new PowerPoint.Application();
    ppApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
    ppApp.WindowState = Microsoft.Office.Interop.PowerPoint.PpWindowState.ppWindowMinimized;

    ppPres = ppApp.Presentations.Open(fileTxtBox.Text,
                                      Microsoft.Office.Core.MsoTriState.msoFalse,
                                      Microsoft.Office.Core.MsoTriState.msoFalse,
                                      Microsoft.Office.Core.MsoTriState.msoTrue);

    int slides = ppPres.Slides.Count;

    for (int slide = 1; slide <= slides; slide++)
    {
        int rows = 1;
        PowerPoint.Cell cell;
        int shape = 1;

        for (; shape < ppPres.Slides[slide].Shapes.Count; shape++)
        {
            if (ppPres.Slides[slide].Shapes[shape].HasTable == Microsoft.Office.Core.MsoTriState.msoTrue)
            {
                cell = ppPres.Slides[slide].Shapes[shape].Table.Cell(1, 1);

                if (cell.Shape.TextFrame.TextRange.Text.Trim().ToLower().Contains("realized"))
                {
                    rows = ppPres.Slides[slide].Shapes[shape].Table.Rows.Count;
                    break;
                }
            }
        } …
Run Code Online (Sandbox Code Playgroud)

c# com powerpoint

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

C#从COM对象获取progID

我想知道是否有办法在c#中获取com对象的progId.例如 - 我有一个webBrowser对象,它暴露了一个COM文档对象.有没有办法弄清楚该文档对象的progID是什么?

我知道你可以从progID获取对象,只是不知道如何做反过来.

c# com object marshalling

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

找出可以查询COM对象的接口?

我正在使用ESRI的ArcObjects COM库,我正在努力弄清楚"选择"应该是什么类型:

IMxDocument doc = m_application.Document as IMxDocument;
object selected = doc.SelectedItem;
Run Code Online (Sandbox Code Playgroud)

SelectedItem返回一个comobject(Not Null),通常表示当前选择的数据类型.但是我没有最微弱的想法,我应该把它投入到什么类型.当我调试它时,我真的没有看到任何有用的东西:

http://imgur.com/Yfo6G

(在设置值后观察调试)

ESRI的ArcObjects库非常庞大,文档记录很差,我简直无法理解.我甚至竟然手动检查了大约50个我认为应该是的界面.

有没有人有任何想法我怎么能搞清楚这一点?

编辑澄清他们的文档绝对没有帮助,他们的论坛也没有.

c# com

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

为什么可以创建COM接口的新实例?

我没有很多关于COM和coclasses的背景知识,所以我不太明白为什么我可以使用new带接口的运算符.从语言/框架无关的角度来看,令人困惑的是,为什么编译和运行正确:

using Microsoft.Office.Interop.Excel;

public class ExcelProgram
{
    static void Main(string[] args)
    {
        Application excel = new Application();
    }
}
Run Code Online (Sandbox Code Playgroud)

Application在Visual Studio 2010中进行检查向我显示:

using System.Runtime.InteropServices;

namespace Microsoft.Office.Interop.Excel
{
    // Summary:
    //     Represents the entire Microsoft Excel application.
    [Guid("000208D5-0000-0000-C000-000000000046")]
    [CoClass(typeof(ApplicationClass))]
    public interface Application : _Application, AppEvents_Event
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

幕后发生了什么?

c# com interop coclass

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

从64位模式运行的c#调用32位COM

我有一个第三方COM对象(32位),我需要从我的c#应用程序(64位)调用.我知道我必须在一个单独的进程中运行COM对象.这个COM对象有很多类实现,所以我试图避免编写我自己的远程包装器暴露所有方法.COM +似乎是最直接的解决方案.我打开了"组件服务"菜单,创建了一个新的COM +应用程序,将我的COM对象作为组件添加到此应用程序中.一切似乎都很美妙.

在我的C#应用​​程序中,我添加了原始COM对象作为引用(自动生成类型库).使用类型库引用,我可以从COM +组件创建对象(我看到它们开始在组件服务窗口中旋转),但是当我尝试访问对象的方法时,我得到一个错误说接口没有注册.

有人有线索吗?我回去并在COM对象上运行了regsvr32,但我认为没有必要,并没有帮助.我在C#中的用法是否正确?VS2008自动完成没有问题看到这些方法.

确切的例外是:"未注册接口(HRESULT异常:0x80040155)"

我不清楚组件服务中的权限和角色究竟是什么,我尝试将COM +对象标识设置为在系统帐户下运行,既作为本地服务又作为交互式用户.我在角色中添加了Everyone作为用户.一切都在本地运行,所以不应该有文件权限或类似的问题.

我还想重申,这个COM对象包含许多类.我在客户端成功实例化了一个类对象并设置了一些属性值.我也成功实例化了另一个类对象,但在尝试调用第二个对象的方法时收到了这个异常....所以我认为我的COM对象注册的注册表存在问题.

.net c# com 64-bit

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

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
查看次数