2010-09-13 8 views
10

Wikipedia nói như sau: "Trên Microsoft Windows, D có thể truy cập mã COM (Component Object Model)."D hỗ trợ cho COM

Loại hỗ trợ nào của COM có trong D? Liệu nó làm cho cuộc sống dễ dàng hơn bằng cách sử dụng COM trong C + +. Tôi đã tìm thấy this link trên trang D nhưng nó không cho tôi biết quá nhiều.

Trả lời

3

Juno có phiên bản mới .5.1 có nhiều cách kết nối tuyệt vời với Word, Excel, FrameMaker, Trados, v.v. Vì vậy, có thể và dễ dàng. Một cái gì đó như thế này:

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

Cảm ơn mã ví dụ. Điều này trả lời câu hỏi của tôi, mặc dù tôi hy vọng rằng D sẽ có một số hỗ trợ ngôn ngữ năng động cho các con thú như COM giống như các biến thể hỗ trợ Delphi có và từ khóa var trong C#. Có lẽ trong tương lai? Tôi đoán nó có vẻ như một cái gì đó mà không thuộc về một ngôn ngữ lập trình hệ thống, nhưng tôi tin rằng nó cần thiết cho các trường hợp như thế này và cho những thứ như invocation từ xa. Xem xét rằng D có những thứ như bộ sưu tập rác, một tính năng như thế này có lẽ phù hợp. Có một diễn đàn mà người ta có thể bỏ phiếu cho một cái gì đó như thế này? –

+1

Sự hiểu biết của tôi là var không phải là một loại biến thể nó C# và chính xác như sử dụng tự động trong D (kiểu suy luận). D có http://digitalmars.com/d/2.0/phobos/std_variant.html –

2

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

Tôi biết đây là một nơi nào đó nhưng phải mất một thời gian để tìm thấy nó. Về cơ bản, COM hỗ trợ trong D là một hack trên đầu trang của giao diện. Rõ ràng trình biên dịch biết về chúng và coi chúng là "đặc biệt" theo một vài cách nhỏ, vì vậy mọi thứ hoạt động. BTW, tôi nghĩ COM đã chết.

+3

COM chắc chắn không phải là chết, một số tính năng mới trong Windows Vista và 7 chỉ có thể truy cập thông qua nó. Tôi đã đăng một ví dụ [url = http: //lists.puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html] tại đây [url] – torhu

+0

[liên kết chính xác tại đây] (http: // danh sách. puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html) – torhu

+1

Một tấn mã Windows sử dụng COM, vì vậy nó không thể chết bất kỳ lúc nào. – casablanca

3

Thư viện Juno, được viết bởi John Chapman, chứa các mô-đun hỗ trợ COM. Thật không may là không cập nhật với trình biên dịch mới nhất.

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

nên là một phần của phobos, bên cạnh.

Để Hannes J. sử dụng tự động thay vì delphi var

// Tạo một thể hiện của IXMLDOMDocument3.

tự động doc = DOMDocument60.coTạo! (IXMLDOMDocument3); phạm vi (thoát) doc.Release();

// Tạo cá thể của nhà cung cấp sự kiện.

sự kiện tự động = EventProvider mới! (XMLDOMDocumentEvents) (doc); phạm vi (thoát) events.Release();

events.bind ("onReadyStateChange", { writefln ("trạng thái đã thay đổi"); }); events.bind ("onDataAvailable", { writefln ("dữ liệu có sẵn"); });

// Yêu cầu tài liệu tải không đồng bộ.

doc.put_async (com_true);

// Tải tài liệu XML.

kết quả com_bool; doc.load ("books.xml" .toVariant (đúng), kết quả);

+0

Ah Nếu tôi hiểu chính xác thì tự động là điều tôi đang tìm kiếm.Cảm ơn :-) –

+1

Hmmm, có vẻ như tự động cung cấp chỉ suy luận loại và không ràng buộc muộn? –