<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: вывод текста на консоль с помощью DynamicWrapper]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=1121</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1121&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: вывод текста на консоль с помощью DynamicWrapper».]]></description>
		<lastBuildDate>Wed, 06 Feb 2008 04:57:14 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: вывод текста на консоль с помощью DynamicWrapper]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8701#p8701</link>
			<description><![CDATA[<p>Командный процессор на VBS <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />. Понимает 2 команды (Help и Exit), а также правильно реагирует на неизвестные.<br /></p><div class="codebox"><pre><code>Welcome=&quot;Command processor Валенок [Версия 0.0.0.1]&quot; &amp; vbcrlf &amp;_
&quot;(C) Корпорация Script-coding.com &amp; Co, 2008-2100&quot; &amp; vbcrlf &amp; vbcrlf &amp;_
&quot;Для вывода справки наберите &quot;&quot;Help&quot;&quot;, для выхода наберите &quot;&quot;Exit&quot;&quot;.&quot; &amp;  vbcrlf &amp;_
&quot;Также можно набрать любую фигню. Регистр роли не играет.&quot; &amp;  vbcrlf

Const STD_INPUT_HANDLE  = -10
Const STD_OUTPUT_HANDLE = -11
InBufSize=255
Prompt=&quot;Вводи!&gt;&quot;

Set Wrap=CreateObject(&quot;DynamicWrapper&quot;)
RegisterMethods                          &#039; Вынес всю портянку в Sub ниже.

ConHwnd=Wrap.GetConsoleWindow()
If ConHwnd = 0 Then
  Wrap.AllocConsole()
  ConHwnd=Wrap.GetConsoleWindow()
End If
Wrap.SetForegroundWindow ConHwnd

StdIn =Wrap.GetStdHandle(STD_INPUT_HANDLE)
StdOut=Wrap.GetStdHandle(STD_OUTPUT_HANDLE)

ConWrite Welcome

Do While True                &#039; Цикл обработки вводимых команд.
  ConWrite vbcrlf &amp; Prompt
  Cmd=ConRead()
  If LCase(Cmd) = &quot;help&quot; Then
    ConWrite &quot;Помоги себе сам!&quot; &amp; vbcrlf
  ElseIf LCase(Cmd) = &quot;exit&quot; Then
    WScript.Quit
  ElseIf Cmd = &quot;&quot; Then
    ConWrite &quot;Ничего не введено.&quot; &amp; vbcrlf
  Else
    ConWrite &quot;Неопознанная фигня: &quot; &amp; Cmd &amp; vbcrlf 
  End If
Loop


&#039;====================== Вспомогательные функции =====================

Sub RegisterMethods()
  Wrap.Register &quot;msvcrt.dll&quot;,   &quot;strncpy&quot;,             &quot;i=wwl&quot;,      &quot;f=c&quot;, &quot;r=l&quot;
  Wrap.Register &quot;msvcrt.dll&quot;,   &quot;strlen&quot;,              &quot;i=l&quot;,        &quot;f=c&quot;, &quot;r=l&quot;
  Wrap.Register &quot;msvcrt.dll&quot;,   &quot;memcpy&quot;,              &quot;i=lll&quot;,      &quot;f=c&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleWindow&quot;,                  &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;AllocConsole&quot;,                      &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;FreeConsole&quot;,                       &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;WriteFile&quot;,           &quot;i=lllll&quot;,    &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;ReadFile&quot;,            &quot;i=lllll&quot;,    &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;GetStdHandle&quot;,        &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleCP&quot;,                      &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleOutputCP&quot;,                &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;WideCharToMultiByte&quot;, &quot;i=llllllll&quot;, &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;kernel32.dll&quot;, &quot;MultiByteToWideChar&quot;, &quot;i=llllll&quot;,   &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;user32.dll&quot;,   &quot;SetForegroundWindow&quot;, &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;
  Wrap.Register &quot;ntdll.dll&quot;,    &quot;RtlZeroMemory&quot;,       &quot;i=ll&quot;,       &quot;f=s&quot;, &quot;r=l&quot;
End Sub

Function ConRead()                  &#039; Читает ввод.
  InBuf=Space(InBufSize/2)
  CharsRead=0
  InCP=Wrap.GetConsoleCP()
  Wrap.RtlZeroMemory CStrPtr(InBuf), InBufSize
  Wrap.ReadFile StdIn, CStrPtr(InBuf), InBufSize, CLngPtr(CharsRead), 0
  If CharsRead &lt;= 2 Then
    ConRead = &quot;&quot;
  End If
  ConRead = Left(AnsiToUni(InBuf, InCP), CharsRead-2) &#039; Отрезаются CR и LF.
End Function

Function ConWrite(Text)            &#039; Пишет в вывод.
  CharsWritten=0
  OutCP=Wrap.GetConsoleOutputCP()
  Wrap.WriteFile StdOut, UniToAnsi(Text, OutCP), Len(Text), CLngPtr(CharsWritten), 0
  ConWrite=CharsWritten
End Function

Function CLngPtr(v)                &#039; Возвращает указатель на число.
  CLngPtr=Wrap.strncpy(v, v, 1)+8
End Function

Function CStrPtr(v)                &#039; Возвращает указатель на строку.
  d=CLng(0)
  pv=Wrap.strncpy(v, v, 1)
  pd=Wrap.strncpy(d, d, 1)
  Wrap.memcpy pd+8, pv+8, 8
  CStrPtr=d
End Function

Function UniToAnsi(w, cp)          &#039; Конвертирует из Unicode в ANSI.
  s=Space(Len(w))                  &#039; Возвращает указатель на строку.
  ps=CStrPtr(s)
  pw=CStrPtr(w)
  Wrap.WideCharToMultiByte cp, 0, pw, Len(w), ps, Len(w), 0, 0
  UniToAnsi=ps
End Function

Function AnsiToUni(s, cp)          &#039; Конвертирует из ANSI в Unicode.
  ps=CStrPtr(s)                    &#039; Возвращает строковую переменную VBS.
  slen=Wrap.strlen(ps)
  w=Space(slen)
  pw=CStrPtr(w)
  Wrap.MultiByteToWideChar cp, 0, ps, slen, pw, slen
  AnsiToUni=w
End Function</code></pre></div><p>Автор примера - <strong>YMP</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 06 Feb 2008 04:57:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8701#p8701</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: вывод текста на консоль с помощью DynamicWrapper]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8683#p8683</link>
			<description><![CDATA[<p>Пример, аналогичный предыдущему, но работает немного по-другому. Открывает окно консоли и выводит текст в него, независимо от того, запущен ли скрипт с помощью cscript, wscript или даже из-под текстового редактора с неявным перенаправлением вывода (например, SciTE), или даже с помощью cscript с явным перенаправлением вывода в файл.<br /></p><div class="codebox"><pre><code>Text=&quot;Hello, world! Это я. Как дела?&quot;

CharsWritten=CLng(0)
Const STD_OUTPUT_HANDLE = -11

Const GENERIC_READ          = &amp;H80000000
Const GENERIC_WRITE         = &amp;H40000000
Const FILE_SHARE_READ       = &amp;H00000001
Const FILE_SHARE_WRITE      = &amp;H00000002
Const OPEN_EXISTING         = &amp;H00000003
Const FILE_ATTRIBUTE_NORMAL = &amp;H00000080
Const SW_SHOWNOACTIVATE     = &amp;H00000004
Const SW_SHOW               = &amp;H00000005
Const SW_SHOWDEFAULT        = &amp;H0000000A
Const SW_HIDE               = &amp;H00000000
Const SW_SHOWNORMAL         = &amp;H00000001

Set Wrap=CreateObject(&quot;DynamicWrapper&quot;)

Wrap.Register &quot;msvcrt.dll&quot;,   &quot;strncpy&quot;,             &quot;i=wwl&quot;,      &quot;f=c&quot;, &quot;r=l&quot;
Wrap.Register &quot;msvcrt.dll&quot;,   &quot;memcpy&quot;,              &quot;i=lll&quot;,      &quot;f=c&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleWindow&quot;,                  &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;AllocConsole&quot;,                      &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;FreeConsole&quot;,                       &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;WriteConsole&quot;,        &quot;i=lllll&quot;,    &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;WriteFile&quot;,           &quot;i=lllll&quot;,    &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;GetStdHandle&quot;,        &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleOutputCP&quot;,                &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;WideCharToMultiByte&quot;, &quot;i=llllllll&quot;, &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;user32.dll&quot;,   &quot;SetForegroundWindow&quot;, &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;CreateFile&quot;,          &quot;i=sllllll&quot;,  &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;CloseHandle&quot;,         &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;user32.dll&quot;,   &quot;ShowWindow&quot;,          &quot;i=ll&quot;,       &quot;f=s&quot;, &quot;r=l&quot;

ConHwnd=Wrap.GetConsoleWindow()
If ConHwnd = 0 Then
  &#039;Wrap.FreeConsole()
  Wrap.AllocConsole()
  ConHwnd=Wrap.GetConsoleWindow()
End If

Wrap.ShowWindow ConHwnd, SW_SHOWNOACTIVATE
Wrap.SetForegroundWindow ConHwnd

OutCP=Wrap.GetConsoleOutputCP()
Text=Text &amp; vbcrlf &amp; &quot;Кодовая страница вывода: &quot; &amp; OutCP &amp; vbcrlf

&#039;StdOut=Wrap.GetStdHandle(STD_OUTPUT_HANDLE)
StdOut = Wrap.CreateFile(&quot;CONOUT$&quot;, GENERIC_READ Or GENERIC_WRITE, _
    FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    
Wrap.WriteFile StdOut, UniToAnsi(Text, OutCP), Len(Text), CLngPtr(CharsWritten), 0

Wrap.CloseHandle StdOut
&#039;Wrap.FreeConsole()

WScript.Echo &quot;Записано символов: &quot; &amp; CharsWritten
do
    WScript.Sleep 10000
loop


&#039;====================== Вспомогательные функции =====================

Function CLngPtr(v)                &#039; Возвращает указатель на число.
  CLngPtr=Wrap.strncpy(v, v, 1)+8
End Function

Function CStrPtr(v)                &#039; Возвращает указатель на строку.
  d=CLng(0)
  pv=Wrap.strncpy(v, v, 1)
  pd=Wrap.strncpy(d, d, 1)
  Wrap.memcpy pd+8, pv+8, 8
  CStrPtr=d
End Function

Function UniToAnsi(w, cp)          &#039; Конвертирует из Unicode в ANSI.
  s=Space(Len(w))                  &#039; Возвращает указатель на строку.
  ps=CStrPtr(s)
  pw=CStrPtr(w)
  Wrap.WideCharToMultiByte cp, 0, pw, Len(w), ps, Len(w), 0, 0
  UniToAnsi=ps
End Function</code></pre></div><p>Автор примера - <strong>alexii</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Tue, 05 Feb 2008 12:35:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8683#p8683</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: вывод текста на консоль с помощью DynamicWrapper]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8643#p8643</link>
			<description><![CDATA[<p>Пример демонстрирует вывод текста на консоль с помощью <a href="http://www.script-coding.com/dynwrap.html">DynamicWrapper</a>. Вывод осуществляется независимо от того, запущен ли скрипт с помощью cscript, wscript или даже из-под текстового редактора с перенаправлением вывода (например, SciTE),&nbsp; т.е. вывод направляется в stdout (если он есть) и нормально перехватывается и перенаправляется. Практическую ценность этого примера оценить трудно, однако пример демонстрирует интересную работу с некоторыми функциями Win32 API.<br /></p><div class="codebox"><pre><code>Text=&quot;Hello, world! Это я. Как дела?&quot;

CharsWritten=CLng(0)
Const STD_OUTPUT_HANDLE = -11

Set Wrap=CreateObject(&quot;DynamicWrapper&quot;)

Wrap.Register &quot;msvcrt.dll&quot;,   &quot;strncpy&quot;,             &quot;i=wwl&quot;,      &quot;f=c&quot;, &quot;r=l&quot;
Wrap.Register &quot;msvcrt.dll&quot;,   &quot;memcpy&quot;,              &quot;i=lll&quot;,      &quot;f=c&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleWindow&quot;,                  &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;AllocConsole&quot;,                      &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;FreeConsole&quot;,                       &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;WriteFile&quot;,        &quot;i=lllll&quot;,    &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;GetStdHandle&quot;,        &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;GetConsoleOutputCP&quot;,                &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;kernel32.dll&quot;, &quot;WideCharToMultiByte&quot;, &quot;i=llllllll&quot;, &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;user32.dll&quot;,   &quot;SetForegroundWindow&quot;, &quot;i=l&quot;,        &quot;f=s&quot;, &quot;r=l&quot;

ConHwnd=Wrap.GetConsoleWindow()
If ConHwnd = 0 Then
  Wrap.AllocConsole()
  ConHwnd=Wrap.GetConsoleWindow()
End If
Wrap.SetForegroundWindow ConHwnd

OutCP=Wrap.GetConsoleOutputCP()
Text=Text &amp; vbcrlf &amp; &quot;Кодовая страница вывода: &quot; &amp; OutCP &amp; vbcrlf
StdOut=Wrap.GetStdHandle(STD_OUTPUT_HANDLE)
Wrap.WriteFile StdOut, UniToAnsi(Text, OutCP), Len(Text), CLngPtr(CharsWritten), 0
WScript.Sleep 3000
&#039;Wrap.FreeConsole()

WScript.Echo &quot;Записано символов: &quot; &amp; CharsWritten


&#039;====================== Вспомогательные функции =====================

Function CLngPtr(v)                &#039; Возвращает указатель на число.
  CLngPtr=Wrap.strncpy(v, v, 1)+8
End Function

Function CStrPtr(v)                &#039; Возвращает указатель на строку.
  d=CLng(0)
  pv=Wrap.strncpy(v, v, 1)
  pd=Wrap.strncpy(d, d, 1)
  Wrap.memcpy pd+8, pv+8, 8
  CStrPtr=d
End Function

Function UniToAnsi(w, cp)          &#039; Конвертирует из Unicode в ANSI.
  s=Space(Len(w))                  &#039; Возвращает указатель на строку.
  ps=CStrPtr(s)
  pw=CStrPtr(w)
  Wrap.WideCharToMultiByte cp, 0, pw, Len(w), ps, Len(w), 0, 0
  UniToAnsi=ps
End Function</code></pre></div><p>Автор примера - <strong>YMP</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Mon, 04 Feb 2008 18:19:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8643#p8643</guid>
		</item>
	</channel>
</rss>
