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
Код не работает в потоке... хотя не в потоке все ок.
Есть данные в формате csv. я загружаю эти данные в StringGrid, а от туда уже переношу в 1С.
Написал программку... все работает нормально... перетащил все данные..
но к сожалению данных очень много и решил перетащить все в поток чтобы работа основной программы не останавливалось.
вот код:
Код:
так все ок!
А вот так перетащил в поток:
Код:
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);
}
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
Где ошибся?
Код:
CoInitialize(NULL);
Ole1C = GetActiveOleObject("V77.Application");
...
...
CoUninitialize();
Ole1C = GetActiveOleObject("V77.Application");
...
...
CoUninitialize();
И при обращении к элементам формы из потока не забывай о необходимости синхронизации.