Home

Advertisement




Небольшая библиотечка - "comtools" для упрощения работы с COM Automation.
Описание смотрите здесь.Там же на странице ссылка на архив с исходниками
Небольшой пример:


В качестве примера я взял вот этот код и переписал его с использованием Comtools,сохранив функциональность.



#include  <iostream>
#include  "comtools.hpp"
using namespace std;
int main(){
  try{
  CoInitialize(static_cast<LPVOID>(0));
  
  //Запускаем Excel
  Variant xlApp = startApp(OLESTR("Excel.Application"));

  //Делаем Excel видимым
  invokeSetProperty(xlApp,OLESTR("Visible"), true);

  //Получаем свойство 'Application.Workbooks'
  Variant Wkbooks = invokeGetProperty(xlApp, OLESTR("Workbooks"));

  //Вызываем метод 'Workbooks.Add' - создание новой книги
  Variant Wkbook = invokeMethod(Wkbooks,OLESTR("Add"));
  
  //Получаем свойство 'Workbook.ActiveSheet' - Активный лист
  Variant ActSht = invokeGetProperty(Wkbook,OLESTR("ActiveSheet"));
  
  //Получаем свойство 'Range("A1:O15")' активного листа
  Variant Range = invokeGetProperty(ActSht,OLESTR("Range"), Convert2WideChar ( ("A1:O15")));
  
  // Create a 15x15 safearray
  SAFEARRAYBOUND sab[2];
  sab[0].lLbound = 1; sab[0].cElements = 15;
  sab[1].lLbound = 1; sab[1].cElements = 15;
  SAFEARRAY* sarray = SafeArrayCreate (VT_VARIANT, 2, sab);

   // Fill safearray with some values...
  for(int i=1; i<=15; i++) {
    for(int j=1; j<=15; j++) {
      // Create entry value for (i,j)
      Variant tmp = i*j;
      // Add to safearray...
      long indices[] = {i,j};
      HRESULT hr = SafeArrayPutElement(sarray, indices, static_cast<void*>(dynamic_cast<VARIANT*>(&tmp)));
      if (FAILED(hr))
        throw hr;
    }
  }
  //Для автоматической очистки созданного массива
  Variant array = sarray;

  //'Range.Value' заполняем значениями из массива
  invokeSetProperty(Range,OLESTR("Value"),array);

  ::MessageBox(NULL, "All done.", "Notice", 0x10000);
  
  //Типа, книгу мы уже сохранили
  invokeSetProperty(Wkbook, OLESTR("Saved"), true);
  
  //Выход
  invokeMethod(xlApp,OLESTR("Quit"));
  
  CoUninitialize();
  }
  catch(HRESULT hr){
    cerr << hex << hr << "-" << translateHRESULT(hr)<< endl;
  }
  
  return 0;
}
Размышлял недавно над высказыванием "Кто не рискует, тот не пьет шампанское", пришел к выводу, что оно довольно глупо звучит, ибо умные люди риски того или иного действия оценивают, а особо хитромудрые стремятся переложить риски на чужие плечи.


А вот поговорку "Дареному коню в зубы не смотрят" наверняка придумали те, кто снаряжал троянского коня :))

Афоризм

  • Jun. 29th, 2008 at 12:15 AM
В мире нет ничего сверхъестественного, все что люди называют сверхъестественным - это то естественное, что находится за гранью нашего познания.