D对COM的支持
回答
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");
http://www.digitalmars.com/d/2.0/interface.html#COM-Interfaces
我知道这是什么地方,但我花了一段时间来找到它。基本上,D中的COM支持是接口之上的黑客攻击。显然,编译器知道它们,并以几种小方法将它们视为“特殊”,所以一切正常。顺便说一句,我以为COM死了。
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
[正确的链接](http:// lists。 puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html) – torhu 2010-09-14 01:07:04
大量的Windows代码使用COM,所以它不可能很快就会死掉。 – casablanca 2010-09-15 02:05:09
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);
啊如果我理解正确,那么汽车是我正在寻找的东西。谢谢:-) – 2010-09-17 08:58:19
嗯,它似乎自动提供只是类型推断,而不是后期绑定呢? – 2010-09-17 09:20:25
感谢您的示例代码。这回答了我的问题,尽管我希望D能像COM那样支持动态语言,比如支持Delphi的变体支持和C#中的var关键字。也许将来呢?我想这似乎是不属于系统编程语言的东西,但我相信它需要像这样的实例以及诸如远程调用之类的实例。考虑到D有垃圾收集之类的东西,这个功能可能适合。有没有可以投票赞成这样的论坛? – 2010-09-16 07:57:26
我的理解是var不是C#的变体类型,而是完全像在D中使用auto(type推理)。 D确实有http://digitalmars.com/d/2.0/phobos/std_variant.html – 2010-09-20 23:47:51