Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Использование (вызов) WinAPI-функций в 1С8.2

Использование (вызов) WinAPI-функций в 1С8.2
Я
   AlexCom
 
13.10.17 - 23:41
Господа программисты!

Помогите решить следующую задачу:

Мне нужно запустить 1С8.2 базу и зафиксировать ID этого процесса
Стал эту задачу решать так:


WinAPI = ПолучитьCOMОбъектИзМакета("DynamicWrapperX", "DynamicWrapperX");                    // подключение DynamicWrapperX (это всё работает)

Если WinAPI <> Неопределено Тогда
    WinApi.Register("Kernel32.DLL", "CreateProcess", "i=sspplppspp", "f=l", "r=l");

    I0=WinAPI.Space(256);
    I1=WinAPI.Space(256);
    I2=WinAPI.Space(256);
    I3=WinAPI.Space(256);
    I4=WinAPI.Space(256);
    I5=WinAPI.Space(256);
    I6=WinAPI.Space(256);
    
    StartupInfo=WinAPI.Space(256*4+128);

    Info=WinAPI.Space(256);        // необходимо 4 DWord

           pStr=WinAPI.StrPtr(Info);    // Запоминаю указатель (в будущем потребуется)


    WinApi.Register("Kernel32.DLL", "CreateProcess", "i=ssppllpspp", "f=s", "r=l");      // регистрация прошла успешно

    I=WinAPI.CreateProcess("",СтрокаЗапуска,I1,I2,0,0,I5,Директория,StartupInfo,Info);  // Вот это НЕ РАБОТАЕТ

КонецЕсли;


Если блок заработает, то из Info получу ID потока.
Но блок не работает!

Где-то ошибаюсь с параметрами функции CreateProcess типа указатель, неправильно вызываю ...
Может у кого-нибудь был опыт использования функций WinApi или решение проще ...
 
 
   H A D G E H O G s
 
1 - 13.10.17 - 23:54
WinAPI.CreateProcess("",СтрокаЗапуска,

СтрокаЗапуска - тут требуется указатель.
   kittystark
 
2 - 14.10.17 - 10:06
Функция ПолучитьPID() 
    Перем oLocator, oService, oShell, oApp, oChildProcess; 
    Перем чPID; 

    чPID = -1; 
    Попытка 
        oLocator = СоздатьОбъект("WbemScripting.SWbemLocator"); 
        oService = oLocator.ConnectServer(".", "root\CIMV2"); 
         
        // Запускаем дочерний rundll32.exe 

        oShell = СоздатьОбъект("WScript.Shell"); 
        oApp = oShell.Exec("rundll32.exe kernel32,Sleep"); 
        // Получаем rundll32 по PID'у 

        oChildProcess = oService.Get("Win32_Process.Handle=" + oApp.ProcessID); 
        // Получаем PID родительского процесса - 1с 

        чPID = oChildProcess.ParentProcessID; 
        // Завершаем rundll32, чтобы не мусорить 

        oChildProcess.Terminate(); 
    Исключение 
        // нуу, может не быть прав на эти вещи, например. 

    КонецПопытки; 
    Возврат чPID; 
КонецФункции// ПолучитьPID() 


Процедура Сформировать() 
    Сообщить("PID: " + ПолучитьPID()); 
КонецПроцедуры// Сформировать()
[/1с]
   AlexCom
 
3 - 14.10.17 - 11:56
kittystark, Можно по подробнее
Уточню задачу:
у меня куча баз 1С.
Когда я запускаю какую-нибудь из них, я хочу зафиксировать где-нибудь ID этого процесса для того, чтобы грохнуть в последствии (по ID найду и уничтожу).

Написал вызов на Delphi:

procedure TForm5.Button1Click(Sender: TObject);
 Var ProcessInfo: TProcessInformation;
     StartUpInfo: TStartUpInfo;
begin
 FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
 CreateProcess(Pchar('C:\Program Files (x86)\1cv8\8.3.7.1917\bin\1cv8.exe'),' ENTERPRISE /F...',
                nil, nil, false,NORMAL_PRIORITY_CLASS, nil,Nil, StartUpInfo, ProcessInfo);
end;
Это работает!

Мне надо просто разобраться с работой с указателями в 1С, переложить этот код в 1С (допустим), что не получается у меня
   AlexCom
 
4 - 14.10.17 - 12:00
H A D G E H O G s, как конкретно написать указатель в 1С
Можно кусок кода?
   kittystark
 
5 - 14.10.17 - 14:08
значит смотри, чуток академических знаний: указатель как тип данных есть в С / C++ / Pascal / Delphi и т.д., но в 1С его нет (работа с системной памятью напрямую недостпуна, т.к. есть своя модель объектов, и воспользоваться фишками ООП типа наследование / полиморфизм / инкапуляция от этой модели не получится)

код приведенный в (2) можно попытаться выполнить в ПриНачалеРаботыСистемы() модуля приложения (или модуля управляемого приложения) и полученный PID уже оттуда впихнуть куда-нибудь, например в файл и т.д.

подумай на тему того, что может тебе лучше воспользоваться COM-сервером 1С тип Application или connector для своих целей?

запустить для того чтобы потом грохнуть...
можно конечно по разному использовать 1С, что в процессе работы нужно то?
   AlexCom
 
6 - 14.10.17 - 14:56
kittystark, спасибо за ответ, но это я знаю.
Вопрос только в том, что КАК воткнуть Delphi-код в модуль 1С. Мне не удается перевести в язык 1С указатели (как Вы писали, в 1С их нет - в том то и дело). Или может быть весь Delphi-код как макрос можно вставить в 1С, но я не знаю, как это сделать. Вопрос - какие параметры (в каком виде) подсунуть в функцию CreateProcess() в модуле 1С, как инициализировать StartUpInfo, ProcessInfo - это же указатели

А задача такая:
Пользователь открывает свои базы, работает ...
В некоторый момент администратор отключает некоторые базы или меняет права на доступ к базам. Удаленный пользователь попучает уведомление на экран, что определенная база отключается, допустим, на регламентные работы, и через 3 минуты, допустим, база закрывается сама. Для закрытия мне нужно знать ID процесса. Примерно так. Мне легче написать службу на Delphi, и раскатить её на все компы, но установка компании - писать всё на 1С, и это наверное правильно. Приходится придумывать. В принципе всё почти готово, остался этот кусок пройти.
Получается, кроме как в ID процесса мне привязаться не к чему.
Путь2: При запуске 1С-базы командная строка вызова тоже привязывается к win-процессу. Зная командную строку процесса и строку вызова 1С (они почти равны), я могу найти рабочий win процесс по этой строке. И опять упираются в API-функции (Process32First ...). Т.е. легче не стало. 1 вариант легче :)
   Филиал-msk
 
7 - 14.10.17 - 15:02
(6) И тут внезапно 1С падает не успев сообщить тебе о закрытии и через некоторое время ее пид получает фотошоп (:

1С тут совсем не нужна. Совсем. Пиды с легкостью вычитываются по необходимости из списка процессов при желании их убийства. Экземпляр базы определяется по параметрам командной строки.
   Филиал-msk
 
8 - 14.10.17 - 15:07
И вообще, не ипи народу мозг переводом кода с престарелого дельфи на актуальный 1С.
Напиши на своем дельфи внешнюю компоненту, грузи ее в 1С и извращайся как душа пожелает.
   kittystark
 
9 - 14.10.17 - 15:19
а...   свою выгонялку пользователей пишешь...
во первых есть стандартный функционал блокировки сеансов
во вторых таких поделок много, поищи

если хочется посношаться, то как вариант - заводишь одну константу - кол-во секунд до выхода, при логине каждого пользователя в приначалеработысистемы подключаешь обработчик ожидания скажем раз в 30 сек., в котором анализируешьь ее и по ее значению
 - или вывоводишь сообщение (>0) 
 - или выгоняшь и блокруешь вход (=-1) 
 - или оставляешь работать (=0)

а вторую константу - пользователь блокировщик
чтоб под ним можно было всегда войти не взирая на значение первой константы, ну и плюс чтоб его не выкидывало
   AlexCom
 
10 - 15.10.17 - 09:31
Так как начался флуд, тема закрыта
 
 Рекламное место пустует
   AlexCom
 
11 - 15.10.17 - 11:13
kittystark, Это тоже известно
У нас баз - несколько сотен, большинство типовых, не снятых с поддержки, конфигурация закрыта или почти закрыта, в общем менять нельзя и т. д.
Задача не должна затрагивать конфигурации, т. к. базы появляются и удаляются ...
Задача наверное должна решаться в том виде, как предложено, как отдельный обший механизм

2. Блокировка сеансов? А если файловый вариант?
   Филиал-msk
 
12 - 15.10.17 - 12:09
... и тысячи паровых машин. При этом программированием занимается не 1Сник, а дельфист. Сказочная контора.
   Филиал-msk
 
13 - 15.10.17 - 12:12
Менять нельзя, но при старте конфигурация должна научится что-то делать с pid. Причем все тысячи баз. Волшебство!
   TormozIT
 
14 - 15.10.17 - 13:31
   TormozIT
 
15 - 15.10.17 - 13:33
(14) Не подойдет. Надо будет дописать свою функцию, взяв за основую метод Run.
   AlexCom
 
16 - 15.10.17 - 18:39
TormozIT, Большое спасибо !!!
Буду смотреть
Самое главное - исходники есть!
   lamina
 
17 - 15.10.17 - 22:06
(16) а разве можно подключить внешнюю компоненту без снятия все ваших баз с поддержки или подключений расширений?
   Филиал-msk
 
18 - 15.10.17 - 22:20
(17) Тссссс =)
Чувак в 09.31 тему вообще закрыл. Он Пытается с Заглавной Буквы.
   MM
 
19 - 16.10.17 - 08:37
(0) А разве в структуре STARTUPINFO не нужно заполнить поле cb - The size of the structure, in bytes?
   TormozIT
 
20 - 29.10.17 - 00:05
(17) Конечно можно. ИР же это делает как раз через native ВК, ссылку на которую я дал в (14).

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует