Подтвердить что ты не робот

D для COM

В Википедии говорится следующее: "В Microsoft Windows D может получить доступ к коду COM (Component Object Model)".

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

4b9b3361

Ответ 1

У 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

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

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

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

В Hannes J. используйте auto вместо delphi var

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

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

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

auto events = new EventProvider! (XMLDOMDocumentEvents) (doc); область действия (exit).Release();

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

//Сканирование документа для загрузки асинхронно.

doc.put_async (com_true);

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

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

Ответ 3

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

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