<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; Прочее (Реестр, 1С, текстовые редакторы и т.д.)]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;fid=7&amp;type=atom" />
	<updated>2023-02-23T15:35:25Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/index.php</id>
		<entry>
			<title type="html"><![CDATA[AutoIT: (Игра) Kena: Bridge of Spirits: Прыжок + "Лук" (Jump + "Bow")]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=17616&amp;action=new" />
			<summary type="html"><![CDATA[<p>1. Вешает на клавишу &quot;v&quot; двойной прыжок с замедлением и натягиванием тетивы &quot;лука&quot; (т.е. посоха).<br />2. Отключается при переключении из окна игры.</p><p>Лично для меня решил проблему с тем, что в боях с боссами любой сбой тетивы мог привести к непопаданию в тайминг или лишней тычке.<br />- Почти перестал психовать когда играл от &quot;лука&quot;.<br />- Перестал беспокоиться что раскрошу любимую клавиатуру.</p><div class="codebox"><pre><code>; Тема на форуме https://forum.script-coding.com/viewtopic.php?id=17616
; Обсуждение https://forum.script-coding.com/viewtopic.php?id=17621

#include &lt;Constants.au3&gt;
#include &lt;GuiConstantsEx.au3&gt;
#include &lt;WindowsConstants.au3&gt;
#include &lt;Misc.au3&gt;

#NoTrayIcon

Opt(&quot;TrayOnEventMode&quot;, 1)
Opt(&quot;TrayMenuMode&quot;, 1) ; Default tray menu items (Script Paused/Exit) will not be shown.

TrayCreateItem(&quot;&quot;)
Local $ExitMenuItem = TrayCreateItem(&quot;Exit&quot;)
TrayItemSetOnEvent($ExitMenuItem, &quot;ExitHandler&quot;)
TraySetState(1) ; Shows the tray icon
TraySetClick(16) ; Only secondary mouse button will show the tray menu.

Local $hDLL = DllOpen(&quot;user32.dll&quot;)
Local $v_is_pressed = 0
Local $hotkeys_mode_saved = 0
Local $hotkeys_mode_needed = 0

;======== Тело скрипта (выполняется постоянно) ========
While 1
	; Каждые 0.4 секунды определяет активно-ли окно &quot;Kena: Bridge of Spirits&quot;.
	Sleep(400)
	If WinActive(&quot;Kena: Bridge of Spirits&quot;) Then
		$hotkeys_mode_needed = 1
	Else
		$hotkeys_mode_needed = 2
	EndIf	
	If $hotkeys_mode_needed &lt;&gt; $hotkeys_mode_saved Then
		$hotkeys_mode_saved = $hotkeys_mode_needed
		; Если фокус переключился на окно Ken&#039;ы - переназначает клавишу &quot;v&quot; на двойной прыжок.
		If $hotkeys_mode_needed = 1 Then
			HotKeySet(&quot;{v}&quot;, &quot;Jump&quot;)
			HotKeySet(&quot;+{V}&quot;, &quot;Nothing&quot;)
		; Если фокус переключился на другое окно - возвращает стандартную работу клавиши &quot;v&quot; и отжимает Shift.
		Else
			HotKeySet(&quot;{v}&quot;)
			HotKeySet(&quot;+{V}&quot;)
			; A0 - left SHIFT, A1 - right SHIFT.
			If $v_is_pressed or _IsPressed(&quot;A0&quot;, $hDLL) or _IsPressed(&quot;A1&quot;, $hDLL) Then
				Send(&quot;{SHIFTUP}&quot;)
			EndIf
			$v_is_pressed = 0
		EndIf	
	EndIf
WEnd

;======== Обработчик нажатия клавиши &quot;v&quot; в игре ========
Func Jump()
	; Если клавиша &quot;v&quot; уже нажата - выход для предтворащения двойного срабатывания скрипта.
	if $v_is_pressed Then
		Return
	EndIf
	$v_is_pressed = 1
	; Двойное нажатие на пробел, затем зажатие Shift и левой кнопки мыши (прицеливание).
	Send(&quot;{SPACE down}&quot;)
	Sleep(10)
	Send(&quot;{SPACE up}&quot;)
	Sleep(200)
	Send(&quot;{SPACE down}&quot;)
	Sleep(300)
	Send(&quot;{SHIFTDOWN}&quot;)
	Sleep(100)
	MouseDown($MOUSE_CLICK_LEFT)
	; Ожидание отжатия клавиши &quot;v&quot;.
	While 1
		; Код 56 соответствует нажатой клавише &quot;v&quot;.
		If _IsPressed(&quot;56&quot;, $hDLL) Then
			Sleep(30)
		Else
			ExitLoop
		EndIf
	Wend
	; Отпускание левой клавиши мыши.
	; Код 01 соответствует нажатой левой клавиши мыши.
	If _IsPressed(&quot;01&quot;, $hDLL) Then
		MouseUp($MOUSE_CLICK_LEFT)
		Sleep(20)
	EndIf
	; Отпускание Shift и пробела.
	Send(&quot;{SHIFTUP}&quot;)
	Send(&quot;{SPACE up}&quot;)
	$v_is_pressed = 0
EndFunc

;======== Обработчик нажатия клавиши &quot;shift+v&quot; в игре ========
Func Nothing()
	
EndFunc

Func ExitHandler()
	Exit(0)
EndFunc
</code></pre></div><p><strong>Обсуждение</strong>: <a href="https://forum.script-coding.com/viewtopic.php?id=17621">Здесь</a></p>]]></summary>
			<author>
				<name><![CDATA[Kiber]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=262</uri>
			</author>
			<updated>2023-02-23T15:35:25Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=17616&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[LangMF 9.0: Создание COM Automation объекта без регистрации библиотеки]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=11254&amp;action=new" />
			<summary type="html"><![CDATA[<p><em>Без гарантий! Используете на свой страх и риск.</em></p><p>Скрипт предназначен для создания Automation объектов без регистрации COM библиотеки в реестре.</p><p>Аргументы функции GetObjectFromDLL:<br /> sPath&nbsp; &nbsp; Путь к COM библиотеке, строка.<br /> sCLSID&nbsp; &nbsp;Идентификатор класса CLSID, строка вида &quot;{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&quot;.<br /> sUUID&nbsp; &nbsp; Идентификатор интерфейса IID, строка вида &quot;{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&quot;.</p><br /><p>Например, в библиотеке AutoItX3 (3.2.0.1), класс [AutoItX3 Class], содержит Automation интерфейс [IAutoItX3 Interface]. Класс имеет идентификатор {1A671297-FA74-4422-80FA-6C5D8CE4DE04}, а идентификатор интерфейса {3D54C6B8-D283-40E0-8FAB-C97F05947EE8}. Пользуясь этимими идентификаторами можно получить объект [AutoItX3.Control].</p><p>Потребуется установленный <a href="http://langmf.ru/ftp/archive/LangMF_9.0.exe">LangMF 9.0</a>.<br />OC WinXP</p><div class="codebox"><pre><code>
&#039; Без гарантий! Используете на свой страх и риск.
&#039;------------------------------------------------------------------------------------------
&#039; Скрипт предназначен для создания Automation объектов без регистрации библиотеки в реестре.
&#039;
&#039; Аргументы функции GetObjectFromDLL:
&#039; sPath    Путь к COM библиотеке, строка.
&#039; sCLSID   Идентификатор класса CLSID, строка вида &quot;{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&quot;.
&#039; sUUID    Идентификатор интерфейса IID, строка вида &quot;{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&quot;.
&#039;
&#039;
&#039; Потребуется установленный LangMF 9.0 (http://langmf.ru/ftp/archive/LangMF_9.0.exe)
&#039; OC WinXP
&#039;------------------------------------------------------------------------------------------
Public Declare Function CLSIDFromString Lib &quot;ole32&quot; (ByVal lpsz As Long, pclsid As Guid) As Long
&#039;------------------------------------------------------------------------------------------
&lt;#Module=DispNoRegCall&gt;

&#039;------------------------------------------------------------------------------------------
&#039; Создание Automation объектов и работа с ними
&#039;------------------------------------------------------------------------------------------
Sub Load(cmdstr)

	Dim oAU3, oWshExtra
	Dim sFile

	&#039; WshExtra.FileChooser
	&#039;-----------------------------------------------------------------------------------
	Set oWshExtra = GetObjectFromDLL(&quot;G:\WshExtra.dll&quot;, _
					&quot;{D199C0CE-78E8-4DE2-B863-CCDC022A2FCA}&quot;, _
					&quot;{1FBCEB53-17E7-438F-926E-643ABC236A51}&quot;)
					
	MsgBox &quot;Созданный тип [&quot; &amp; TypeName(oWshExtra) &amp; &quot;].&quot;, vbSystemModal + vbInformation, &quot;Reply&quot;
		oWshExtra.Title = &quot;Открытие файла...&quot;
		oWshExtra.Filter = &quot;Все файлы|*.*|&quot;
		sFile = oWshExtra.Browse(&quot;C:\&quot;) 
		If Len(sFile)&lt;&gt;0 Then MsgBox &quot;Выбранный файл: &quot; &amp; sFile, vbSystemModal + vbInformation, &quot;Reply&quot;

	&#039; AutoItX3.Control
	&#039;-----------------------------------------------------------------------------------
	Set oAU3 = GetObjectFromDLL(	&quot;G:\AutoItX3.dll&quot;, _
					&quot;{1A671297-FA74-4422-80FA-6C5D8CE4DE04}&quot;, _
					&quot;{3D54C6B8-D283-40E0-8FAB-C97F05947EE8}&quot;)
					
	MsgBox &quot;Созданный тип [&quot; &amp; TypeName(oAU3) &amp; &quot;].&quot;, vbSystemModal + vbInformation, &quot;Reply&quot;	
	oAU3.ToolTip vbCRLF &amp; &quot;Создание Automation объекта без регистрации библиотеки...&quot; &amp; vbCRLF, 100, 100
	oAU3.Sleep(4000)
	&#039;-----------------------------------------------------------------------------------
	EndMF
End Sub

&#039;------------------------------------------------------------------------------------------
&#039; Создать Automation объект из незарегистрированной в реестре библиотеки
&#039;------------------------------------------------------------------------------------------
Function GetObjectFromDLL(sPath, sCLSID, sUUID)

	Const S_OK = 0
	Const CreateInstanceID = 3
	Const GetTypeInfoOfGuidID = 6
	Const QueryInterfaceID = 0
	Const REGKIND_NONE = 2
	Const REGKIND_DEFAULT = 0
	&#039;-----------------------------------------------------------------------------------
	Dim hRes
	Dim pvarRes
	Dim pCLSID, pIClassFactory, pIDispatch, pIUnknown, pUUID
	Dim p1, p2, p3, p4, p5, p6
	Dim objX

	&#039;-----------------------------------------------------------------------------------
	Const sIID_IClassFactory = &quot;{00000001-0000-0000-C000-000000000046}&quot;
	Const sIID_IDispatch = &quot;{00020400-0000-0000-C000-000000000046}&quot;
	Const sIID_IUnknown = &quot;{00000000-0000-0000-C000-000000000046}&quot;

	&#039;-----------------------------------------------------------------------------------
	Sys.DynAPI.CallFunction &quot;OLE32.DLL&quot;, &quot;CoInitialize&quot;, 0

	&#039; Подготовить память для GUID и возвращаемого результата
	&#039;-----------------------------------------------------------------------------------
	Sys.DynAPI.CurBuf = 0
	Sys.DynAPI.ReBuf(16)
	pCLSID = Sys.DynAPI.PtrBuf(0)

	Sys.DynAPI.CurBuf = 1
	Sys.DynAPI.ReBuf(16)
	pIClassFactory = Sys.DynAPI.PtrBuf(1)

	Sys.DynAPI.CurBuf = 2
	Sys.DynAPI.ReBuf(16)
	pIDispatch = Sys.DynAPI.PtrBuf(2)

	Sys.DynAPI.CurBuf = 3
	Sys.DynAPI.ReBuf(16)
	pIUnknown = Sys.DynAPI.PtrBuf(3)

	Sys.DynAPI.CurBuf = 4
	Sys.DynAPI.ReBuf(16)
	pUUID = Sys.DynAPI.PtrBuf(4)

	Sys.DynAPI.CurBuf = 5
	Sys.DynAPI.ReBuf(4)
	pvarRes = Sys.DynAPI.PtrBuf(5)

	&#039; Преобразовать строковые идентификаторы в GUID
	&#039;-----------------------------------------------------------------------------------
	Call CLSIDFromString(Sys.StrPtr(sCLSID), pCLSID)
	Call CLSIDFromString(Sys.StrPtr(sIID_IClassFactory), pIClassFactory)
	Call CLSIDFromString(Sys.StrPtr(sIID_IDispatch), pIDispatch)
	Call CLSIDFromString(Sys.StrPtr(sIID_IUnknown), pIUnknown)
	Call CLSIDFromString(Sys.StrPtr(sUUID), pUUID)

	
	&#039;===============================================
	&#039; Получить фабрику классов IClassFactory
	&#039;-----------------------------------------------------------------------------------
	hRes = Sys.DynAPI.CallFunction(sPath, &quot;DllGetClassObject&quot;, pCLSID, pIClassFactory, pvarRes)
		If hRes &lt;&gt; S_OK Then ErrMsg(hRes): Set GetObjectFromDLL = Nothing: Exit Function
		p1 = RetPtr()
		

	&#039; Вернуть указатель на IDispatch путем вызова CreateInstance из фабрики IClassFactory
	&#039;-----------------------------------------------------------------------------------
	hRes = Sys.DynApi.CallInterface(p1, CreateInstanceID, 3, 0, pIDispatch, pvarRes)
		If hRes &lt;&gt; S_OK Then ErrMsg(hRes): Set GetObjectFromDLL = Nothing: Exit Function
		p2 = RetPtr()
	
	&#039; Если здесь попробовать восстановить объект по указателю [Set GetObjectFromDLL = Sys.ObjFromPtr(p2)],
	&#039; то такая схема работать не будет, т.к TypeLib не зарегистрирована, будет получен &quot;пустой&quot;
	&#039; объект, без свойств и методов. Нужно подключить библиотеку типов и загрузить указатель
	&#039; на TypeInfo для заданного интерфейса UUID.
	
	&#039;===============================================
	&#039; Загрузить встроенную библиотеку типов
	&#039;-----------------------------------------------------------------------------------
	hRes = Sys.DynAPI.CallFunction(&quot;OLEAUT32.DLL&quot;, &quot;LoadTypeLibEx&quot;, Sys.StrConv(sPath,vbUnicode), REGKIND_NONE, pvarRes)
		If hRes &lt;&gt; S_OK Then ErrMsg(hRes): Set GetObjectFromDLL = Nothing: Exit Function
		p3 = RetPtr()

	&#039; Получить указатель на TypeInfo для заданного интерфейса UUID
	&#039;-----------------------------------------------------------------------------------
	hRes = Sys.DynApi.CallInterface(p3, GetTypeInfoOfGuidID, 2, pUUID, pvarRes)
		If hRes &lt;&gt; S_OK Then ErrMsg(hRes): Set GetObjectFromDLL = Nothing: Exit Function
		p4 = RetPtr()

	&#039; Получить IUnknown заданного интерфейса на основе TypeInfo 
	&#039;-----------------------------------------------------------------------------------
	hRes = Sys.DynAPI.CallFunction(&quot;OLEAUT32.DLL&quot;, &quot;CreateStdDispatch&quot;, 0, p2, p4, pvarRes)
		If hRes &lt;&gt; S_OK Then ErrMsg(hRes): Set GetObjectFromDLL = Nothing: Exit Function
		p5 = RetPtr()

	&#039; Получить IDispatch заданного интерфейса
	&#039;-----------------------------------------------------------------------------------
	hRes = Sys.DynApi.CallInterface(p5, QueryInterfaceID, 2, pIDispatch, pvarRes)
		If hRes &lt;&gt; S_OK Then ErrMsg(hRes): Set GetObjectFromDLL = Nothing: Exit Function
		p6 = RetPtr()

	&#039;===============================================
	&#039; Восстановить и вернуть объект
	&#039;-----------------------------------------------------------------------------------
	Set GetObjectFromDLL = Sys.ObjFromPtr(p6)
	If Not IsObject(GetObjectFromDLL) Then ErrMsg(&quot;Не удалось получить объект.&quot;): Set GetObjectFromDLL = Nothing: Exit Function
		
	
	&#039;-----------------------------------------------------------------------------------
	Sys.DynAPI.CallFunction &quot;OLE32.DLL&quot;, &quot;CoUninitialize&quot;

End Function

&#039; Извлечение значения из указателя
&#039;------------------------------------------------------------------------------------------
Function RetPtr()
	Dim buf()
	Sys.DynAPI.GetBuf buf, 5
	RetPtr = Sys.Conv.Byte4Long (buf(3),buf(2),buf(1),buf(0))	
End Function

&#039; Сообщение об ошибке
&#039;------------------------------------------------------------------------------------------
Sub ErrMsg(vMsg)
	Sys.DynAPI.CallFunction &quot;OLE32.DLL&quot;, &quot;CoUninitialize&quot;
	Sys.Sleep(100)
	MsgBox &quot;Произошла ошибка: &quot; &amp; CStr(vMsg), vbSystemModal + vbExclamation, &quot;Error Reply&quot;
End Sub
&#039;------------------------------------------------------------------------------------------
&lt;#Module&gt;
</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2016-01-22T20:35:27Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=11254&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VB.NET: Авторизация OpenVPN через учётку Windows]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=9647&amp;action=new" />
			<summary type="html"><![CDATA[<p>Есть в природе OpenVPN, умеющий при авторизации пользователей запускать скрипт для дополнительной авторизации. Под линуксы скриптов навалом, под Windows&nbsp; нашел одну <a href="https://sites.google.com/site/amigo4life2/openvpn">портянку</a> на vbs, которая к тому же не заработала на моей ОС(так как AD там нет и быть не может). <br />Как оказалось, всё гораздо проще можно реализовать воспользовавшись <strong>.NET</strong>. Под данную реализацию потребуется версия 3.5(и выше - требуется наличие System.DirectoryServices.AccountManagement.PrincipalContext).</p><p>Для тех кто не сталкивался с OpenVPN в кратце поясню. При авторизации пользователя(помимо сертификатов и пр.) можно запросить у пользователя логин-пароль и проверить его в системных учётках ОС. Для этого в конфиге указывается скрипт, которому при запуске в виде параметра передаётся имя файла. В файле(временный, на время авторизации) содержится всего две строки - логин и пароль. В результате работы скрипта должен вернуться код завершения 0(успешная авторизация) или 1(не удалось авторизоваться).</p><p>Протестировано на:<br /></p><ul><li><p>Windows XP Pro SP3, VS2008(.NET 3.5)</p></li><li><p>Windows 2003 Server Web Edition, VB.NET 2010 Express(.Net 4.0 - на сайте MS 2008-ую эспресс студию уже не нашел)</p></li></ul><p>Приложение консольное. В проекте нужно добавить ссылку на System.DirectoryServices.AccountManagement.</p><p>Программа умеет:<br />1. Проверять пару логин-пароль.<br />2. Проверять нахождение пользователя в группе(непосредственно, без проверки вхождения через членство в других группах).<br />3. Работает для локальной авторизации и для домена(про домен - вроде работает, но мой комп не в домене и тест нельзя назвать полноценным).<br />4. Пишет лог(в файл).<br />5. Настройки берёт из INI-файла.</p><p>Пути сборок для наглядности не сокращал.</p><p>Основной модуль:<br /></p><div class="codebox"><pre><code>
Module winauth
    Dim logfile As System.IO.StreamWriter
    Dim pwdfile As System.IO.StreamReader
    Dim INI As New Class_ini_ops
    Function Main(ByVal cmdArgs() As String) As Integer
        Dim oContext As System.DirectoryServices.AccountManagement.PrincipalContext
        Dim oGroupUsers As System.DirectoryServices.AccountManagement.GroupPrincipal
        Dim usrName As String
        Dim usrPass As String
        Dim returnValue As Boolean

        Dim ini_file = System.Environment.CurrentDirectory.ToString &amp; &quot;\&quot; &amp; &quot;config.ini&quot;
        Dim ini_section = &quot;Configuration&quot;

        &#039;chk ini file
        If INI.GetSectionParams(ini_file, ini_section) Is Nothing Then
            Echo(&quot;Incorrect INI format.&quot;)
            Return 1
        End If

        Dim GroupName As String
        GroupName = INI.GetParamValue(ini_file, ini_section, &quot;GroupName&quot;)
        If GroupName Is Nothing Then
            Echo(&quot;User target group not set in ini-file.&quot;)
            Return 1
        End If

        &#039;имя(и путь) файла вынести в конфиг
        logfile = My.Computer.FileSystem.OpenTextFileWriter(&quot;winauth.log&quot;, True, _
                                                    System.Text.Encoding.GetEncoding(1251))
        logfile.AutoFlush = True

        &#039;check args
        If cmdArgs.Count &lt;&gt; 1 Then
            Echo(&quot;Wrong parametrs.&quot;)
            Return 1
        Else
            Try
                pwdfile = My.Computer.FileSystem.OpenTextFileReader(cmdArgs(0).ToString, _
                                                    System.Text.Encoding.GetEncoding(1251))
            Catch ex As Exception
                Echo(ex.Message.ToString)
                Echo(&quot;pwdfile not found.&quot;)
            End Try

            Try
                usrName = pwdfile.ReadLine.ToString
            Catch ex As Exception
                Echo(ex.Message.ToString)
                Echo(&quot;No data in pwdfile.&quot;)
                Return 1
            End Try

            Try
                usrPass = pwdfile.ReadLine.ToString
            Catch ex As Exception
                Echo(ex.Message.ToString)
                Echo(&quot;No password in pwdfile.&quot;)
                Return 1
            End Try
        End If
        pwdfile.Close()

        &#039;Get Auth context from INI, default is Local
        Dim iniContext
        iniContext = INI.GetParamValue(ini_file, ini_section, &quot;Context&quot;)
        If iniContext Is Nothing Then
            iniContext = &quot;Local&quot;
        End If

        &#039; Set PrincipalContext
        Dim DN As String = &quot;&quot;
        Dim PDC As String = &quot;&quot;
        Select Case iniContext
            Case &quot;Local&quot;
                oContext = New System.DirectoryServices.AccountManagement.PrincipalContext( _
                            System.DirectoryServices.AccountManagement.ContextType.Machine, _
                            System.Environment.MachineName.ToString)
            Case &quot;Domain&quot;
                PDC = INI.GetParamValue(ini_file, ini_section, &quot;PDC&quot;)
                If PDC Is Nothing Then
                    Echo(&quot;PDC not set in ini-file.&quot;)
                    Return 1
                End If
                DN = INI.GetParamValue(ini_file, ini_section, &quot;DN&quot;)
                If DN Is Nothing Then
                    Echo(&quot;DN not set in ini-file.&quot;)
                    Return 1
                End If
                oContext = New System.DirectoryServices.AccountManagement.PrincipalContext( _
                                System.DirectoryServices.AccountManagement.ContextType.Domain, _
                                PDC, DN)
            Case Else
                Echo(&quot;Context not set in ini-file or incorrect.&quot;)
                Return 1
        End Select

        &#039;Check that the user is a member of the group
        oGroupUsers = System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(oContext, _
                                DirectoryServices.AccountManagement.IdentityType.Name, _
                                GroupName)
        Dim oUsers As System.DirectoryServices.AccountManagement.PrincipalSearchResult(Of  _
                                        System.DirectoryServices.AccountManagement.Principal)
        oUsers = Nothing
        If oGroupUsers Is Nothing Then
            Echo(&quot;No such group [&quot; &amp; GroupName &amp; &quot;] found.&quot;)
            Return 1
        Else
            oUsers = oGroupUsers.GetMembers
        End If

        If oUsers.Contains(System.DirectoryServices.AccountManagement.Principal.FindByIdentity(oContext, usrName)) Then
            Debug.Print(&quot;caught!&quot;)
        Else
            Debug.Print(&quot;shot at milk...&quot;)
            Select Case iniContext
                Case &quot;Local&quot;
                    Echo(&quot;Group check failure: the user is not a member of [&quot; &amp; GroupName &amp; &quot;].&quot;)
                Case &quot;Domain&quot;
                    Echo(&quot;Group check failure: the user is not a member of [&quot; &amp; GroupName &amp; &quot;@{&quot; &amp; DN &amp; &quot;}].&quot;)
            End Select
            Return 1
        End If

        Try
            returnValue = oContext.ValidateCredentials(usrName, usrPass)
        Catch ex As Exception
            Echo(ex.Message.ToString)
            Return 1
            &#039;Error Codes list for Microsoft technologies:
            &#039;http://www.symantec.com/business/support/index?page=content&amp;id=TECH12638
            &#039;&quot;HRESULT: 0x80070533&quot; == &quot;Logon failure: account currently disabled.&quot;
        End Try

        Select Case returnValue
            Case False
                Echo(&quot;Logon failure: username or password incorrect.&quot;)
                Return 1
            Case True
                Echo(&quot;Logon is successful.&quot;)
                Return 0
            Case Else
                Echo(&quot;Unknown Error?&quot;)
                Return 1
        End Select
    End Function
    Sub Echo(ByVal text)
        Console.WriteLine(text)
        Debug.Print(text)
        logfile.WriteLine(Now() &amp; &quot;:&gt; &quot; &amp; text)
    End Sub
End Module
</code></pre></div><p>Клас для работы с INI:<br /></p><div class="codebox"><pre><code>
Public Class Class_ini_ops
    &#039;изначально была копипаста отсюда: http://www.cyberforum.ru/vb-net/thread382768.html
#Region &quot;API Calls&quot;
    Private Declare Unicode Function WritePrivateProfileString Lib &quot;kernel32&quot; _
    Alias &quot;WritePrivateProfileStringW&quot; (ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, ByVal lpString As String, _
    ByVal lpFileName As String) As Integer

    Private Declare Unicode Function GetPrivateProfileString Lib &quot;kernel32&quot; _
    Alias &quot;GetPrivateProfileStringW&quot; (ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, ByVal lpDefault As String, _
    ByVal lpReturnedString As String, ByVal nSize As Int32, _
    ByVal lpFileName As String) As Integer
#End Region
    ReadOnly CallBufferSize As Short = 4096
    Public Function GetSectionsList(ByVal INIfile As String) As Array
        Dim n As Integer
        Dim sData As String
        Dim sb As New System.Text.StringBuilder
        sData = sb.Insert(0, vbNullChar, CallBufferSize).ToString
        n = GetPrivateProfileString(vbNullString, vbNullString, vbNullString, sData, CallBufferSize, INIfile)
        If n &gt; 0 Then
            GetSectionsList = sData.Substring(0, n - 1).Split(vbNullChar)
        Else
            GetSectionsList = Nothing
        End If
    End Function
    Public Function GetSectionParams(ByVal INIfile As String, ByVal SectionName As String) As Array
        Dim n As Integer
        Dim sData As String
        Dim sb As New System.Text.StringBuilder
        sData = sb.Insert(0, vbNullChar, CallBufferSize).ToString
        n = GetPrivateProfileString(SectionName, vbNullString, vbNullString, sData, CallBufferSize, INIfile)
        If n &gt; 0 Then
            GetSectionParams = sData.Substring(0, n - 1).Split(vbNullChar)
        Else
            GetSectionParams = Nothing
        End If
    End Function
    Public Overloads Function GetParamValue(ByVal INIfile As String, ByVal SectionName As String, ByVal ParamName As String) As String
        Dim n As Integer
        Dim sData As String
        Dim sb As New System.Text.StringBuilder
        sData = sb.Insert(0, vbNullChar, CallBufferSize).ToString
        n = GetPrivateProfileString(SectionName, ParamName, vbNullString, sData, CallBufferSize, INIfile)
        If n &gt; 0 Then
            GetParamValue = sData.Substring(0, n)
        Else
            GetParamValue = Nothing
        End If
    End Function
    Public Overloads Function GetParamValue(ByVal INIfile As String, ByVal SectionName As String, ByVal ParamName As String, _
                                            ByVal DefaultValue As String) As String
        Dim n As Integer
        Dim sData As String
        Dim sb As New System.Text.StringBuilder
        sData = sb.Insert(0, vbNullChar, CallBufferSize).ToString
        n = GetPrivateProfileString(SectionName, ParamName, DefaultValue, sData, CallBufferSize, INIfile)
        If n &gt; 0 Then
            GetParamValue = sData.Substring(0, n)
        Else
            GetParamValue = Nothing
        End If
    End Function
    Public Function SetParamValue(ByVal INIfile As String, ByVal SectionName As String, ByVal ParamName As String, _
                                  ByVal ParamValue As String) As Boolean
        Call WritePrivateProfileString(SectionName, ParamName, ParamValue, INIfile)
        If ParamValue = GetParamValue(INIfile, SectionName, ParamName) Then
            SetParamValue = True
        Else
            SetParamValue = False
        End If
    End Function
End Class
</code></pre></div><p>Пример конфига(config.ini, ищется в папке в приложением):<br /></p><div class="codebox"><pre><code>
[Configuration]
;set auth context
;Local - check local credentials(default)
;Domain -  check credentials in Domain
Context = Local

; Used only in Context = Domain
PDC = MyServer
DN = &quot;DC=mydomain,DC=local&quot;

;target user group
GroupName = &quot;Операторы сервера&quot;
</code></pre></div><br /><br /><p>P.S. Решение &quot;вылежалось&quot; с пол года, так что публикую как есть. Будут коментарии -&gt; тема в обсуждениях: <a href="http://forum.script-coding.com/viewtopic.php?id=9001">Серый форум&nbsp; ? Общение&nbsp; ? Прочие скриптовые технологии и близкие к ним&nbsp; ? VB.NET: Авторизация OpenVPN через учётку Windows</a></p>]]></summary>
			<author>
				<name><![CDATA[BeS Yara]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25643</uri>
			</author>
			<updated>2014-05-26T06:13:16Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=9647&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Cygwin/Bash: Запуск Cygwin в заданном каталоге из Проводника]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=9010&amp;action=new" />
			<summary type="html"><![CDATA[<p>В иностранной литературе это называется Cygwin Here. По сути - запуск Cygwin в заданном каталоге из Проводника. </p><p>Мне надоело запускать Cygwin и переходить до нужного каталога. Алиасы специально создавать я не хотел. <a href="https://www.google.com/#newwindow=1&amp;q=cygwin+here">Гугл помог</a>. Более того, я собрал все решения Интернета и реализовал новое. На мой взгляд стало чуточку лучше. </p><p>Я набросал небольшой пакетный скрипт, который позволяет мне запускать Cygwin несколькими способами:<br />-- правым кликом из ПРоводника (а также файл-менеджеров таких как Total Commander, Double Commander и прочих)<br />-- из командной строки<br />-- из пользовательского меню FAR</p><p><strong>Исходный код</strong><br /><a href="http://with-love-from-siberia.blogspot.ru/2013/12/cygwin-here.html">По ссылке</a> тот же код, но без купюр - с английскими комментариям. <br /></p><div class="codebox"><pre><code>
@echo off

if /i &quot;%~1&quot; == &quot;/HELP&quot; (
 echo:Cygwin Here
 echo:
 echo:Usage:
 echo:%~n0 [/HELP ^| /INSTALL ^| /UNINSTALL ^| /LIST ^| &quot;folder&quot;]
 goto :EOF
)

if /i &quot;%~1&quot; == &quot;/INSTALL&quot; (
 for %%p in ( &quot;Drive&quot; &quot;Directory&quot; &quot;Directory\Background&quot; ) do (
  reg add &quot;HKEY_CLASSES_ROOT\%%~p\shell\Cygwin Here\command&quot; /ve /d &quot;\&quot;%~f0\&quot; \&quot;%%V\&quot;&quot; /f
 )
 goto :EOF
)

if /i &quot;%~1&quot; == &quot;/UNINSTALL&quot; (
 for %%p in ( &quot;Drive&quot; &quot;Directory&quot; &quot;Directory\Background&quot; ) do (
  reg delete &quot;HKEY_CLASSES_ROOT\%%~p\shell\Cygwin Here&quot; /f
 )
 goto :EOF
)

if /i &quot;%~1&quot; == &quot;/LIST&quot; (
 for %%p in ( &quot;Drive&quot; &quot;Directory&quot; &quot;Directory\Background&quot; ) do (
  reg query &quot;HKEY_CLASSES_ROOT\%%~p\shell\Cygwin Here&quot; /s
 )
 goto :EOF
)

if not &quot;%~1&quot; == &quot;&quot; pushd &quot;%~1&quot; || goto :EOF

start &quot;Cygwin Here&quot; &quot;%~dp0mintty.exe&quot; -i /Cygwin-Terminal.ico -h start &quot;%~dp0bash.exe&quot; -l -c &quot;cd &#039;%CD%&#039; ; exec bash&quot;

popd

</code></pre></div><p><strong>Описание</strong></p><p>параметры командной строки<br />/HELP - вывод справки<br />/INSTALL - инсталлировать скрипт в Проводик<br />/UNINSTALL - деинсталлировать скрипт из Проводника<br />/LIST - вывести список измененных записей в реестре</p><p>Другие значения подразумеваются как путь до каталога, в котором Cygwin должыен быть запущен. Пустой список параметров значит запуск Cygwin в текущем каталоге. </p><p>На мой взгляд, у этого решения два явных преимущества<br />1. манипуляции с реестром скрыты от конечного пользователя<br />2. один скрипт для нескольких целей (запуск из разных источников, установка и удаление)</p><p><strong>Установка скрипта для Проводника</strong></p><p>1. открыть каталог Cygwin, содержащий бинарные файлы (обычно C:\cygwin\bin)<br />2. создать файл cyghere.bat и вставить скрипт из примера выше<br />3. сохранить его и запустить команду </p><div class="codebox"><pre><code>c:\cygwin\bin\cyghere.bat /install</code></pre></div><p>Если ваша капия Cygwin установлена в другом месте - просто подкорректируйте путь.</p><p><strong>Установка для FAR</strong></p><p>1. запустить FAR<br />2. подредактировать пользовательское меню: <strong>F2</strong>, <strong>Ins</strong>, <strong>ENTER</strong> (кнопка Добавить команду)<br />3. В диалоге ввести следующее (все символы латинские)<br /></p><div class="quotebox"><blockquote><p>горячая клавиша: <strong>C</strong><br />метка: <strong>Cygwin Here</strong><br />команды: <strong>C:\cygwin\bin\cyghere.bat</strong></p></blockquote></div><p>4. закрыть диалог, нажав OK</p>]]></summary>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-12-12T21:39:32Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=9010&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[WSH & Win32API: Библиотека scrsvc.dll]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=8082&amp;action=new" />
			<summary type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>v1.2.2.1 (текущая актуальная версия)</p><p>Библиотека scrsvc.dll предназначена для вызова stdcall/cdecl WinAPI функций в сценариях VBScript и JScript, а также для отображения диалога множественного выбора и предоставляет объект ScriptService.Service.</p><p>Тестировалась на Win7 x32</p><p>1) Пример использования на <strong>VBScript</strong> (перечисление окон в системе):<br /></p><div class="codebox"><pre><code>
&#039; Перебор окон с помощью объекта ScriptService.Service в VBScript
&#039; WinXP/7

Option Explicit

Dim oScrSvc, oStream
Dim sFile, sStr
Dim iLen

&#039; Создание объектов
&#039;--------------------------------------------------------------
Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

iLen = 255
sStr = String(iLen,Chr(32))

sFile = GetFilePath()
Set oStream = CreateObject(&quot;Scripting.FileSystemObject&quot;).OpenTextFile(sFile, 2, True, 0)
oStream.WriteLine String(6,Chr(32)) &amp; &quot;HWND&quot; &amp; vbTab &amp; &quot;Class Name&quot; 

&#039; Перебор окон, назначение функции обратного вызова
&#039;--------------------------------------------------------------
With oScrSvc
	.set_vararg 0, oScrSvc.internal_callback(Me, &quot;EnumClbck&quot;,2)
	.set_vararg 1, 0
	.api_call &quot;USER32.DLL&quot;,&quot;EnumWindows&quot;,2
End With

oStream.Close()
Set oStream = Nothing
Set oScrSvc = Nothing

&#039; Отображение результата
&#039;--------------------------------------------------------------
CreateObject(&quot;WScript.Shell&quot;).Run &quot;notepad&quot; &amp; Chr(32) &amp; &quot;&quot;&quot;&quot; &amp; sFile &amp; &quot;&quot;&quot;&quot;, 1, False

WScript.Quit()

&#039; Функция обратного вызова
&#039;--------------------------------------------------------------	
Function EnumClbck(hwnd, lParam)

	Dim sH
	With oScrSvc
		.set_vararg 0, CDbl(hwnd)
		.set_strarg 1, sStr, True
		.set_vararg 2, ilen
		.api_call &quot;USER32.DLL&quot;,&quot;GetClassNameW&quot;,3,1
	End With

	&#039; Заполнение файла полученными данными
	sH = Hex(hwnd)
	oStream.WriteLine &quot;0x&quot; &amp; String(8-Len(sH),&quot;0&quot;) &amp; sH &amp; vbTab &amp; oScrSvc.pull_string(sStr,True)

End Function

&#039; Путь к файлу вывода
&#039;--------------------------------------------------------------	
Function GetFilePath()
	Dim sF
	sF = WScript.ScriptFullName
	GetFilePath = Left(sF, InStrRev(sF, &quot;\&quot;)) &amp; &quot;windows.txt&quot;
End Function
</code></pre></div><p>2) Пример использования на <strong>VBScript</strong> (отображение диалога множественного выбора):<br /></p><div class="codebox"><pre><code>
&#039; Диалог множественного выбора в VBScript
&#039; WinXP/7

Option Explicit

Dim oScrSvc
Dim arr(50)
Dim arrRet
Dim i
Dim s

&#039; Создание объекта
&#039;--------------------------------------------------------------
Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

s = &quot;Выбранные значения: &quot; &amp; vbCRLF

&#039; Заполнить массив значениями  
For i=0 To 49
	arr(i)=&quot;значение_&quot; &amp; i
Next

&#039; Вызвать диалог
arrRet = oScrSvc.multi_dialog(arr)

&#039; Разобрать выбранные значения
For i=0 To UBound(arrRet)
	s = s &amp;  arrRet(i) &amp; vbCRLF
Next

MsgBox s, vbSystemModal Or vbInformation, &quot;Reply&quot;
&#039;--------------------------------------------------------------
Set oScrSvc = Nothing
WScript.Quit()
</code></pre></div><p>Cкачать <a href="https://my-files.ru/5flr9v">scrsvc.dll(v1.2.2.1) + примеры</a> с файлообменника.</p><p>Справку readme, а также примеры использования см. в архиве библиотеки.</p>]]></summary>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2013-02-14T21:37:27Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=8082&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/WSH/HTA/JS/VBS: Универсальный способ определения внешнего IP и др.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=6857&amp;action=new" />
			<summary type="html"><![CDATA[<p>Такие ресурсы существуют, но этот лучший по количеству предоставляемых данных, структурированности и благозвучности доменного имени</p><p><a href="http://ifconfig.me/">http://ifconfig.me/</a></p><div class="codebox"><pre><code>
curl ifconfig.me

wget -qO - ifconfig.me/ip</code></pre></div><p>.<br />JS<br /></p><div class="codebox"><pre><code>
var xmlhttp = new ActiveXObject(&#039;Microsoft.XMLHTTP&#039;);
xmlhttp.open(&#039;GET&#039;, &#039;http://ifconfig.me/ip&#039;, false);
xmlhttp.send();

var ip = xmlhttp.responseText;</code></pre></div><p>.<br />JS + JSON<br /></p><div class="codebox"><pre><code>var xmlhttp = new ActiveXObject(&#039;Microsoft.XMLHTTP&#039;);
xmlhttp.open(&#039;GET&#039;, &#039;http://ifconfig.me/all.json&#039;, false);
xmlhttp.send();

var data = JSON.parse(xmlhttp.responseText);
var ip = data.ip_addr;</code></pre></div><p>.<br />JS + XML<br /></p><div class="codebox"><pre><code>
var xmlhttp = new ActiveXObject(&#039;Microsoft.XMLHTTP&#039;);
xmlhttp.open(&#039;GET&#039;, &#039;http://ifconfig.me/all.xml&#039;, false);
xmlhttp.send();

var ip = xmlhttp.responseXml.getElementsByTagName(&#039;ip_addr&#039;)[0].text;</code></pre></div><p>.<br />Аналогично можно выполнить и в VBS, например<br /></p><div class="codebox"><pre><code>
Dim xmlhttp, ip

Set xmlhttp = CreateObject(&quot;Microsoft.XMLHTTP&quot;)
xmlhttp.open &quot;GET&quot;, &quot;http://ifconfig.me/ip&quot;, False
xmlhttp.send

ip = xmlhttp.responseText</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-02-23T14:52:21Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=6857&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AutoIt v3: подача звукового сигнала через системный динамик]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5900&amp;action=new" />
			<summary type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em><br />Скрипт включает системный динамик на заданной частоте. Аналогичен скрипту представленному <a href="http://www.forum.script-coding.com/viewtopic.php?pid=31674#p31674">здесь</a>.</p><p>Потребуется библиотека <a href="http://www.pcports.ru/files/inpout32.rar">INPOUT32.DLL</a> установленная в каталог %systemdir%.</p><p>Lang AutoIt v3<br />OC WinXP</p><div class="codebox"><pre><code>;=========================================================
; Включение системного динамика на заданной частоте.
;=========================================================
; Потребуется библиотека INPOUT32.DLL установленная в 
; каталог %systemdir% (http://www.pcports.ru/files/inpout32.rar)
;
; Lang AutoIt v3
; OC WinXP
;=========================================================
 #NoTrayIcon


    Global Const $GUI_EVENT_CLOSE        = -3
    ;-------------------------------------------------
    Global Const $BS_CENTER            = 0x0300
    Global Const $BS_MULTILINE            = 0x2000
    Global Const $BS_VCENTER            = 0x0C00
    Global Const $BS_FLAT                = 0x8000
    Global Const $SS_CENTER            = 1
    Global Const $ES_CENTER            = 1
    Global Const $BS_DEFPUSHBUTTON        = 0x0001
    ;-------------------------------------------------
    Global Const $WS_BORDER            = 0x00800000
    Global Const $WS_SYSMENU            = 0x00080000
    Global Const $WS_CAPTION            = 0x00C00000
    Global Const $WS_VISIBLE            = 0x10000000
    ;-------------------------------------------------
    

;=========================================================
 Global $IODLL = DllOpen(&#039;INPOUT32.DLL&#039;)
 If $IODLL = -1 Then MsgBox(262192,&#039;Error&#039;,&#039;Установите INPOUT32.DLL.&#039;);Exit;

 Global $iTimer = 0x0043    ;Базовый адрес системного таймера        
 Global $iTimer1 = 0x0040    ;Адрес канала 0
 Global $iTimer1 = 0x0041    ;Адрес канала 1
 Global $iTimer2 = 0x0042    ;Адрес канала 2

 Global $iSysBeep = 0x0061    ;Адрес системного динамика
 Global $a            ;Начальное состояние младшей тетрады регистра 0x61 системного динамика, когда он находится в отключенном состоянии 

 Global $isBeep = False
;---------------------------------------------------------
 Opt(&#039;GUICloseOnESC&#039;,1)
 $hGUI =    GUICreate (&#039;System Beep&#039;,135,200,-1,-1, _
        BitOr($WS_SYSMENU,$WS_CAPTION,$WS_VISIBLE))

 $hLabel1 = GUICtrlCreateLabel (&#039;Укажите частоту,гц&#039;,5,2,120,20, _
        BitOr($WS_BORDER,$SS_CENTER))

 $hInput1 = GUICtrlCreateInput (&#039;1000&#039;,5,30,120,30, _
        BitOr($WS_BORDER,$ES_CENTER))


 $hCommand1 = GUICtrlCreateButton (&#039;[beep]&#039;,5,65,120,30, _
        BitOr($BS_CENTER,$BS_DEFPUSHBUTTON))
        
 GUISetState()

    While 1
        $iMSG = GUIGetMsg()
        Select
            Case $iMSG = $GUI_EVENT_CLOSE
                ExitLoop;
            Case $iMSG = $hCommand1
                SysBeep1();
        EndSelect
    Wend
    Exit;

;[Включение/заглушка системного динамика]
;=========================================================
 Func SysBeep1()

    ;[Включить системный динамик на заданной частоте]
    ;-------------------------------------------------
    If Not $IsBeep Then

        ;[Прочитать начальное состояние системного динамика]
        ;-----------------------------------------
        $iState0 = &#039;0x&#039; &amp; Hex(Inp32($iSysBeep));

        ;[Получить частоту]
        ;-----------------------------------------
        Local $hFreq = GuiCtrlRead($hInput1);
        If StringRegExp ($hFreq, &#039;\D&#039; , 0) Then
            MsgBox(262192,&#039;Error&#039;,&#039;Укажите корректное значение частоты.&#039;);
            return
        EndIf
        
        $hFreq = &#039;0x&#039; &amp; Hex(Int(1193180/Number($hFreq)));
        
        ;[Получить младший и старший байт значения частоты счета]
        ;-----------------------------------------
        $iHByte = &#039;0x&#039; &amp; Hex(BitAnd(0x0000ff00, $hFreq));
        $iHByte = &#039;0x&#039; &amp; Hex(BitShift($iHByte,8))    ;Старший байт        

        $iLByte = &#039;0x&#039; &amp; Hex(BitAnd(0x000000ff,$hFreq))    ;Младший байт

        ;Команда записанная в базовый порт трехканального 
        ;таймера разрешает последовательную запись младшего и старшего байта
        ;начального значения счетчика в канал 2 таймера и циклический 
        ;счет в этом канале.
        ;-----------------------------------------
        Out32($iTimer,0x00b6);    

        ;При первом обращении к порту записывается младший 
        ;регистр начального значения счетчика, при втором - старший.
        ;-----------------------------------------
        Out32($iTimer2,$iLByte);
        Out32($iTimer2,$iHByte);

        ;Включение звука
        ;-----------------------------------------
        ;Запись битов 4-7 в регистр динамика запрещена, поэтому, вполне достаточно работать с битами 0-3
        $a = &#039;0x&#039; &amp; Hex(BitAnd(0x0f,$iState0))    ;Исключить старшую тетраду
        ;-----------------------------------------
        ;1=1b-нулевой бит(слева направо), разрешает счет в канале 2 таймера
        ;2=10b-первый бит, разрешает поступление импульсов с канала 2 таймера на системный динамик
        $b = $a+1+2

        Out32($iSysBeep,$b);        

        $IsBeep = True;
        GUICtrlSetData ($hCommand1, &#039;[mute]&#039;);

    Else
        Out32($iSysBeep,$a)    ;Заглушить системный динамик, восстановление исходного значения младшей тетрады регистра
        $IsBeep = False;
        GUICtrlSetData ($hCommand1, &#039;[beep]&#039;);
    EndIf
 EndFunc

;[Чтение данных порта устройства]
;=========================================================
 Func Inp32($sPort)

    SetError(0);
    $result=DllCall($IODLL, _
                &#039;short&#039;    ,&#039;Inp32&#039;, _
                &#039;short&#039;    ,$sPort);
    If Not @error Then
        return $result[0];
    Else 
        return -1;
    EndIf
 EndFunc

;[Запись данных в порт устройства]
;=========================================================
 Func Out32($sPort,$sData)

    SetError(0);
    $result=DllCall($IODLL, _
                &#039;none&#039;    ,&#039;Out32&#039;, _
                &#039;short&#039;    ,$sPort, _
                &#039;short&#039;, $sData);


    
    If Not @error Then
        return 1;
    Else 
        return -1;
    EndIf
 EndFunc
;=========================================================
;pltrgst</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2011-06-13T15:27:15Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5900&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[MSDN Library : Конвертирование файлов справки формата HXS в CHM]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5842&amp;action=new" />
			<summary type="html"><![CDATA[<p>Утилита <strong><a href="http://www.jsware.net/jsware/hxs2chm.php5">Convert HXS Files to CHM Files</a></strong> будет полезна тем кто пользуется справочными файлами поставляемыми в комплекте с Microsoft Visual Studio - MSDN Library. Она позволяет конвертировать их из формата файлов с расширением *.hxs в файлы *.chm и делает это достаточно удобным способом.</p><p>Вам предоставляется три различных способа, каждый из которых делает конвертирование более гибким по-своему:</p><p><strong>1.</strong> Вам необходимо будет установить HTML Help Workshop и 7-Zip если их нет и отредактировать в файле <em><strong>ConvertToCHM2.vbs</strong></em> строки указываюшие на путь их установки, если у вас он иной:<br />&quot;C:\Program Files\HTML Help Workshop\hhc.exe&quot; , &quot;C:\Program Files\7-Zip\7z.exe&quot; .<br />Конвертирование происходит с помощью перетягивания папки с файлами которые вы хотите конвертировать на непосредственно сам сриптовый файл, во время работы срипт создаст временную папку в перетаскиваемой папке, необходимую для его работы и извлеечния файлов справки, а затем удалит её и оставит файлы аналогичные файлам с расширением hxs, но уже в формате chm.</p><p><strong>2.</strong> Использовать утилиту - файл <em><strong>HXSConv.hta</strong></em>, которая покажет веб-страницу с настройками в окне и позволит в ручном режиме выбрать файлы для конвертации, указать путь HTML Help Workshop и 7-Zip, а так же изменить таблицу стилей применимую к результируюшему chm файлу справки.</p><p><span class="postimg"><img src="http://s40.radikal.ru/i087/1105/a8/7e3e9930d135.gif" alt="http://s40.radikal.ru/i087/1105/a8/7e3e9930d135.gif" /></span></p><p><strong>3.</strong> Этот способ похож на первый и позволяет вместо chm файла создавать что-то похожее по содержимому на оффлайн версию веб-сайта, после скрипт генерирует HTA просмотрщик(в виде веб-страницы) для извлечённых файлов помощи.</p><p>Более подробные сведения вы можете прочитать на домашней странице&nbsp; утилиты: <strong><a href="http://www.jsware.net/jsware/hxs2chm.php5">Convert HXS Files to CHM Files</a></strong> , мной не были опробованы все возможности предоставленных утилит, но могу подтвердить работоспособность первого способа. См. файл <em><strong>Create WebHelp From HXS.vbs</strong></em></p><p>Кроме вышеизложенного вы можете <span class="bbu">просматривать оригинальные hxs файлы без использования Microsoft Visual Studio</span>, с помошью альтернативного просмотрщика <strong><a href="http://www.helpware.net/mshelp2/h2viewer.htm">H2Viewer</a></strong>(правда он требует наличия установленного MS Help 2.x Runtime), а так же возможно извлечение только необходимых вам файлов справки из установочного пакета <a href="http://ru.wikipedia.org/wiki/Windows_Installer">MSI</a> содержащегося в образе подходящего для вас <strong><a href="http://msdn.microsoft.com/ru-ru/windows/bb980924">Пакета Windows SDK</a></strong>&nbsp; с помощью <strong><a href="http://www.jsware.net/jsware/msicode.php5">программного обеспечения</a></strong></p><p>Если мои объяснения покажутся&nbsp; вам невразумительными вы можете посмотреть <span class="bbu"><strong><a href="http://www.webmasterkb.com/Uwe/Forum.aspx/vbscript/23802/WMI-class">ссылку первоисточник</a></strong></span> и прочесть более подробно на английском языке.</p><p>[color=ff00ff]Несколько полезных уже переконвертированных файлов:[/color]</p><p><strong><a href="http://onemove.ru/51383/">dllproc.chm - DLLs, Processes, and Threads</a></strong></p><p><strong><a href="http://onemove.ru/51384/">gdi.chm - Windows GDI</a></strong></p><p><strong><a href="http://onemove.ru/51385/">GDICpp.chm - GDI+</a></strong></p><p><strong><a href="http://onemove.ru/51386/">memory.chm - Memory Management</a></strong></p><p><strong><a href="http://onemove.ru/51388/">shellcc.chm - Windows Controls</a></strong></p>]]></summary>
			<author>
				<name><![CDATA[kirtech]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26525</uri>
			</author>
			<updated>2011-05-28T01:10:51Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5842&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[1Cv8: работаем с Системой Компоновки Данных (СКД)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5752&amp;action=new" />
			<summary type="html"><![CDATA[<p>О чём вообще речь: <a href="http://v8.1c.ru/overview/datacomposition.htm">Система компоновки данных</a>.</p><p>Пример отчёта (во вложении поста) с довольно простым макетом СКД и минимумом кода.<br />Демонстрация работы с произвольной Таблицей значений как источником данных.</p><p>Пример потребует наличие в вашей конфигурации только иерархического справочника &quot;Контрагенты&quot; (он есть практически на 100% в любой конфигурации). В коде создаётся Таблица значений с колонками &quot;Контрагент&quot; и &quot;Сумма&quot;, первая колонка которой заполняется из справочника, а вторая — случайными данными. В макете СКД к этой Таблице значений подцепляется запрос к справочнику Контрагентов и всё это добро выводится как иерархический отчёт. Всего лишь 40 строк кода + простой макет СКД, который создаётся в графическом режиме за десятки минут.</p><p>Такой метод позволит свободно делать довольно &quot;хитрые&quot; отчеты, т.к. в Таблице значений могут быть любые данные, её удобно обойти в коде в цикле, поместив туда что угодно (вплоть до данных из внешних программ, подкачиваемых тут же, налету, из каких-то COM-объектов или файлов) и т.п.</p>]]></summary>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2011-04-26T08:40:11Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5752&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[1Cv8: чтение больших текстовых файлов (csv)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5664&amp;action=new" />
			<summary type="html"><![CDATA[<p>Сделано по этому принципу: <a href="http://forum.script-coding.com/viewtopic.php?id=1322">VBScript: работа с большими текстовыми файлами</a>.<br />Функция читает файл и возвращает ТаблицуЗначений с данными файла.<br /></p><div class="codebox"><pre><code>Функция ПрочитатьCSV(Папка, ИмяФайла, КолПолей)
    // Параметры:
    // &quot;Папка&quot; - путь к файлу без имени файла с завершающим слешем,
    // &quot;ИмяФайла&quot; - имя файла,
    // &quot;КолПолей&quot; - количество колонок (число).
    // Функция возвращает ТаблицуЗначений с данными файла.
    
    Текст = &quot;[&quot; + ИмяФайла + &quot;]
    |ColNameHeader=False
    |Format=Delimited(;)
    |TextDelimiter=none
    |CharacterSet=ANSI
    |&quot;;
    Для ы = 1 По КолПолей Цикл
        Текст = Текст + &quot;Col&quot; + ы + &quot;=Field&quot; + ы + &quot; Text&quot; + Символы.ПС;
    КонецЦикла;
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(Текст);
    ТекстДок.Записать(Папка + &quot;Schema.ini&quot;);
    
    objRec = Новый COMОбъект(&quot;ADODB.Recordset&quot;);
    strQuery = &quot;SELECT * FROM [&quot; + ИмяФайла + &quot;]&quot;;
    strConn = &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; + Папка + &quot;;Extended Properties=&quot;&quot;text;&quot;&quot;&quot;;
    adOpenStatic = 3;
    adLockOptimistic = 3;
    adCmdText = 1;
    ТаблЗнач = Новый ТаблицаЗначений;
    Для ы = 1 По КолПолей Цикл
        ТаблЗнач.Колонки.Добавить();
    КонецЦикла;
    
    objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
    КолСтрок = objRec.RecordCount;
    Ном = 1;
    Пока Не objRec.EOF Цикл
        Если Ном % 500 = 0 Тогда
            Состояние(ИмяФайла + &quot; &quot; + Ном + &quot; из &quot; + КолСтрок);
        КонецЕсли;
        НовСтр = ТаблЗнач.Добавить();
        Для i=0 По objRec.Fields.Count-1 Цикл
            НовСтр[i] = Строка(objRec.Fields(i).Value);
        КонецЦикла;
        objRec.MoveNext();
        Ном = Ном + 1;
    КонецЦикла;
    objRec.Close();
    Возврат ТаблЗнач;
КонецФункции</code></pre></div><p>Помещение прочитанных строк в ТаблицуЗначений сделано &quot;в лоб&quot; и достаточно хорошо пожирает память (как сделать лучше, пока не знаю). Сама выборка из файла работает очень быстро. Файл размером 46 МБ (31 поле, 350 тыс. строк) был помещён в ТаблицуЗначений за порядка 12 минут (WinXP SP3, Pentium(R) Dual-Core CPU E5300 2.60 ГГц, 988 Mб ОЗУ).</p>]]></summary>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2011-03-29T07:14:48Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5664&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AutoIt: исполнение кода посредством скомпилированного файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5415&amp;action=new" />
			<summary type="html"><![CDATA[<p>Если у Вас не установлен AutoIt, это ещё не значит, что у Вас его нет <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />. Существует некоторое число широко распространённых программ, созданных при помощи AutoIt, которые, возможно, у Вас уже установлены, например, тот же <a href="http://www.legroom.net/software/uniextract">Universal Extractor</a>.</p><p>Дело в том, что интерпретатор кода встраивается в <em>каждый</em> скомпилированный скрипт AutoIt. И, если только исходный скрипт не был скомпилирован с директивой:<br /></p><div class="codebox"><pre><code>#NoAutoIt3Execute</code></pre></div><p>этот интерпретатор может быть использован для исполнения другого кода AutoIt.</p><p>Исполнения кода можно добиться двумя способами:<br /> * одной строки кода — посредством параметра «/AutoIt3ExecuteLine», например:<br /></p><div class="codebox"><pre><code>&quot;%ProgramFiles%\Universal Extractor\UniExtract.exe&quot; /AutoIt3ExecuteLine &quot;MsgBox(0, &#039;Hello&#039;, &#039;World&#039;)&quot;</code></pre></div><p>* целого скрипта — посредством параметра «/AutoIt3ExecuteScript», например:<br /></p><div class="codebox"><pre><code>&quot;%ProgramFiles%\Universal Extractor\UniExtract.exe&quot; /AutoIt3ExecuteScript &quot;c:\Temp\SomeScript.au3&quot;</code></pre></div><p>где «c:\Temp\SomeScript.au3»:<br /></p><div class="codebox"><pre><code>MsgBox(0, &#039;Hello&#039;, &#039;World&#039;)</code></pre></div><p><em>Источник: <a href="http://azjio.ucoz.ru/publ/skripty_autoit3/skripty_dlja_windowsxp/uznat_versiju_autoit3_v_skompilirvannom_exe/5-1-0-13">Узнать версию AutoIt3 в скомпилированном EXE - Скрипты для WindowsXP - Скрипты AutoIt3 - Каталог статей - Cайт AZJIO</a></em></p>]]></summary>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2011-01-24T01:41:46Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5415&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AutoIt v3: Автоматическое отключения компьютера после простоя]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5300&amp;action=new" />
			<summary type="html"><![CDATA[<p>Смысл идеи прост - подмена заставки Windows скомпиллированным скриптом-псевдозаставкой, который автоматически запустится после заданного интервала простоя(в соответствии с настройками заставки) и выполнит требуемые операции, например выключит компьютер.</p><p>-----------------------------------<br /><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Скрипт автоматического выключения компьютера через заданный промежуток времени после простоя. После компилляции скрипта scrpoff.au3 в исполняемый EXE, следует изменить расширение EXE на SCR, после чего установить полученную псевдозаставку через пункт &quot;Установить&quot; контекстного меню Проводника, что равносильно команде rundll32.exe desk.cpl,InstallScreenSaver %l. Далее следует настроить задержку включения псевдозаставки в свойствах &quot;Экран&quot; - &quot;Заставка&quot;. После автоматического запуска, скрипт-псевдозаставка начнет отсчет дополнительного простоя в минутах (простой указан в файле scrpoff.ini, который расположен рядом со скриптом), по истечении которого компьютер будет автоматически выключен. Чтобы прервать исполнение псевдозаставки и остановить отсчет простоя достаточно сдвинуть курсор мыши.</p><p>Таким образом суммарный интервал простоя, по прошествии которого компьютер будет выключен равен задержке включения псевдозаставки плюс интервалу простоя, указанному в файле scrpoff.ini</p><p><strong>scrpoff.au3</strong>:<br /></p><div class="codebox"><pre><code>#NoTrayIcon;
 ;----------------------------------------------------------------------
 Const $PWR_FORCE = 4        ;Принудительное завершение процессов
 Const $PWR_POWER_OFF = 8    ;Выключение питания

 Const $txt = &#039; Идет подготовка к выключению компьютера...&#039; &amp; @CRLF &amp; &#039;Для отмены переместите курсор мыши...&#039;;
 
 $MyIni = @ScriptDir &amp; &#039;\scrpoff.ini&#039;;

 ;/Задержка выключения в минутах читается из ini файла/
 $MaxTimeout = Int(IniRead ($MyIni, &#039;shutdown&#039;, &#039;timeout&#039;, 10));
 ;----------------------------------------------------------------------
 Sleep(100);
 SplashTextOn(&#039;&#039;, $txt, 500, 100, -1, -1, 1+32, &#039;Verdana&#039;, 10);
 Sleep(100);

 ;/Цикл дополнительного простоя/
 ;----------------------------------------------------------------------
 $StartTimer = TimerInit();
 Sleep(100);
 $MPos2 = MouseGetPos();

 While 1
     ;--------------------------------------------------------------
     $Diff = Int(TimerDiff($StartTimer)/(6e+4));
     If $Diff&gt;$MaxTimeout Then ShutdownMachine(); ExitLoop;
     ;--------------------------------------------------------------
     $MPos1 = MouseGetPos();
     If BitXor($MPos1[0],$MPos2[0]) Or BitXor($MPos1[1],$MPos2[1]) Then ExitLoop;
     Sleep(200);
     $MPos2 = MouseGetPos();
     If BitXor($MPos1[0],$MPos2[0]) Or BitXor($MPos1[1],$MPos2[1]) Then ExitLoop;
     ;--------------------------------------------------------------
 Wend 
 Exit;
 ;----------------------------------------------------------------------

 ;[Выключение ПК]
 ;----------------------------------------------------------------------
 Func ShutdownMachine()
     SplashOff();
    Sleep(300);
    Shutdown ($PWR_FORCE + $PWR_POWER_OFF);
 EndFunc
 ;----------------------------------------------------------------------
 ;pltrgst 2010</code></pre></div><p><strong>scrpoff.ini</strong>(расположен рядом с откомпиллированным скриптом):<br /></p><div class="codebox"><pre><code>;Интервал простоя после запуска псевдозаставки, минут. 
;По истечении интервала простоя компьютер будет выключен.
[shutdown]
timeout = 1</code></pre></div><p>/Настройки параметров питания/<br />Переход компьютера в ждущий/спящий режимы должен быть запрещен.</p><p>Отключение монитора и жестких дисков допустимо раньше, нежели включение псевдозаставки.</p><p>Lang. AutoIt v3<br />Тестировалось на OC WinMe<br />-----------------------------------</p>]]></summary>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2010-12-25T13:11:07Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5300&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[1Cv8: Бухгалтерия предприятия, редакция 2.0]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=5154&amp;action=new" />
			<summary type="html"><![CDATA[<p>Буду собирать в этой теме некоторую полезную информацию, касающуюся поддержки и настройки этого популярного продукта <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p><p><span style="color: blue"><strong>Справочник «Внешние&nbsp; обработки, печатные формы, обработки по заполнению табличных частей»</strong></span></p><p>Справочник содержит список произвольных обработок, отчётов, дополнительных печатных форм и обработок для заполнения табличных частей объектов.</p><p>Меню программы «Сервис» - «Дополнительные отчеты и обработки» имеет четыре подпункта («Дополнительные внешние обработки», «Дополнительные внешние отчеты», «Дополнительные внешние обработки табличных частей», «Дополнительные внешние печатные формы»), каждый из которых открывает один и тот же справочник «Внешние обработки», но с различным отбором элементов.</p><p>Справочник позволяет загрузить и хранить файлы внешних отчётов и обработок в виде двоичных данных. Таким образом, загруженные в справочник файлы будут являться для 1С:Предприятия обычными данными пользователя и будут храниться непосредственно в информационной базе. В любой момент ранее загруженный в справочник файл внешнего отчёта или обработки можно сохранить на диск, изменить средствами Конфигуратора, а затем загрузить обратно.</p><p>Реализованный в конфигурации механизм работы с внешними отчётами, обработками и внешними печатными формами (частью которого и является этот справочник) позволяет достаточно существенно расширять и модифицировать функционал программы, не затрагивая структуру конфигурации, что может существенно облегчить регулярное обновление конфигурации стандартным способом.</p><p>Для внешних отчетов, обработок и печатных форм имеется возможность назначать права доступа, если в конфигурации включено использование ограничения прав доступа на уровне записей (меню «Сервис» - «Настройка программы», вкладка «Права доступа»).</p><p><strong>Дополнительные внешние отчёты и обработки</strong></p><p>Для произвольных отчётов и обработок достаточно только загрузки внешней обработки, которая находится на диске, в реквизит элемента справочника. Можно использовать любую внешнюю обработку с определенной основной формой.</p><p>Двойной щелчок в списке справочника внешних обработок приводит к непосредственному запуску внешней обработки или отчёта. Для замены, выгрузки файла обработки или отчёта на диск или изменения его свойств следует использовать стандартную команду справочника «Изменить».</p><p><strong>Дополнительные внешние печатные формы</strong></p><p>Внешняя печатная форма представляет из себя обычную внешнюю обработку 1С:Предприятия, удовлетворяющую некоторым специальным критериям.</p><p>Механизм внешних печатных форм позволяет:<br />• указать список дополнительных параметров, которые будут передаваться внешней печатной форме при запуске;<br />• назначить список объектов (документов/справочников конфигурации), для которых данная печатная форма используется;<br />• задать для каждого объекта (документа/справочника конфигурации) несколько условий, при выполнении которых печатная форма становится доступной для использования;<br />• заменять встроенные печатные формы внешними, внешне незаметно для конечного пользователя.</p><p>Корректно зарегистрированная внешняя печатная форма будет выводиться в общем списке печатных форм объекта, вызываемого по кнопке «Печать». При этом форма будет помещена в конец этого списка и отделена разделителем. Если подключаемая печатная форма заменяет стандартную, то она появляется в списке стандартных печатных форм, до разделителя.</p><p>Табличная часть на форме элемента справочника внешних печатных форм содержит следующие реквизиты:<br />• «Представление объекта» — здесь выбирается вид документа/справочника конфигурации, для которого используется данная печатная форма;<br />• «Представление кнопки»&nbsp; — здесь указывается текст команды меню, который будет отображаться в списке при нажатии кнопки «Печать»;<br />• «Отбор» — здесь настраивается список условий, при выполнении которых печатная форма становится доступной для использования, в терминах реквизитов объекта; например, можно сделать печатную форму доступной, только если документ проведён и т.п.;<br />• «Файл печатной формы» — здесь можно загрузить отдельный файл внешней обработки, который будет использован вместо загруженного в шапке (опционально);<br />• «Заменяемая печатная форма» — здесь выбирается заменяемая встроенная печатная форма объекта, если это необходимо;<br />• «Параметры обработки» — здесь настраивается список параметров (имя-значение), которые будут переданы внешней печатной форме при запуске, если это необходимо; в коде внешней печатной формы каждый такой параметр будет доступен как «ДополнительныеПараметры.Свойство(&quot;&lt;ИмяПараметра&gt;&quot;, Значение);».</p><p>Требования к обработке внешней печатной формы:<br />• реквизит обработки «СсылкаНаОбъект», в который при вызове будет передана ссылка на объект, для которого необходимо выполнить печать;<br />• функция «Печать()», объявленная с ключевым словом «Экспорт», без параметров,&nbsp; возвращающая табличный документ; в принципе, эта функция может содержать любой код и не возвращать табличный документ; при вызове внешней печатной формы запускается именно эта функция;<br />• Необязательный реквизит обработки «ДополнительныеПараметры» произвольного типа, в который будут передаваться дополнительные параметры примитивного типа в виде структуры;<br />• если обработка имеет в своем составе макет «Параметры_Авторегистрации»,&nbsp; он может быть использован для автоматического заполнения принадлежности печатной формы в табличной части справочника внешних обработок в момент загрузки файла обработки; в макете должна быть колонка, содержащая полные имена метаданных в формате «Документы.ИмяДокумента»;.</p><p><strong>Дополнительные внешние обработки табличных частей</strong></p><p>Табличная часть на форме элемента справочника внешних обработок табличных частей содержит следующие реквизиты:<br />• «Представление объекта» — здесь выбирается вид документа/справочника конфигурации, для которого используется данная обработка;<br />• «Табличная часть» — здесь выбирается табличная часть объекта, для которой используется данная обработка;<br />• «Представление кнопки»&nbsp; — здесь указывается текст команды меню, который будет отображаться в списке при нажатии кнопки «Заполнить»;<br />• «Параметры обработки» — здесь настраивается список параметров (имя-значение), которые будут переданы внешней печатной форме при запуске, если это необходимо; в коде внешней печатной формы каждый такой параметр будет доступен как «ДополнительныеПараметры.Свойство(&quot;&lt;ИмяПараметра&gt;&quot;, Значение);»<br />Требования к внешней обработке табличной части:<br />• Процедура «Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта)»,&nbsp; объявленная с ключевым словом «Экспорт», где:&nbsp; <br />&nbsp; &nbsp; &nbsp; Объект — ДокументОбъект или СправочникОбъект, откуда был произведён вызов обработки;<br />&nbsp; &nbsp; &nbsp; ИмяТабличнойЧасти&nbsp; — строка, имя табличной части, для которой вызвана обработка;<br />&nbsp; &nbsp; &nbsp; ТабличноеПолеОбъекта&nbsp; — элемент формы, табличное поле формы, для которого вызвана обработка;<br />• Необязательный реквизит обработки «ДополнительныеПараметры» произвольного типа, в который будут передаваться дополнительные параметры примитивного типа в виде структуры;<br />• если обработка имеет в своем составе макет «Параметры_Авторегистрации»,&nbsp; он может быть использован для автоматического заполнения принадлежности обработки в табличной части справочника внешних обработок в момент загрузки файла обработки; в макете должно быть две колонки, содержащие соответственно полные имена метаданных в формате «Документы.ИмяДокумента» и имена их табличных частей;.</p>]]></summary>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2010-11-11T07:50:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=5154&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[LangMF 8.0: работа с HTTP с помощью Winsock Control]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=4935&amp;action=new" />
			<summary type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>LangMF-скрипт предназначен для работы по протоколу HTTP, с помощью объекта MSWinsock.Winsock Control и позволяет отображать заголовки ответа удаленного сервера, а также запрашивать с удаленного сервера небольшие файлы и страницы для сохранения на локальном диске.</p><p>Вызов меню &quot;Добавить/обновить заголовок запроса&quot; читает дополнительные заголовочные параметры HTTP-запроса из текстового файла httphead.dat. Чтобы закомментировать строку параметра заголовка, в этом файле поставьте знак &quot;!&quot; в начале строки. </p><p>При указании имени хоста в поле Host name/Host IP или в параметре Host HTTP-заголовка нужно опускать префикс протокола, т.е правильный вариант - www.hostname.ru, вместо http://www.hostname.ru/</p><p>Скрипт поддерживает только один сокет в реальном режиме.<br />------------------------------------<br />Горячие клавиши:<br />Ctrl+Ins - отправка подготовленного запроса<br />Esc - отмена запроса<br />------------------------------------<br /> Потребуется установленный <a href="http://www.script-coding.com/LangMF.html">LangMF 8.0</a><br /> <a href="http://atombyte.com/prog.htm?oper=katalog&amp;id=3&amp;vi=1">http://atombyte.com/prog.htm?oper=katal … 3&amp;vi=1</a> </p><p> OC WinMe/XP<br />------------------------------------</p>]]></summary>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2010-09-13T16:12:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=4935&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBA: Динамический вызов WinAPI в Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?id=4870&amp;action=new" />
			<summary type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Необязательно декларировать вызовы WinAPI в VBA (на примере Excel) с помощью Declare Function, можно вызывать WinAPI в VBA динамически, используя передачу управления коду с помощью функций CallWindowProc, либо EnumWindows: </p><p>1) Модуль <strong>DLLCALL_CallWindowProc.bas</strong>:<br /></p><div class="codebox"><pre><code>
&#039;
&#039; Вызов WINAPI в EXCEL через CallWindowProcA
&#039;
Option Explicit

Private Declare Function CallWindowProc Lib &quot;user32.dll&quot; Alias &quot;CallWindowProcA&quot; (ByVal lpPrevWndFunc _
As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function FreeLibrary Lib &quot;kernel32.dll&quot; (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib &quot;kernel32.dll&quot; (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function LoadLibrary Lib &quot;kernel32.dll&quot; Alias &quot;LoadLibraryA&quot; (ByVal lpLibFileName As String) As Long

Private Declare Sub MoveMem Lib &quot;kernel32&quot; Alias &quot;RtlMoveMemory&quot; (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private Const MAX_PARAMS As Long = 10

&#039; Именованная коллекция адресов функций
Private ADDR As New Collection

Private Type POINT
x As Long
y As Long
End Type

Public sBuf As String

&#039;//Вызов WINAPI//
Public Function CallFunction(ByVal LibName As String, ByVal FuncName As String, ParamArray p()) As Long

    Dim i As Long, hMem As Long, ofs As Long
    Dim hLib As Long
    Dim hAPI_Address As Long
    Dim pMem() As Byte
    Dim arg As Long
    
  
    &#039; Найти адрес WINAPI
    &#039;-------------------------------------------------
    
    &#039; Извлечь адрес из коллекции, если таковой имется
    On Error GoTo GET_ADDR
    hAPI_Address = ADDR.Item(LibName &amp; &quot;_&quot; &amp; FuncName)
    &#039;MsgBox &quot;Извлечен адрес повторного вызова.&quot;, vbSystemModal + vbExclamation, &quot;Reply&quot;
    On Error GoTo 0
    GoTo CALL_DLL
    
GET_ADDR:

    hLib = LoadLibrary(LibName)
    If hLib = 0 Then Err.Raise 5: Exit Function
    
    hAPI_Address = GetProcAddress(hLib, FuncName)
    If hAPI_Address = 0 Then Err.Raise 5: Exit Function

    &#039; Добавить адрес в коллекцию
    ADDR.Add Item:=hAPI_Address, Key:=LibName &amp; &quot;_&quot; &amp; FuncName

CALL_DLL:
    
    &#039; Выделить и заполнить память
    &#039;-------------------------------------------------
    ReDim pMem(0 To 5 * MAX_PARAMS + 5 + 3)
    hMem = VarPtr(pMem(0))
    ofs = 0
    
    &#039; Обратный порядок записи в стек для stdcall
    For i = UBound(p) To LBound(p) Step -1
        
        &#039; Команда PUSH
        pMem(ofs) = &amp;H68 &#039;asmPUSH_imm32
        ofs = ofs + 1
        
        &#039; Аргумент
        If VarType(p(i)) = vbString Then
            arg = CLng(StrPtr(p(i)))
        Else
            arg = CLng(p(i))
        End If
        SetDWord pMem(), ofs, arg
        ofs = ofs + 4
        
    Next
    
    &#039; Вызов функции
    pMem(ofs) = &amp;HE8 &#039; asmCALL_rel32
    ofs = ofs + 1
    
    SetDWord pMem(), ofs, CLng(hAPI_Address - hMem - ofs - 4)
    ofs = ofs + 4
    
    &#039; Возврат с очисткой 0x0010 (16) байт стека
    &#039; ret 0x0010 - ret imm16 т.е. C2 1000, обратный порядок записи байт
    pMem(ofs) = &amp;HC2
    ofs = ofs + 1
    
    SetWord pMem(), ofs, &amp;H10
    ofs = ofs + 2
    
    CallFunction = CallWindowProc(hMem, 0, 0, 0, 0)
    
End Function

&#039;//Заполнить память двойным словом (Long)//
Private Sub SetDWord(ByRef bMemArr() As Byte, ByVal i As Long, ByVal iData As Long)
    
    Dim k As Integer
    For k = 0 To 3
        bMemArr(i + k) = iData And &amp;HFF
        iData = Int(iData / &amp;H100)  &#039; Сдвиг вправо на 8 бит равносилен делению на 2^8
    Next
    
End Sub

&#039;//Заполнить память словом (Integer)//
Private Sub SetWord(ByRef bMemArr() As Byte, ByVal i As Long, ByVal iData As Integer)
    
        bMemArr(i) = iData And &amp;HFF
        iData = Int(iData / &amp;H100)
        
        bMemArr(i + 1) = iData And &amp;HFF
        
End Sub

&#039;//Строковый буфер в области VBA//
Public Function GetStrBuf() As String
    GetStrBuf = sBuf
End Function
Public Function SetStrBuf(Lenght As Long) As Long
    sBuf = String(Lenght, Chr(0))
    SetStrBuf = StrPtr(sBuf)
End Function

&#039;//Протестировать вызов WINAPI//
Public Sub Load()

    Dim pid, res As Long
    Dim pt As POINT
    Dim sTempPath As String
    
    sTempPath = String(256, Chr(0))
    &#039;-------------------------
    pid = CallFunction(&quot;kernel32.dll&quot;, &quot;GetCurrentProcessId&quot;)
    MsgBox &quot;Excel PID:&quot; &amp; Chr(32) &amp; pid, vbInformation + vbOKOnly + vbSystemModal
    
    &#039;-------------------------
    res = CallFunction(&quot;user32.dll&quot;, &quot;MessageBoxA&quot;, 0, StrConv(&quot;Некоторое сообщение...&quot;, vbFromUnicode), StrConv(&quot;Заголовок&quot;, vbFromUnicode), vbInformation + vbSystemModal)
    
    &#039;-------------------------
    res = CallFunction(&quot;user32.dll&quot;, &quot;GetCursorPos&quot;, VarPtr(pt))
    MsgBox &quot;Положение курсора: &quot; &amp; pt.x &amp; &quot;__&quot; &amp; pt.y, vbInformation + vbSystemModal
    
    &#039;-------------------------
    res = CallFunction(&quot;kernel32.dll&quot;, &quot;GetTempPathW&quot;, Len(sTempPath), StrPtr(sTempPath))
    MsgBox &quot;Temp Path:&quot; &amp; Chr(32) &amp; sTempPath, vbInformation + vbOKOnly + vbSystemModal
    
End Sub
</code></pre></div><p>2) Модуль <strong>DLLCALL_EnumWindows.bas</strong>:<br />EnumWindows передает управление CALLBACK функции, в роли которой и выступает заданная WinAPI, которая вызывается однократно.<br /></p><div class="codebox"><pre><code>
&#039;
&#039; Вызов WINAPI в EXCEL через EnumWindows. WinAPI выступает в роли CALLBACK, которой и передается управление
&#039;
Option Explicit

Private Declare Function EnumWindows Lib &quot;user32&quot; (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Private Declare Function CallWindowProc Lib &quot;user32.dll&quot; Alias &quot;CallWindowProcA&quot; (ByVal lpPrevWndFunc _
As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function FreeLibrary Lib &quot;kernel32.dll&quot; (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib &quot;kernel32.dll&quot; (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function LoadLibrary Lib &quot;kernel32.dll&quot; Alias &quot;LoadLibraryA&quot; (ByVal lpLibFileName As String) As Long
Private Declare Function LocalAlloc Lib &quot;kernel32&quot; (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function LocalFree Lib &quot;kernel32&quot; (ByVal hMem As Long) As Long
Private Declare Function LocalLock Lib &quot;kernel32&quot; (ByVal hMem As Long) As Long
Private Declare Function LocalUnlock Lib &quot;kernel32&quot; (ByVal hMem As Long) As Boolean

Private Declare Sub MoveMem Lib &quot;kernel32&quot; Alias &quot;RtlMoveMemory&quot; (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private Const LMEM_FIXED = &amp;H0
Private Const LMEM_MOVEABLE = &amp;H2
Private Const LMEM_NOCOMPACT = &amp;H10
Private Const LMEM_NODISCARD = &amp;H20
Private Const LMEM_ZEROINIT = &amp;H40
Private Const LMEM_MODIFY = &amp;H80
Private Const LMEM_DISCARDABLE = &amp;HF00
Private Const LMEM_VALID_FLAGS = &amp;HF72
Private Const LMEM_INVALID_HANDLE = &amp;H8000

Private Const MAX_PARAMS As Long = 10

&#039; Именованная коллекция адресов функций
Private ADDR As New Collection

Private Type POINT
x As Long
y As Long
End Type

&#039;//Вызов WINAPI//
Public Function CallFunction(ByVal LibName As String, ByVal FuncName As String, ParamArray p()) As Long

    Dim i As Long, hMem As Long
    Dim ofs As Long
    Dim hLib As Long
    Dim hAPI_Address As Long
    Dim pMem() As Byte
    Dim arg As Long
    Dim bRes As Long
    
  
    &#039; Найти адрес WINAPI
    &#039;-------------------------------------------------
    
    &#039; Извлечь адрес из коллекции, если таковой имется
    On Error GoTo GET_ADDR
    
    hAPI_Address = ADDR.Item(LibName &amp; &quot;_&quot; &amp; FuncName)
    &#039;MsgBox &quot;Извлечен адрес повторного вызова.&quot;, vbSystemModal + vbExclamation, &quot;Reply&quot;
    On Error GoTo 0
    GoTo CALL_DLL
    
GET_ADDR:

    hLib = LoadLibrary(LibName)
    If hLib = 0 Then Err.Raise 5: Exit Function
    
    hAPI_Address = GetProcAddress(hLib, FuncName)
    If hAPI_Address = 0 Then Err.Raise 5: Exit Function
    
    &#039; Добавить адрес в коллекцию
    ADDR.Add Item:=hAPI_Address, Key:=LibName &amp; &quot;_&quot; &amp; FuncName

CALL_DLL:
    
    &#039; Выделить и заполнить память
    &#039;-------------------------------------------------
    hMem = LocalAlloc(LMEM_ZEROINIT + LMEM_FIXED, 5 * MAX_PARAMS + 5 + 5 + 5 + 3)
    If hMem = 0 Then Err.Raise 7: Exit Function
    
    hMem = LocalLock(hMem)
    ofs = hMem
    
    &#039; Обратный порядок записи в стек для stdcall
    For i = UBound(p) To LBound(p) Step -1
        
        MoveMem ByVal ofs, &amp;H68, 1 &#039;asmPUSH_imm32
        ofs = ofs + 1
      
        &#039; Аргумент
        If VarType(p(i)) = vbString Then
            arg = CLng(StrPtr(p(i)))
        Else
            arg = CLng(p(i))
        End If
        
        MoveMem ByVal ofs, arg, 4
        ofs = ofs + 4
    Next
    
    &#039; Вызов функции (относительный)
    MoveMem ByVal ofs, &amp;HE8, 1 &#039; asmCALL_rel32
    ofs = ofs + 1
    
    MoveMem ByVal ofs, CLng(hAPI_Address - ofs - 4), 4
    ofs = ofs + 4
        
    &#039; Записать результат API(eax) в возврат функции CallFunction
    &#039; mov [ptr],eax
    CallFunction = CLng(0)
    
    MoveMem ByVal ofs, &amp;HA3, 1
    ofs = ofs + 1
    
    MoveMem ByVal ofs, VarPtr(CallFunction), 4
    ofs = ofs + 4
    
    &#039; Результат работы EnumWindows = false
    &#039; mov eax,0
    MoveMem ByVal ofs, &amp;HB8, 1
    ofs = ofs + 1
    ofs = ofs + 4
    
    &#039;Возврат с удалением 8 байт из стека
    &#039;ret 0008
    MoveMem ByVal ofs, &amp;HC2, 1
    ofs = ofs + 1
    
    MoveMem ByVal ofs, &amp;H8, 2
    ofs = ofs + 2
    
    &#039; Передать управление через EnumWindows CALLBACK
    bRes = EnumWindows(hMem, 0)
    
    LocalUnlock hMem
    LocalFree hMem
   
End Function

&#039;//Строковый буфер в области VBA//
Public Function GetStrBuf() As String
    GetStrBuf = sBuf
End Function
Public Function SetStrBuf(Lenght As Long) As Long
    sBuf = String(Lenght, Chr(0))
    SetStrBuf = StrPtr(sBuf)
End Function

&#039;//Протестировать вызов WINAPI//
Public Sub Load()

    Dim pid, res As Long
    Dim pt As POINT
    Dim sTempPath As String
    
    sTempPath = String(256, Chr(0))
    &#039;-------------------------
    pid = CallFunction(&quot;kernel32.dll&quot;, &quot;GetCurrentProcessId&quot;)
    MsgBox &quot;Excel PID:&quot; &amp; Chr(32) &amp; pid, vbInformation + vbOKOnly + vbSystemModal
    
    &#039;-------------------------
    res = CallFunction(&quot;user32.dll&quot;, &quot;MessageBoxA&quot;, 0, StrConv(&quot;Некоторое сообщение...&quot;, vbFromUnicode), StrConv(&quot;Заголовок&quot;, vbFromUnicode), vbInformation + vbSystemModal)
    
    &#039;-------------------------
    res = CallFunction(&quot;user32.dll&quot;, &quot;GetCursorPos&quot;, VarPtr(pt))
    MsgBox &quot;Положение курсора: &quot; &amp; pt.x &amp; &quot;__&quot; &amp; pt.y, vbInformation + vbSystemModal
    
    &#039;-------------------------
    res = CallFunction(&quot;kernel32.dll&quot;, &quot;GetTempPathW&quot;, Len(sTempPath), StrPtr(sTempPath))
    MsgBox &quot;Temp Path:&quot; &amp; Chr(32) &amp; sTempPath, vbInformation + vbOKOnly + vbSystemModal
    
End Sub
</code></pre></div><br /><br /><p>Можно вызывать WinAPI из VBScript, используя Excel как сервер автоматизации, понадобится xlsm-документ(здесь - &quot;DLL_CALL.xlsm&quot;) расположенный рядом со скриптом и содержащий модули <strong>DLLCALL_CallWindowProc.bas</strong> и <strong>DLLCALL_EnumWindows.bas</strong>:</p><p><strong>VBScript</strong>:<br /></p><div class="codebox"><pre><code>
 
 &#039;
 &#039; Вызов WinAPI из VbScript, используя Excel как сервер автоматизации
 &#039; VBScript
 &#039;
 &#039;
 
 Option Explicit

 Dim objExcel, objWorkBook
 Dim sPath, sTempPath

 Const sWorkBookName = &quot;DLL_CALL.xlsm&quot;

 sPath = WScript.ScriptFullName
 sPath = Left(sPath, InStrRev(sPath, &quot;\&quot;)) &amp; sWorkBookName


 &#039; /Попытаться использовать уже существующий процесс Excel как сервер автоматизации/
 &#039;-------------------------------------------
 On Error Resume Next
 Set objExcel = GetObject(,&quot;Excel.Application&quot;)

 If IsObject(objExcel) Then 

	&#039; /Попытаться обнаружить рабочую книгу содержащую VBA-модуль вызова API/
	Set objWorkBook = objExcel.Workbooks.Item(sWorkBookName)
	If Not IsObject(objWorkBook) Then 
		Set objWorkBook = objExcel.Workbooks.Open(sPath)
	End If
 Else
	Set objExcel = CreateObject(&quot;Excel.Application&quot;)
	objExcel.Application.Visible = False
	Set objWorkBook = objExcel.Workbooks.Open(sPath) 
 End If
 On Error GoTo 0

 &#039; Протестировать вызов WINAPI
 &#039;-------------------------------------------
 WinAPITest &quot;DLLCALL_CallWindowProc&quot;
 WinAPITest &quot;DLLCALL_EnumWindows&quot;
 WScript.Quit()


 &#039; Вызов WINAPI через Excel (sModuleName - имя модуля содержащего вызов WinAPI в книге Excel)
 &#039;-------------------------------------------
 Sub WinAPITest(ByVal sModuleName)

	Dim sTitle, hRES, p1 		 
	sTitle = sModuleName
	With objWorkBook.Application

		hRES = .Run(sModuleName &amp; &quot;.CallFunction&quot;, &quot;user32.dll&quot;, &quot;MessageBoxW&quot;, 0, &quot;Процесс Excel не будет остановлен после выполнения этого сценария.&quot;, sTitle, vbExclamation + vbSystemModal)
		p1 = .Run(sModuleName &amp; &quot;.SetStrBuf&quot;, 255) 
		hRES = .Run(sModuleName &amp; &quot;.CallFunction&quot;, &quot;kernel32.dll&quot;, &quot;GetTempPathW&quot;, 255, p1)
		sTempPath = .Run(sModuleName &amp; &quot;.GetStrBuf&quot;) 

	End With
	MsgBox sTempPath, vbSystemModal + vbExclamation, sTitle
 End Sub
</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2010-08-25T20:25:37Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?id=4870&amp;action=new</id>
		</entry>
</feed>
