Небольшая библиотечка - "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;
}
Размышлял недавно над высказыванием "Кто не рискует, тот не пьет шампанское", пришел к выводу, что оно довольно глупо звучит, ибо умные люди риски того или иного действия оценивают, а особо хитромудрые стремятся переложить риски на чужие плечи.
А вот поговорку "Дареному коню в зубы не смотрят" наверняка придумали те, кто снаряжал троянского коня :))
В мире нет ничего сверхъестественного, все что люди называют сверхъестественным - это то естественное, что находится за гранью нашего познания.
Test
