Буду поддерживать COM - PullRequest
       24

Буду поддерживать COM

10 голосов
/ 13 сентября 2010

Википедия говорит следующее: «В Microsoft Windows D может получить доступ к коду COM (объектная модель компонентов)».

Какая поддержка COM присутствует в D?Делает ли это жизнь проще, чем использование COM в C ++.Я нашел эту ссылку на странице D, но она не говорит мне слишком много.

Ответы [ 3 ]

3 голосов
/ 14 сентября 2010

Библиотека Juno, написанная Джоном Чепменом, содержит модули поддержки COM. К сожалению, не в курсе последних версий компилятора.

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

Должно быть частью Фобоса, рядом.

Ханнесу Дж. Используйте auto вместо delphi's var

// Создать экземпляр IXMLDOMDocument3.

auto doc = DOMDocument60.coCreate! (IXMLDOMDocument3); область (выход) doc.Release ();

// Создать экземпляр поставщика событий.

auto events = new EventProvider! (XMLDOMDocumentEvents) (doc); события области видимости (выхода) .Release ();

events.bind ("onReadyStateChange", { writefln («состояние изменилось»); }); events.bind ("onDataAvailable", { writefln («данные доступны»); });

// Попросить документ загрузить асинхронно.

* * 1 022 doc.put_async (com_true);

// Загрузить документ XML.

com_bool result; doc.load ("books.xml" .toVariant (true), результат);

3 голосов
/ 15 сентября 2010

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");
2 голосов
/ 14 сентября 2010

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

Я знал, что это было где-то, но мне понадобилось время, чтобы найти его.По сути, поддержка COM в D - это взлом поверх интерфейсов.Видимо, компилятор знает о них и рассматривает их как «особые» несколькими небольшими способами, поэтому все работает.Кстати, я думал, что COM был мертв.

...