2010-09-13 21 views
10

Wikipedia dice lo siguiente: "En Microsoft Windows, D puede acceder al código COM (Modelo de Objetos Componentes)".Soporte D para COM

¿Qué tipo de soporte para COM está presente en D? ¿Hace la vida más fácil que usar COM en C++? Encontré this link en la página D pero no me dice demasiado.

Respuesta

3

Juno tiene una nueva versión .5.1 que tiene muchas maneras excelentes de conectarse a Word, Excel, FrameMaker, Trados, etc. Por lo tanto, es posible y fácil. Algo como esto:

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

Gracias por el código de ejemplo. Esto responde mi pregunta, aunque esperaba que D tuviese un soporte de lenguaje dinámico para bestias como COM, como la variante de soporte que tiene Delphi y la palabra clave var en C#. Quizás en el futuro? Supongo que parece algo que no pertenece a un lenguaje de programación de sistemas, pero creo que es necesario para casos como este y para cosas como la invocación remota. Teniendo en cuenta que D tiene cosas como la recolección de basura, una característica como esta quizás sea adecuada. ¿Hay un foro donde uno puede votar por algo como esto? –

+1

Según tengo entendido, var no es una variante, escriba C# y es exactamente como usar auto en D (type inference). D tiene http://digitalmars.com/d/2.0/phobos/std_variant.html –

2

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

sabía que esto estaba en algún lugar pero me tomó un tiempo para encontrarlo. Básicamente, el soporte COM en D es un truco en la parte superior de las interfaces. Aparentemente el compilador los conoce y los trata como "especiales" en algunas pequeñas formas, así que todo funciona. Por cierto, pensé que COM estaba muerto.

+3

COM definitivamente no está muerto, algunas de las nuevas características en Windows Vista y 7 solo son accesibles a través de él. Publiqué un ejemplo [url = http: //lists.puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html] aquí [url] – torhu

+0

[enlace correcto aquí] (http: // lists. puremagic.com/pipermail/digitalmars-d-dwt/2010-June/001923.html) – torhu

+1

Una tonelada de código de Windows hace uso de COM, por lo que no es posible que muera pronto. – casablanca

3

Juno lib, escrito por John Chapman, contiene módulos de soporte COM. Desafortunadamente no está actualizado con el último compilador.

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

debe ser parte de Fobos, al lado.

Para Hannes J. utilizar Auto en lugar de var de Delphi

// crea una instancia de IXMLDOMDocument3.

auto doc = DOMDocument60.coCreate! (IXMLDOMDocument3); ámbito (salida) doc.Release();

// Crea una instancia del proveedor de eventos.

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

events.bind ("onReadyStateChange", { writefln ("estado cambiado"); }); events.bind ("onDataAvailable", { writefln ("datos disponibles"); });

// Indique al documento que se cargue de forma asíncrona.

doc.put_async (com_true);

// Cargue el documento XML.

com_bool result; doc.load ("books.xml" .toVariant (true), result);

+0

Ah Si entiendo correctamente, entonces auto es lo que estaba buscando.Gracias :-) –

+1

Hmmm, parece que auto proporciona simplemente inferencia tipo y no vinculante tarde también? –