【问题标题】:D support for COMD 对 COM 的支持
【发布时间】:2010-09-13 08:46:37
【问题描述】:

维基百科这样说:“在 Microsoft Windows 上,D 可以访问 COM(组件对象模型)代码。”

D 中提供了什么样的 COM 支持?它是否比在 C++ 中使用 COM 更轻松。我在 D 页找到了this link,但它并没有告诉我太多。

【问题讨论】:

    标签: windows com d


    【解决方案1】:

    Juno 有一个新版本 .5.1,它有很多连接 Word、Excel、FrameMaker、Trados 等的好方法。所以,它是可能的,而且很容易。像这样的:

    scope word = new DispatchObject("Word.Application");
    scope wDocs = word.get("Documents");
    
    char[] dd  = dir ~ r"\";
    
    char[][] docs = GetFilesFromDir(dir ~ r"\", "*." ~ fromType, true);
    if (docs.length == 0)
    {
      info.text = "Did not find any " ~ std.string.toupper(fromType) ~
        " files in the directory... \n\nExiting...";
      return;
    }
    foreach(char[] d; docs)
    {
      scope wDoc = wDocs.call("Open", d);//"Normal", false, 0);
      char[] txt = std.path.getName(d);  // original file ie. test if it was test.doc
      txt ~= ".doc";
      if (std.file.exists(txt))
        std.file.remove(txt);
    
      wDoc.call("SaveAs",
          txt,      // FileName
          0,        // FileFormat wdFormatDOC = 0
          false,    // LockComments
          "",       // Password
          false,    // AddToRecentFiles
          "",       // WritePassword
          false,    // ReadOnlyRecommended
          false,    // EmbedTrueTypeFonts
          false,    // SaveNativePictureFormat
          false,    // SaveFormsData
          false,    // SaveAsAOCELetter
          65001,    // Encoding 65001 is UTF8
          false,    // InsertLineBreaks
          false,    // AllowSubstitutions
          0         // LineEnding Const wdCRLF = 0
          );
      wDoc.call("Close");
    }
    word.call("Quit");
    

    【讨论】:

    • 感谢示例代码。这回答了我的问题,尽管我希望 D 对像 COM 这样的野兽有一些动态语言支持,比如 Delphi 的变体支持和 C# 中的 var 关键字。也许在未来?我想它似乎不属于系统编程语言,但我相信它需要这样的实例和远程调用之类的东西。考虑到 D 有垃圾收集之类的东西,这样的功能可能适合。有没有一个论坛可以为这样的事情投票?
    • 我的理解是 var 不是 C# 的变体类型,与在 D 中使用 auto 完全一样(类型推断)。 D 确实有digitalmars.com/d/2.0/phobos/std_variant.html
    【解决方案2】:

    John Chapman 编写的 Juno 库包含 COM 支持模块。不幸的是,没有最新的编译器。

    http://www.dsource.org/projects/juno/wiki/ComProgramming/“朱诺通信”

    应该是火卫一的一部分,旁边。

    致 Hannes J. 使用 auto 而不是 delphi 的 var

    // 创建 IXMLDOMDocument3 的实例。

    自动文档 = DOMDocument60.coCreate!(IXMLDOMDocument3); 范围(退出) doc.Release();

    // 创建一个事件提供者实例。

    自动事件 = new EventProvider!(XMLDOMDocumentEvents)(doc); scope(exit) events.Release();

    events.bind("onReadyStateChange", { writefln("状态改变"); }); events.bind("onDataAvailable", { writefln("数据可用"); });

    // 告诉文档异步加载。

    doc.put_async(com_true);

    // 加载 XML 文档。

    com_bool 结果; doc.load("books.xml".toVariant(true), result);

    【讨论】:

    • 啊,如果我理解正确,那么 auto 就是我要找的东西。谢谢:-)
    • 嗯,似乎 auto 只提供类型推断而不提供后期绑定?
    【解决方案3】:

    http://www.digitalmars.com/d/2.0/interface.html#COM-Interfaces

    我知道这是在某个地方,但我花了一段时间才找到它。基本上,D 中的 COM 支持是对接口的一种破解。显然编译器知道它们,并以一些小的方式将它们视为“特殊”,所以一切正常。顺便说一句,我以为 COM 已经死了。

    【讨论】:

    • COM 绝对没有死,Windows Vista 和 7 中的一些新功能只能通过它访问。我发布了一个示例 [url=lists.puremagic.com/pipermail/digitalmars-d-dwt/2010-June/…
    • 大量的 Windows 代码使用了 COM,所以它不可能很快死掉。
    • 是的,我想我们中的一些人希望它死,但似乎暂时不会。例如windows VSS API 是 COM,Outlook 和 Exchange 仍然使用 MAPI,即 COM。
    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 2011-03-15
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2016-03-29
    相关资源
    最近更新 更多