<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Выложить файл целая проблема, потратила на это около часа, потом оказалось,что выложила сразу АЖ четыре раза!!!!
(1) > потом оказалось,что выложила сразу АЖ четыре раза!!!!
Лучше сорок раз по разу, чем ни разу сорок раз 🙂
А я такое в 1С делал… )
(3) Поздравляю!!!Как умудрился из 1с глобальный перехват мыши и клавы устроить???Я так понимаю,что из 1с только с помощью COM технологий можно обращаться к API.
(4) Да это так. Причем ActiveX и еже с ним сильно отдает всё той же COM (по факту им же и является). А вот что глобальный хук надо ставить именно в .dll это абсолютно верно! Через COM делать перехват можно с учетом выше сказанного, но это не лучшее решение.
(3-5) Не паримся, а смотримhttp://infostart.ru/projects/697/
Моя есть давно написаль 😉
Посмотрел и что? Разве там идет речь о перехвате сообщений в любых приложениях? Реализовывать через COM изврат… Если только в этом нет сугубой необходимости.
(4,5,6) Никаких API, COM, ActiveX и длл!!! Просто ловкость рук и никакого мошенничества! ))http://infostart.ru/projects/2591/
(8) Ну, учитывая, что dll — она и в Африке dll, там можно было и не указывать конкретый процесс, был бы глобальный. А в простой dll (без ком-извратов) это реализовано вhttp://infostart.ru/projects/798/
+(9) Не на (8), а на (7) — опечатался
Что то не понял (8) а каких процессах речь идет? Можно конечно инжект DLL сделать и в системный процесс, методов много, а потом экспортировать нужные функции, но как это относится к обсуждаемой теме глобальные хуки на события мыши и клавиатуры?
Я тоже промахнулся конечно же не 8 а 9.
А чего обсуждать тему глобальной ловушки? Достаточно просто прочитать:
function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK;
Функция SetWindowsHookEx устанавливает определенную приложением процедуру ловушки в цепочку ловушек.
Приложение устанавливает процедуру ловушки, чтобы контролировать некоторые типы событий в системе.
Процедура ловушки может контролировать события, связанные со специфической нитью или со всеми нитями в системе.
Параметры:
idHook: Определяет тип процедуры ловушки, которая будет установлена. Этот параметр может иметь одно из значений WH_.
lpfn: Указывает на процедуру ловушки. Если dwThreadId параметр, равен нулю или определяет идентификатор нити, созданного другим процессом,
параметр lpfn должен указать на процедуру ловушки в библиотеке динамических связей (DLL).
Иначе, lpfn может указывать на процедуру ловушки в коде, связанном с текущим процессом.
hMod: Идентифицирует DLL, содержащую процедуру ловушки, на которую указывает параметр lpfn.
Параметр hMod должен быть установлен как NULL, если параметр dwThreadId определяет нить, созданную текущим процессом и если процедура ловушки — внутри кода, связанного с текущим процессом.
dwThreadId: Определяет идентификатор нити, с которым процедура ловушки должна быть связана.
Если этот параметр — нуль, то процедура ловушки связана со всеми существующими нитями.
Это зачем столько текста? Ведь и так всё очевидно. Вопрос был о каких процессах идет речь?
(14) В (9) как раз и был простой ответ: там хук ставится конкретно на процесс 1С, вызваший библиотеку, НО, если бы я там не проставил конкретный dwThreadId — она бы за милую душу ловила ВСЕ процессы
Dll проецируется на адресное пространство процесса который её загружает (в общем случае) и далее её код исполняется так как родной код этого процесса… (в частности)
+(15) Есть такая фича, недокументировано — из конкретного приложения запросто ставится ГЛОБАЛЬНЫЙ хук без всяких DLL
Ещё раз позволю себе повториться, что ловить надо не процессы, а события мыши и клавы в данном конкретном случае… Увы!
(17)Да я и не отрицал этого что можно это делать (На машине можно задним ходом пердвигаться но лучше нормально как все)!
А вообще приятно, что на этом сайте можно не только на темы 1С поговорить!?
(18) Под «она бы за милую душу ловила ВСЕ процессы», ясно дело, подразумевалось «ловила бы сообщения (события) всех процессов»
(21) Спасибо за беседу вынужден откланяться! Удачи!
А в чем спор?
Где тут «изобретаем велосипед», я понял. А где «модернизируем его»? Если под модернизацией понимается Space Buddha, которую, как я предполагаю, все с пеной изо рта бросились выковыривать из таблицы образа, то заголовок должен звучать: «Изобретаем велосипед и засоряем его ресурсы».
Не хочу показаться невежливым, но, по моему скромному мнению, так оно и есть. И я готов, при желании Оли, выслушать ее гневные отзывы о моем посте на тему неуважения труда и стремления к воплощению идей.
(25)Не, все правильно! Надо было только Deep Purple Into The Fire 🙂
(24) А чего засоряем то? Ресурсы для того и нужны чтоб в них хранить картинки файлы и прочее… Что не знал? Сарказм твой не уместен! А не вежлив, так это пробелы твоего воспитания…
(26,24) Ну, собственно, такая реакция была ж заранее спрогнозирована 😉
«В ресурсах она целиком не смотря на то, что проигрывается всего 30 сек. Так что кто хочет, вооружайтесь лопатой т.е. «ресурс-билдером» и копайте…»
Я слышал Оля доработала прогу… Теперь она будет отрубать комп в случае длительного простоя! Но это ведь учебная прога хотя и полнофункциональная…
Оля, прошу прощения что «Поперёк батьки в пекло»…
А вот анонс надо исправить —-> «операционной систью изучения работы внутренних механизмов»<——
Кстати + к посту (28) Это в условиях кризиса может быть очень актуально. Экономим электроэнергию. Нет юзера на месте больше часа — вырубаем. А если в конторе 300 компов и 150 из них без дела электроэнергию потребляют? Хотя сам я комп стараюсь вообще поменьше перезагружать.
(26, 28, 30) Похоже, здесь какое-то недопонимание. Картинки, файлы и прочее надо хранить в папках «Мои рисунки», «Мои документы» и тому подобное, но не в ресурсах. Ресурсы предназначены все-таки для других целей. Так что не стоило переходить на личности, пытаясь задеть меня своим проявлением злобы в ответ на критику, так как про мое воспитание тебе все равно ничего не известно (оффтоп). А насчет отрубания компа в конторе — так это уже давно реализовано стандартными инструментами серверных систем. Честь имею!
(31) Критика не конструктивная! Хотя если бы я подозревал, что господин Mytilus G. не имеет отношения к программированию под Windows то может быть и смягчил тон… Теперь насчёт «проявления злобы». Ты оказался невежлив, хотя сам и предполагал, что это так?! Так чего хочешь получить в ответ? Сила противодействия равна силе прямого действия… Если ты не имеешь понятия о структуре файла РЕ формата, так зачем высказываться по этому поводу? В многих случаях хранить звук и видео именно в ресурсах .exe файла намного предпочтительней чем в той же .dll в тех же ресурсах или просто раскидав их по папкам.
Ну поверь мне Mytilus G. Я не хочу задеть твое самолюбие… И уж тем более выделиться за твой счет! Поэтому обещаю, впредь все ляпсусы всех авторов буду комментировать только с явным позитивом, не взирая на чины и ранги! А так же знания и опыт… Удачи!
Всем спасибо за комменты, мне важно каждое мнение, программа доработана скоро будет выложена,AmoreMe и Abadonne, отдельное….
(28)>Оля, прошу прощения что «Поперёк батьки в пекло»..
Не за что дорогой,развлекайся!!!!!!!
(31) для тебя дорогой!!!!
Графика которая отображается в программе отрисована API.
А в ресурсах лежит только звуковой файл,что соответствует всем канонам программирования под Windows.
(29) Исправила!
Стоп! Я ни в коем случае не отрицаю, что графику, звук для приложения, таблицу строк в конце концов, конечно, логично воткнуть в ресурсы. Безусловно, если они там нужны. Если реагирующие на мой пост адекванто подошли бы к выраженному мной мнению, а не выискивали в критике оскорбления, то обязательно заметили бы, что я говорил совершенно не об этом. Запихните в ресурсы хоть Ленинскую библиотеку, чтобы отображать в приложении по одному абзацу из каждой книги — мне все равно. Пусть это будет каноном программирования.
Неконструктивная критика — это высказывание, умаляющее некую часть объекта этой критики. Основной частью моего первого поста был вопрос. Специально для тех, кто не задумывается о том, отчего возникает неудовлетворяющее их мнение в комментарии и переходят на личности, я поставил этот вопрос в самом начале. Однако и это не помогло — ответа я так и не получил.
Теперь насчет моих невежливости и воспитания. Я искренне, без какого-либо сарказма и иронии, приношу Ольге свои извинения за необдумано резкую формулировку и прошу у нее прощения за акцентирование исключительно субъективного мнения. Надеюсь, что это поможет отвлечь уважаемую публику от обсуждения личных качеств отдельно взятого Mytilus G.
P.S.
Блокировка клавиатуры: rundll32 keyboard,disable
Блокировка мыши: rundll32 mouse,disable
Запуск по времени простоя можно организовать в «Назначенные задания» панели управления Windows.
P.P.S.
Заработался я. Команды выше в NT не работают. Для 2000/XP/Vista указываем rundll32.exe user32.dll,LockWorkStation
(39) Точно заработался
hDLL := LoadLibrary(‘user32.dll’);
@myBlockInput := GetProcAddress(hDLL, ‘BlockInput’);
myBlockInput(true);
и всех дел
(38) извинения приняты.
А вообще смысл программы не в том, что бы просто залочить станцию, а в том что бы «отследить» работу пользователя за компьютером,смысл вами не понят до конца.
(39)А вообще,что бы залочить станцию как предлагаете вы достаточно нажать пару клавиш WIN+L
(40) Мне мой вариант больше нравится. Его компилить не надо.
(43) Вариант «не компилить» изложен в (42), а есть еще три пальца 😉
Кстати,добавлено отключение компьютера при длительном простое от одного часа до десяти часов.
(44) Здесь говорилось об автоматизации. Три пальца в Назначенные задания не засунешь. ))
(46) Если об автоматизации говорить, то как реализовать это через стандартный sheduler? Даже самая простая операция выключение компьютера не гарантирована… Допустим (сегодня 01.01.2009 12:00:00) пользователь настроил отключение на 01.01.2009 24:00:00 и забыл об этом! Понадобилось ему дату передвинуть назад ну чтоб поправить что-то в программе которая проверяет системное время, он выставил 30.11.2008 12:00:00! И что будет? Будем месяц ждать автоматизации? Значит к системной дате привязываться в случае автоматизации нельзя… Я хочу быть уверенным, что все произойдет через такое время как я запрограммировал! А как отследить что мы все еще на рабочем месте, трудимся? А вот написать приложение которое не только 3 но и все 33 пальца засунет куда угодно, без проблем… Делаем вывод — Назначенные задания применяем там где не особо критично будет ли оно вообще выполнено, например запустим антивирусный сканер ночью. Много нелестных отзывов от системных администраторов приходилось мне слышать о назначенных заданиях в Windows! Кстати вариант с синхронизацией времени на сервере не предлагать. Проходили уже! Да и речь идет о конкретной машине,конкретного пользователя…
(47) Шедулер, бесспорно, не панацея. Но я сам системный администратор и по себе знаю, что настроить его на бесперебойную работу легче и быстрее, нежели искать необходимое ПО, знакомиться с его возможностями и разбираться в настройках или создавать собственную реализацию. Чтобы не было недоразумений, сразу поясню, что отталкиваюсь исключительно из собственного опыта, а кому-то может быть проще и легче работать именно с приложениями. Теперь насчет примера отключения компа. Ту же самую ошибку (что-то изменил, что-то забыл) можно сотворить и с программным обеспечением, завершающим работу Виндов. У меня в офисе компьютеры отключаются заданием, выполняя команду «shutdown -f -s t 0» каждый день в 22:00, но не раньше 30 минут простоя.
(48) А как определяется простой? С командной то строкой и так ясно…
(49) Непосредственно в задании. Там есть опции запуска по простою.
Да уж… В хрюше? Таки нет…
Нашел и в хрюше…
Ну какие выводы? Как и ожидалось плевать хотел планировщик на эту опцию! спецом всё настроил и мышкой «ерзал» старательно, всё равно сработал. Сразу опять всех админов вспомнил что плюются от планировщика Windows…
А на работе у нас после 5 срабатываний перестала база выгружаться… А самопальный работает! Какие ещё примеры то нужны?
Разработка выполнена с целью изучения работы внутренних механизмов Windows. Это и в заголовке написано. Тут копья особенно ломать то нечего. Изучила, воплотила, ну и молодец Я!
(48)»Ту же самую ошибку (что-то изменил, что-то забыл) можно сотворить и с программным обеспечением» — нельзя, в моей программе сработает любая настройка! В отличие от планировщика. Ещё раз убедилась, что не особенно то ты и смотрел её… А в этой ветке идет речь именно о ней!
я просто с вас офигеваю…
(56)Как это понимать??