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;
}
COM/DCOM, ActiveX
Здесь размещаем вопросы по COM/DCOM, ActiveX, OLE, ATL и т.п.
В отдельном потоке или DLL, при попытке доступа к COM-объекту выдается ошибка: "Не был произведен вызов CoInitialize".
Ответ:
Функция CoInitialize предназаначена для инициализации COM-объектов в текущем потоке и установки для него модели single-thread apartment(STA).
Вызов данной функции должен производиться перед любой попыткой доступа к объектам COM (OLE). Если вы используете стандартный набор пакетов в приложении - этот вызов выполнять нет необходимости - так как при загрузке пакетов реализующих классы-компоненты ADO и др. это происходит автоматически. Если же вы собираете приложение без пакетов, или создаете dll (в которой инициализация библиотек автоматически не выполняеться) - вызов данной функции необходимо выполнять явно. Функция определена в заголовочном файле objbase.h - он соответственно должент быть подключен.
По завершении работы необходимо вызвать CoUninitialize.
Описание функции - на сайте Microsoft
Пример:
Код:
Как ускорить вывод/загрузку данных в/из 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));
}
{
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;
}
{
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;
}
Автор ответа: ***
Как убрать программу из 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);
}
//---------------------------------------------------------------------------
#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
Как подключиться к событию СОМ-сервера?
Пример:
В аттаче.
Автор ответа: ***