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

Ваш аккаунт

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

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

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

Код не работает в потоке... хотя не в потоке все ок.

520
07 ноября 2006 года
inkognitum
155 / / 03.05.2006
Не могу понять.
Есть данные в формате csv. я загружаю эти данные в StringGrid, а от туда уже переношу в 1С.

Написал программку... все работает нормально... перетащил все данные..
но к сожалению данных очень много и решил перетащить все в поток чтобы работа основной программы не останавливалось.

вот код:
Код:
Variant Ole1C, rmTrade;
   HResult s1cResult;
   LPUNKNOWN pIUnknown = NULL;
   char *IntializationLine = "/DC:\\Base1";
   s1cResult = GetActiveObject(ProgIDToClassID("V77.Application"), NULL, &pIUnknown);
   if ( s1cResult == MK_E_UNAVAILABLE ) {
      Ole1C = CreateOleObject("V77.Application");
   } else {
      Ole1C = GetActiveOleObject("V77.Application");
   }
   rmTrade = Ole1C.OlePropertyGet("RMTrade");
   /* Start OLE Automation ... */
   Ole1C.OleProcedure("Initialize", rmTrade, IntializationLine,"NO_SPLASH_SHOW");
   IntializationLine = "СоздатьОбъект(\"Справочник.Товары\")";
   Variant Buh1 = Ole1C.OleFunction("EvalExpr", IntializationLine);

   Form1->StringGrid1->Visible = false;
   Form1->ProgressBar1->Max = Form1->StringGrid1->RowCount-1;

   for (int k=1;k<=Form1->StringGrid1->RowCount-1;k++){
    Buh1.OleProcedure("Новый");
     Buh1.OlePropertySet("Наименование", Form1->StringGrid1->Cells[1][k].c_str());
     Buh1.OlePropertySet("ШтрихКод", Form1->StringGrid1->Cells[2][k].c_str());
     Buh1.OlePropertySet("Код", Form1->StringGrid1->Cells[0][k].c_str());
    Buh1.OleProcedure("Записать");
    Form1->ProgressBar1->Position++;
   }//for


так все ок!

А вот так перетащил в поток:
Код:
HANDLE Threat1;

DWORD WINAPI MyHread1(LPVOID Param) {
   Variant Ole1C, rmTrade;
   HResult s1cResult;
   LPUNKNOWN pIUnknown = NULL;
   char *IntializationLine = "/DC:\\Base1";
   s1cResult = GetActiveObject(ProgIDToClassID("V77.Application"), NULL, &pIUnknown);
   if ( s1cResult == MK_E_UNAVAILABLE ) {
      Ole1C = CreateOleObject("V77.Application");
   } else {
      Ole1C = GetActiveOleObject("V77.Application");
   }
   rmTrade = Ole1C.OlePropertyGet("RMTrade");
   /* Start OLE Automation ... */
   Ole1C.OleProcedure("Initialize", rmTrade, IntializationLine,"NO_SPLASH_SHOW");
   IntializationLine = "СоздатьОбъект(\"Справочник.Товары\")";
   Variant Buh1 = Ole1C.OleFunction("EvalExpr", IntializationLine);

   Form1->StringGrid1->Visible = false;
   Form1->ProgressBar1->Max = Form1->StringGrid1->RowCount-1;

   for (int k=1;k<=Form1->StringGrid1->RowCount-1;k++){
    Buh1.OleProcedure("Новый");
     Buh1.OlePropertySet("Наименование", Form1->StringGrid1->Cells[1][k].c_str());
     Buh1.OlePropertySet("ШтрихКод", Form1->StringGrid1->Cells[2][k].c_str());
     Buh1.OlePropertySet("Код", Form1->StringGrid1->Cells[0][k].c_str());
    Buh1.OleProcedure("Записать");
    Form1->ProgressBar1->Position++;
   }//for
}

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   DWORD id1;
   Threat1 = CreateThread(0,0,MyHread1,Form1->Handle,CREATE_SUSPENDED,&id1);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ResumeThread(Threat1);    
}


Выдает ошибку на строчке:
 
Код:
Ole1C = GetActiveOleObject("V77.Application");

говорит - Не был произведен вызов CoInitialize

Где ошибся?
1
07 ноября 2006 года
kot_
7.3K / / 20.01.2000
 
Код:
CoInitialize(NULL);
Ole1C = GetActiveOleObject("V77.Application");
...
...
CoUninitialize();

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