1c Предприятие 7.7, COM/OLE
11.06.2009
09:55
#11
ProgIDToClassID("V77.Application")
Возвращает -2147221021
Spy запустил, он отображает все окна в системе + их классы настройки...
А как записать ей напрямую и что именно (название класса окна?)?
Возвращает -2147221021
Spy запустил, он отображает все окна в системе + их классы настройки...
А как записать ей напрямую и что именно (название класса окна?)?
11.06.2009
10:16
#12
Ой, нет... похоже, я вам тупиковый ход показал
Вам же надо через OLE. Я таким образом получал указатель на окно приложения, которое не может быть OLE сервером и потом программно туда засылал "нажатия на кнопки клавиатуры"... Думаю
11.06.2009
10:28
#13
"Да, я примерно также поступал, ведь 7.7 не поддерживает опцию visible,
т.е. оно при открытии программно (CreateOleObject("V77.Application");) не отображает окно и приходилось делать так:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) // Поиск всех окон в системе с 1С
{
char szTextWin[255];
char *str = "1С:Предприятие";
if(GetWindowText(hwnd,szTextWin,sizeof(szTextWin)))
{
if (strstr(szTextWin, str) != NULL)
::ShowWindow(hwnd,SW_SHOW);
}
szTextWin[0] = '\0';
return TRUE;
}
if(!EnumWindows(&EnumWindowsProc,NULL))
wxMessageBox("Окно 1С не найдено", "Ошибка");
А тут у нас оно уже видимо и запущено и походу тоже не OLE сервер...
p.s. Я очень благодарен что Вы мне помогаете!!!
"
т.е. оно при открытии программно (CreateOleObject("V77.Application");) не отображает окно и приходилось делать так:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) // Поиск всех окон в системе с 1С
{
char szTextWin[255];
char *str = "1С:Предприятие";
if(GetWindowText(hwnd,szTextWin,sizeof(szTextWin)))
{
if (strstr(szTextWin, str) != NULL)
::ShowWindow(hwnd,SW_SHOW);
}
szTextWin[0] = '\0';
return TRUE;
}
if(!EnumWindows(&EnumWindowsProc,NULL))
wxMessageBox("Окно 1С не найдено", "Ошибка");
А тут у нас оно уже видимо и запущено и походу тоже не OLE сервер...
p.s. Я очень благодарен что Вы мне помогаете!!!
"
12.06.2009
15:41
#16
ЭЭЭ, еще такой вопрос в этой же теме...
Вот мы создали через COM, скажем окно с Excel,
если поработав excel закрыть то процесс остается в памяти вплоть до завершения программы которая
вызвала его через COM, а есть ли возможность отследить что его закрыли и после завершить главную программу?
Вот мы создали через COM, скажем окно с Excel,
если поработав excel закрыть то процесс остается в памяти вплоть до завершения программы которая
вызвала его через COM, а есть ли возможность отследить что его закрыли и после завершить главную программу?
16.06.2009
09:00
#17
В общем С++ не нашел, видимо кому то дал диск, но это меня не остановило. Пробнул все на Vb.Net. Эфект абсолютно тот же. То есть, активный com сервер 1С-а не находится, а какого нибудь Word-а - запросто.
В VB это достается через:
Dim appProgID As String = "V77.Application"
Dim Ole1C As Object
Try
Ole1C = System.Runtime.InteropServices.Marshal.GetActiveObject(appProgID)
MsgBox("Доступ к com серверу получен")
Catch ex As Exception
MsgBox("Ничего не вышло")
End Try
Пошел в rtfm. Написано вот чего:
запущенный экземпляр указанного объекта из таблицы запущенных объектов ROT)
Полез почитать что такое ROT: 1С не регистрирует себя в этой таблице как com сервер, поэтому мы ее и достать не можем.
Думаем... а почему они в ROT не регистряют сессию 1С? Вероятно потому, что концепция у 1С платформы на программном уровне не та, что у Word-а, Excel-я. Например, открыли 10 документов Word. Смотрим список процессов, а процесс word там один. Потому что Microsoft придумала грамотно. Накой его грузить 10 раз, если базовый функционал един? Разделили понятия "приложение" и "документ" и это позволило им приложение загрузить один раз и оно рулит всеми документами. Поэтому нет никаких логических препятствий на регистрацию Word-а в ROT. Моникер там будет уникальным, поэтому все будет работать замечательно. 1С тоже выделила понятия "платформа" и "конфигурации", тем не менее каждый раз при старте создается отдельный процесс со своим pid-ом (жрет кучу памяти, между прочим) и в системе существует как неопознанное со сторонней программы множество активных процессов 1cv7 (1cv8). Видимо это и не позволяет 1С в ROT прописать. И по идее, чтобы разрешить эту проблему надо участие разработчиков движка 1С. Реально - смена принципа работы платформы. Колоссальный труд. Не думаю, что они за это возьмутся. Наверное, надо идти другим путем
По поводу:
> Вот мы создали через COM, скажем окно с Excel,
> если поработав excel закрыть то процесс остается в памяти вплоть до завершения программы которая
> вызвала его через COM, а есть ли возможность отследить что его закрыли и после завершить главную программу?
Наверное, надо в "главной программе" периодически проверять жив ли com объект и если нет, то закрывать ее. Со стороны Excel-я это точно не сделать, так как придется нагружать его задачей "а нет ли иных дочерних процессов, порожденных родительским и какое у них состояние?"
В VB это достается через:
Dim appProgID As String = "V77.Application"
Dim Ole1C As Object
Try
Ole1C = System.Runtime.InteropServices.Marshal.GetActiveObject(appProgID)
MsgBox("Доступ к com серверу получен")
Catch ex As Exception
MsgBox("Ничего не вышло")
End Try
Пошел в rtfm. Написано вот чего:
запущенный экземпляр указанного объекта из таблицы запущенных объектов ROT)
Полез почитать что такое ROT: 1С не регистрирует себя в этой таблице как com сервер, поэтому мы ее и достать не можем.
Думаем... а почему они в ROT не регистряют сессию 1С? Вероятно потому, что концепция у 1С платформы на программном уровне не та, что у Word-а, Excel-я. Например, открыли 10 документов Word. Смотрим список процессов, а процесс word там один. Потому что Microsoft придумала грамотно. Накой его грузить 10 раз, если базовый функционал един? Разделили понятия "приложение" и "документ" и это позволило им приложение загрузить один раз и оно рулит всеми документами. Поэтому нет никаких логических препятствий на регистрацию Word-а в ROT. Моникер там будет уникальным, поэтому все будет работать замечательно. 1С тоже выделила понятия "платформа" и "конфигурации", тем не менее каждый раз при старте создается отдельный процесс со своим pid-ом (жрет кучу памяти, между прочим) и в системе существует как неопознанное со сторонней программы множество активных процессов 1cv7 (1cv8). Видимо это и не позволяет 1С в ROT прописать. И по идее, чтобы разрешить эту проблему надо участие разработчиков движка 1С. Реально - смена принципа работы платформы. Колоссальный труд. Не думаю, что они за это возьмутся. Наверное, надо идти другим путем
По поводу:
> Вот мы создали через COM, скажем окно с Excel,
> если поработав excel закрыть то процесс остается в памяти вплоть до завершения программы которая
> вызвала его через COM, а есть ли возможность отследить что его закрыли и после завершить главную программу?
Наверное, надо в "главной программе" периодически проверять жив ли com объект и если нет, то закрывать ее. Со стороны Excel-я это точно не сделать, так как придется нагружать его задачей "а нет ли иных дочерних процессов, порожденных родительским и какое у них состояние?"
16.06.2009
12:53
#18
Классный ответ, спасибо!!!
Да, не предусмотрели разработчики, хотя подобное соединение наверняка нужно не только мне.
Ну, да ладно, я щас немного другим путем пошел (через попу правда), но в моей ситуации работает.
А как можно проверить жив ли COM объект?
Да, не предусмотрели разработчики, хотя подобное соединение наверняка нужно не только мне.
Ну, да ладно, я щас немного другим путем пошел (через попу правда), но в моей ситуации работает.
А как можно проверить жив ли COM объект?
16.06.2009
13:55
#19
"Если, например, из 1С открывали Excel, можно так:
Если ExcelServer.Visible=0 Тогда //True это -1, а False это 0
ExcelServer=0;
ЗавершитьРаботуСистемы();
КонецЕсли;
Тут проблемка будет в организации периодичности проверки. В 1С нет объекта "Timer". Придется делать снова через то место, о котором вы написали :)"
Если ExcelServer.Visible=0 Тогда //True это -1, а False это 0
ExcelServer=0;
ЗавершитьРаботуСистемы();
КонецЕсли;
Тут проблемка будет в организации периодичности проверки. В 1С нет объекта "Timer". Придется делать снова через то место, о котором вы написали :)"
16.06.2009
14:57
#20
">>Тут проблемка будет в организации периодичности проверки. В 1С нет объекта "Timer". Придется делать снова через то место, о котором вы написали
хорошо 
А вот в 1С можно создать кнопку на панеле инструментов и чтобы по ее нажатию выполнялась функция
ну скажем system("calc.exe"); ?"
А вот в 1С можно создать кнопку на панеле инструментов и чтобы по ее нажатию выполнялась функция
ну скажем system("calc.exe"); ?"
Читают тему
(гостей: 1)