2010-09-13 58 views
10

维基百科说以下内容:“在Microsoft Windows上,D可以访问COM(组件对象模型)代码。”D对COM的支持

D中对COM有什么样的支持?它是否比在C++中使用COM更简单。我在D页发现了this link,但它并没有告诉我太多。

回答

3

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"); 
+0

感谢您的示例代码。这回答了我的问题,尽管我希望D能像COM那样支持动态语言,比如支持Delphi的变体支持和C#中的var关键字。也许将来呢?我想这似乎是不属于系统编程语言的东西,但我相信它需要像这样的实例以及诸如远程调用之类的实例。考虑到D有垃圾收集之类的东西,这个功能可能适合。有没有可以投票赞成这样的论坛? – 2010-09-16 07:57:26

+1

我的理解是var不是C#的变体类型,而是完全像在D中使用auto(type推理)。 D确实有http://digitalmars.com/d/2.0/phobos/std_variant.html – 2010-09-20 23:47:51

2

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

我知道这是什么地方,但我花了一段时间来找到它。基本上,D中的COM支持是接口之上的黑客攻击。显然,编译器知道它们,并以几种小方法将它们视为“特殊”,所以一切正常。顺便说一句,我以为COM死了。

+3

COM绝对没有死,Windows Vista和7中的一些新功能只能通过它访问。我在这里[url] http://lists.puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html]发布了一个示例[url] – torhu 2010-09-14 00:59:55

+0

[正确的链接](http:// lists。 puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html) – torhu 2010-09-14 01:07:04

+1

大量的Windows代码使用COM,所以它不可能很快就会死掉。 – casablanca 2010-09-15 02:05:09

3

John Chapman编写的Juno lib包含COM支持模块。不幸的是没有及时更新最新的编译器。

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

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

要汉纳斯J.使用汽车,而不是德尔福的无功

//创建IXMLDOMDocument3的一个实例。

auto doc = DOMDocument60.coCreate!(IXMLDOMDocument3); 范围(退出)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 result; doc.load(“books.xml”.toVariant(true),result);

+0

啊如果我理解正确,那么汽车是我正在寻找的东西。谢谢:-) – 2010-09-17 08:58:19

+1

嗯,它似乎自动提供只是类型推断,而不是后期绑定呢? – 2010-09-17 09:20:25