Есть класс
class TMyThread : public TThread
{
private:
TDataSet *DataS;
Variant Aplik;
Variant Shet;
protected:
void __fastcall Execute();
public:
__fastcall TMyThread( bool CreateSuspended,
TDataSet * Nabor
);
void __fastcall ThreadFunc();
void __fastcall ExcelInitOpen(String File);
__fastcall ~TMyThread(void);
};
Реализация
__fastcall TMyThread::TMyThread(bool CreateSuspended,
TDataSet * Nabor)
: TThread(CreateSuspended)
{
DataS=Nabor;
}
__fastcall TMyThread::~TMyThread(void)
{
Aplik.Clear();
Shet.Clear();
CoUninitialize ();
}
void __fastcall TMyThread::Execute()
{
FreeOnTerminate = true;
while(!Terminated){
Synchronize(ThreadFunc);
}
}
void __fastcall TMyThread::ThreadFunc()
{
if(DataS->RecordCount!=0){
ExcelInitOpen("");
for (int i=0;i<DataS->RecordCount;i++){
DataS->Next();
}
}
if(!Aplik.IsEmpty())Aplik.OlePropertySet("Visible",true);
Application->ProcessMessages();
Terminate();
}
void __fastcall TMyThread::ExcelInitOpen(String File)
{
CoInitialize(NULL);
try{
Aplik=Variant::GetActiveObject("Excel.Application");
}
catch (...){
try {
Aplik=CreateOleObject("Excel.Application");
}
catch (EOleSysError &eException) {
Form1->Edit2->Text=eException.ErrorCode;
Application->MessageBox("Невозможно открыть Microsoft Excel!"
"Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
}
}
try {
if(File!=""){
Aplik.OlePropertyGet("WorkBooks").OleProcedure("Open",File);
}
else{
Aplik.OlePropertyGet("WorkBooks").OleProcedure("add");
Shet=Aplik.OlePropertyGet("WorkSheets",1);
}
}
catch(...){
Application->MessageBox("Ошибка открытия файла книги","Ошибка",MB_OK+MB_ICONERROR);
}
}
Падает на коде
try {
Aplik=CreateOleObject("Excel.Application");
}
catch (EOleSysError &eException) {
Form1->Edit2->Text=eException.ErrorCode;
Application->MessageBox("Невозможно открыть Microsoft Excel!"
"Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
}
вызов из формы
Thr = new TMyThread(true,CRC->DataSet);
Thr->Resume();
С ошибкой eException.ErrorCode=-2147417843 тобиш
-2147417843 0x8001010D An outgoing call cannot be made since the application is dispatching an input-synchronous call.
CoInitializeEx(NULL,COINIT_MULTITHREADED);
Возврашает -2147417850 Cannot change thread mode after it is set.
За ранее благодарен