gifts2017

Эксперименты с функциями Win 32 API в 1C часть 2

Опубликовал Денис Денин (MrDen) в раздел Программирование - Практика программирования

Эксперименты с функциями Win 32 API в 1C

Пример №3 Разрушаем окна (на примере PopUp меню)

Регистрируем функции:

Wrap = CreateObject("DynamicWrapperX");
Wrap.Register("USER32.DLL", "FindWindow", "i=ss", "r=l");
Wrap.Register("USER32.DLL", "DestroyWindow", "i=h", "r=l");

получаем дискриптор окна поиском по классу #32768
HWND = Wrap.FindWindow("#32768","");
  Если HWND<>0 Тогда
  Wrap.DestroyWindow(HWND);
КонецЕсли;

Все менюшка исчезла
Внимание DestroyWindow() не работает в потоке!

Пример №4 Запрет запуска обработки или конфигурации более 1 раза (классический, мьютексы-взаимоисключения)

Регистрируем функции:
Wrap = CreateObject("DynamicWrapperX");
// создать мьютекс
Wrap.Register("KERNEL32.DLL", "CreateMutex", "i=lls", "r=l");
// открыть мьютекс
Wrap.Register("KERNEL32.DLL", "OpenMutex", "i=lls", "r=l");
// ожидание объекта
Wrap.Register("KERNEL32.DLL", "WaitForSingleObject", "i=hl", "r=l");
// высвобождение
Wrap.Register("KERNEL32.DLL", "ReleaseMutex", "i=h", "r=l");
// закрываем
Wrap.Register("KERNEL32.DLL", "CloseHandle", "i=h", "r=l");

Объявляем переменные:
MutexName = "MainErt";
MUTEX_ALL_ACCESS = 2031617;
Проверяем на существование мьютекса в системе:
HMutex = Wrap.OpenMutex(MUTEX_ALL_ACCESS,0,MutexName);
Если HMutex=0 Тогда
  // создаем если не существует и высвобождаем  на потом
  HMutex = Wrap.CreateMutex(0,1,MutexName);
  Wrap.ReleaseMutex(HMutex);
Иначе
  Предупреждение("Обработка уже запущена работа невозможна!");
КонецЕсли;

Пример №5 Широковещательные сообщения

Wrap = CreateObject("DynamicWrapperX");
Wrap.Register("netapi32.dll", "NetMessageBufferSend", "i=wwwwl", "r=l");
servername = "\\compname";
messagename = "compname";
fromname = "compname";
messagetext = "hello"+РазделительСтрок+"!!!";
messagelength = СтрДлина(messagetext)*2;
res = Wrap.NetMessageBufferSend(servername,messagename,fromname,messagetext,messagelength);

Внимание! Важны права доступа, имена пользователей и тп. Подробнее в MSDN.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Орефков (orefkov) 08.09.10 10:10
Пример 4: предварительно открывать мьютекс не нужно. Если при создании будет задано имя уже существующего мьютекса, его и вернут. При этом GetLastError вернет ERROR_ALREADY_EXISTS, и овладения мьютексом не будет.