2010-09-13 60 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