1c Предприятие 7.7, COM/OLE
10.06.2009
16:00
#1
"Добрый день!
Как в С++ подключиться к 1С через COM если уже сама 1С открыта?
т.е. мне нужно с помощью COM не запускать заново 1С с помощью CreateOleObject("V77.Application");
а присоединиться к уже запущенному через GetActiveOleObject("V77.Application");
но у меня функция не находит запущенный, как можно это сделать?"
Как в С++ подключиться к 1С через COM если уже сама 1С открыта?
т.е. мне нужно с помощью COM не запускать заново 1С с помощью CreateOleObject("V77.Application");
а присоединиться к уже запущенному через GetActiveOleObject("V77.Application");
но у меня функция не находит запущенный, как можно это сделать?"
10.06.2009
16:22
#2
">т.е. мне нужно с помощью COM не запускать заново 1С с помощью >CreateOleObject("V77.Application");
>а присоединиться к уже запущенному через GetActiveOleObject("V77.Application");
Не очень понятно. Присоединиться к запущенному в качестве OLE-сервера?
Вообще, исходники компонент на C++ у меня были и там данный метод работал."
>а присоединиться к уже запущенному через GetActiveOleObject("V77.Application");
Не очень понятно. Присоединиться к запущенному в качестве OLE-сервера?
Вообще, исходники компонент на C++ у меня были и там данный метод работал."
10.06.2009
16:30
#4
>> А через CreateOleObject("V77.Application") - работает?
Да, работает. А можно Вас попросить исходники примера прислать на ochelot@mail.ru
Да, работает. А можно Вас попросить исходники примера прислать на ochelot@mail.ru
10.06.2009
16:41
#6
Хорошо, пускай Delphi...
У меня задача стоит написать программу на С++ которая запускается из 1С, производит OLE подключение к 1С (к той что запустила) выполняет какуюто работу (например открытие диалога) и завершается.
Я знаю што подобное легче написать внутри самой 1С но сама прога еще решает кучу других функций не относящихся к 1С.
У меня задача стоит написать программу на С++ которая запускается из 1С, производит OLE подключение к 1С (к той что запустила) выполняет какуюто работу (например открытие диалога) и завершается.
Я знаю што подобное легче написать внутри самой 1С но сама прога еще решает кучу других функций не относящихся к 1С.
10.06.2009
20:59
#8
"не мое:
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"
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"
11.06.2009
08:59
#9
"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);
Да, код рабочий, открывает копию 1С, записывает, считывает, но...
Мне нужно, так что 1С уже запущена (мне не нужно ее запускать), мне нужно через оле подсоединиться к уже запущенной
через GetActiveOleObject (чтото типа Excelя, ведь к мы можем по новой запустить копию а можем уже к открытой подсоединиться и к открытому документу).
Я вот, думаю а она (7.7) вообще поддерживает такое?"
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);
Да, код рабочий, открывает копию 1С, записывает, считывает, но...
Мне нужно, так что 1С уже запущена (мне не нужно ее запускать), мне нужно через оле подсоединиться к уже запущенной
через GetActiveOleObject (чтото типа Excelя, ведь к мы можем по новой запустить копию а можем уже к открытой подсоединиться и к открытому документу).
Я вот, думаю а она (7.7) вообще поддерживает такое?"
11.06.2009
09:36
#10
"Пробовать надо... вот по идее, проблемка в
s1cResult = GetActiveObject(ProgIDToClassID("V77.Application"), NULL, &pIUnknown);
именно значение s1cResult определяет дальнейшее поведение алгоритма.
Если подумать, то, скажем, Word или Excel при работе в памяти висят как один экземпляр с уникальным PID-ом, а 1С как коллекция PID-ов, может в этом то и причина?
Что возвращает ProgIDToClassID("V77.Application")? Может идентификатор класса явно написать? У Microsoft-а есть программка такая, которая уже лет 10 ими прилагается к каждому релизу Developer Studio, называется что то вроде Spy (ярлык на нее появляется прямо в менюшках операционки, которые по нажатию на кнпку "Пуск" выскакивают), так вот она просто идеально отражает запущенные компоненты системы, называния их классов и еще много полезного. Я когда делаю что то "нехорошее", ею пользуюсь, чтобы узнать все про классы других приложений."
s1cResult = GetActiveObject(ProgIDToClassID("V77.Application"), NULL, &pIUnknown);
именно значение s1cResult определяет дальнейшее поведение алгоритма.
Если подумать, то, скажем, Word или Excel при работе в памяти висят как один экземпляр с уникальным PID-ом, а 1С как коллекция PID-ов, может в этом то и причина?
Что возвращает ProgIDToClassID("V77.Application")? Может идентификатор класса явно написать? У Microsoft-а есть программка такая, которая уже лет 10 ими прилагается к каждому релизу Developer Studio, называется что то вроде Spy (ярлык на нее появляется прямо в менюшках операционки, которые по нажатию на кнпку "Пуск" выскакивают), так вот она просто идеально отражает запущенные компоненты системы, называния их классов и еще много полезного. Я когда делаю что то "нехорошее", ею пользуюсь, чтобы узнать все про классы других приложений."
Читают тему
(гостей: 1)