Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6461
Последний выпуск: 19.06.2015

COM/DCOM, ActiveX

231
12 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Здесь размещаем вопросы по COM/DCOM, ActiveX, OLE, ATL и т.п.
34K
17 мая 2008 года
brink
8 / / 31.03.2008
Вопрос:
В отдельном потоке или DLL, при попытке доступа к COM-объекту выдается ошибка: "Не был произведен вызов CoInitialize".
Ответ:
Функция CoInitialize предназаначена для инициализации COM-объектов в текущем потоке и установки для него модели single-thread apartment(STA).
Вызов данной функции должен производиться перед любой попыткой доступа к объектам COM (OLE). Если вы используете стандартный набор пакетов в приложении - этот вызов выполнять нет необходимости - так как при загрузке пакетов реализующих классы-компоненты ADO и др. это происходит автоматически. Если же вы собираете приложение без пакетов, или создаете dll (в которой инициализация библиотек автоматически не выполняеться) - вызов данной функции необходимо выполнять явно. Функция определена в заголовочном файле objbase.h - он соответственно должент быть подключен.
По завершении работы необходимо вызвать CoUninitialize.
Описание функции - на сайте Microsoft
Пример:
 
Код:
HWND LoadFormAll(HWND Handler,const char *connect){//Функция в длл
CoInitialize(NULL);//Инициализируем библиотеку СОМ
  TfmMain *fmMain = new TfmMain(NULL);//создание указателя на форму
  fmMain->SetConnect(Handler,connect);//Функция, которая инициализирует
//компоненты доступа к БД через АДО
  fmMain->ShowModal();
  delete fmMain;//Работа закончена
CoUninitialize();  //Закрываемся
  return 0;
}
231
21 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Вопрос:
Как ускорить вывод/загрузку данных в/из Excel?

Ответ:
Вариант 1. Вставлять сразу диапазонами, а не в каждую ячейку:

Пример:
Код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TDateTime tm1, tm2;
    String Range;
    Variant A(OPENARRAY(int, (0, StringGrid1->ColCount)), varVariant);

    tm1 = Time();
    XL = CreateOleObject("Excel.Application.8");
    XL.OlePropertySet("Visible", CheckBox1->Checked);
    v0 = XL.OlePropertyGet("Workbooks");
    v0.OleProcedure("Add");
    v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);

    for (int i = 0; i < StringGrid1->RowCount; i++) {
        for (int j = 0; j < StringGrid1->ColCount; j++) {
            A.PutElement(StringGrid1->Cells[j],j);
        }
        Range.printf("A%d:J%d", i+1, i+1);
        v1.OlePropertyGet("Range", Range.c_str()).OlePropertySet("Value", A);
    }

    XL.OlePropertySet("DisplayAlerts",false);
    XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls"));
    XL.OleProcedure("Quit");

    tm2 = Time();
    ShowMessage("done with " + TimeToStr(tm2 - tm1));
}


Вариант 2. Сформировать строковый массив, слова в строках д.б. разделены символом табуляции и все это вставить через Clipboard.

Пример:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList* data = new TStringList();
    String line;
    TDateTime tm1, tm2;

    tm1 = Time();
    //вставим в Excel...
    XL = CreateOleObject("Excel.Application.8");
    XL.OlePropertySet("Visible", CheckBox1->Checked);
    v0 = XL.OlePropertyGet("Workbooks");
    v0.OleProcedure("Add");
    v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);

    //добавляем строки в которых слова разделены Tab-ом, Excel - поймет...
    for (int i = 0; i < StringGrid1->RowCount; i++) {
        line = StringGrid1->Cells[0];
        for (int j = 1; j < StringGrid1->ColCount; j++) {
            line = line  + "\t" + StringGrid1->Cells[j];
        }
        data->Add(line);
    }
    //в Clipboard...
    Clipboard()->AsText = data->Text;

    v1.OlePropertyGet("Range", "A1:A1").OleProcedure("Select"); //например начиная с этой ячейки...
    v1.OleProcedure("Paste");

    Clipboard()->Clear();

    XL.OlePropertySet("DisplayAlerts",false);
    XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls"));
    XL.OleProcedure("Quit");

    tm2 = Time();
    ShowMessage("done with " + TimeToStr(tm2 - tm1));

    delete data;
}


Автор ответа: ***
231
28 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Вопрос:
Как убрать программу из TaskBarа?

Пример:
Код:
#pragma hdrstop
#include <windows.h>
#include <shlobj.h>

void StatusOnTaskBar(HWND hwnd,int status)
{
 HRESULT hrc,hr;
  ITaskbarList *pITaskbarList;
 CoInitialize(NULL);
 hrc = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
                      IID_ITaskbarList, (void**)&pITaskbarList);
 if(hrc !=S_OK){MessageBox(NULL,"NoCreate","ITaskbarList",MB_OK);return;}
 hr=pITaskbarList->HrInit();
 if(hr ==NOERROR)
 {
  switch(status)
  {
   case 0: pITaskbarList->DeleteTab(hwnd); break;
   case 1: pITaskbarList->AddTab(hwnd);  break;
   case 2: pITaskbarList->ActivateTab(hwnd);  break;
   case 3: pITaskbarList->SetActiveAlt(hwnd);  break;
  }
 }
 pITaskbarList->Release();
 CoUninitialize();
}
//main.cpp
//---------------------------------------------------------------------------
#define NO_WIN32_LEAN_AND_MEAN
#include <vcl.h>
#pragma hdrstop

#include "TastTestMain.h"
#include "TaskStatus.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
StatusOnTaskBar(Application->Handle,true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
StatusOnTaskBar(Application->Handle,false);
}
//---------------------------------------------------------------------------

Автор ответа: SABROG
231
02 июня 2008 года
GIZMO
1.8K / / 30.07.2004
Вопрос:
Как подключиться к событию СОМ-сервера?

Пример:
В аттаче.

Автор ответа: ***

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог