首页 文章

D支持COM

提问于
浏览
10

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

D中存在什么样的COM支持?它是否比在C中使用COM更容易 . 我在D页面上找到了this link,但它并没有告诉我太多 .

3 回答

  • 2

    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");
    
  • 3

    由John Chapman编写的Juno lib包含COM支持模块 . 遗憾的是,最新的编译器并不是最新的 .

    http://www.dsource.org/projects/juno/wiki/ComProgramming/ "Juno COM"

    应该是phobos的一部分,旁边 .

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

    //创建IXMLDOMDocument3的实例 .

    auto doc = DOMDocument60.coCreate!(IXMLDOMDocument3); scope(exit)doc.Release();

    //创建一个事件提供程序实例 .

    auto events = new EventProvider!(XMLDOMDocumentEvents)(doc); scope(exit)events.Release();

    events.bind(“onReadyStateChange”,{writefln(“state changed”);}); events.bind(“onDataAvailable”,{writefln(“data available”);});

    //告诉文档异步加载 .

    doc.put_async(com_true);

    //加载XML文档 .

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

  • 3

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

    我知道这是某个地方,但我花了一段时间才找到它 . 基本上,D中的COM支持是接口之上的黑客攻击 . 显然,编译器知道它们并在几个小方面将它们视为“特殊”,所以一切正常 . 顺便说一下,我以为COM已经死了 .

相关问题