1c Предприятие 7.7, COM/OLE

Новая тема
Показывать по 10 20 40 сообщений
ProgIDToClassID("V77.Application")
Возвращает -2147221021

Spy запустил, он отображает все окна в системе + их классы настройки...

А как записать ей напрямую и что именно (название класса окна?)?
Ой, нет... похоже, я вам тупиковый ход показал :( Вам же надо через OLE. Я таким образом получал указатель на окно приложения, которое не может быть OLE сервером и потом программно туда засылал "нажатия на кнопки клавиатуры"... Думаю
"Да, я примерно также поступал, ведь 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. Я очень благодарен что Вы мне помогаете!!!
"
В общем, я в выходные С++ поставлю, мне пробовать надо, наугад не могу
OK, буду ждать.
ЭЭЭ, еще такой вопрос в этой же теме...

Вот мы создали через COM, скажем окно с Excel,
если поработав excel закрыть то процесс остается в памяти вплоть до завершения программы которая
вызвала его через COM, а есть ли возможность отследить что его закрыли и после завершить главную программу?
В общем С++ не нашел, видимо кому то дал диск, но это меня не остановило. Пробнул все на 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. Написано вот чего:
http://msdn.microsoft.com/ru-ru/library/system.runtime.interopservices.marshal.getactiveobject.aspx
(Получает
запущенный экземпляр указанного объекта из таблицы запущенных объектов ROT)

Полез почитать что такое ROT: http://www.osp.ru/pcworld/1998/08/159471/

Предположение:
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-я это точно не сделать, так как придется нагружать его задачей "а нет ли иных дочерних процессов, порожденных родительским  и какое у них состояние?"
Классный ответ, спасибо!!!

Да, не предусмотрели разработчики, хотя подобное соединение наверняка нужно не только мне.
Ну, да ладно, я щас немного другим путем пошел (через попу правда), но в моей ситуации работает.

А как можно проверить жив ли COM объект?
"Если, например, из 1С открывали Excel, можно так:

Если ExcelServer.Visible=0 Тогда //True это -1, а False это 0
  ExcelServer=0;
  ЗавершитьРаботуСистемы();
КонецЕсли;

Тут проблемка будет в организации периодичности проверки. В 1С нет объекта "Timer". Придется делать снова через то место, о котором вы написали :)"
">>Тут проблемка будет в организации периодичности проверки. В 1С нет объекта "Timer". Придется делать снова через то место, о котором вы написали :)
:) хорошо :)

А вот в 1С можно создать кнопку на панеле инструментов и чтобы по ее нажатию выполнялась функция
ну скажем system("calc.exe"); ?"
Читают тему
(гостей: 1)

Быстрый переход