Тема: VBScript: вывод текста на консоль с помощью DynamicWrapper
Пример демонстрирует вывод текста на консоль с помощью DynamicWrapper. Вывод осуществляется независимо от того, запущен ли скрипт с помощью cscript, wscript или даже из-под текстового редактора с перенаправлением вывода (например, SciTE), т.е. вывод направляется в stdout (если он есть) и нормально перехватывается и перенаправляется. Практическую ценность этого примера оценить трудно, однако пример демонстрирует интересную работу с некоторыми функциями Win32 API.
Text="Hello, world! Это я. Как дела?"
CharsWritten=CLng(0)
Const STD_OUTPUT_HANDLE = -11
Set Wrap=CreateObject("DynamicWrapper")
Wrap.Register "msvcrt.dll", "strncpy", "i=wwl", "f=c", "r=l"
Wrap.Register "msvcrt.dll", "memcpy", "i=lll", "f=c", "r=l"
Wrap.Register "kernel32.dll", "GetConsoleWindow", "f=s", "r=l"
Wrap.Register "kernel32.dll", "AllocConsole", "f=s", "r=l"
Wrap.Register "kernel32.dll", "FreeConsole", "f=s", "r=l"
Wrap.Register "kernel32.dll", "WriteFile", "i=lllll", "f=s", "r=l"
Wrap.Register "kernel32.dll", "GetStdHandle", "i=l", "f=s", "r=l"
Wrap.Register "kernel32.dll", "GetConsoleOutputCP", "f=s", "r=l"
Wrap.Register "kernel32.dll", "WideCharToMultiByte", "i=llllllll", "f=s", "r=l"
Wrap.Register "user32.dll", "SetForegroundWindow", "i=l", "f=s", "r=l"
ConHwnd=Wrap.GetConsoleWindow()
If ConHwnd = 0 Then
Wrap.AllocConsole()
ConHwnd=Wrap.GetConsoleWindow()
End If
Wrap.SetForegroundWindow ConHwnd
OutCP=Wrap.GetConsoleOutputCP()
Text=Text & vbcrlf & "Кодовая страница вывода: " & OutCP & vbcrlf
StdOut=Wrap.GetStdHandle(STD_OUTPUT_HANDLE)
Wrap.WriteFile StdOut, UniToAnsi(Text, OutCP), Len(Text), CLngPtr(CharsWritten), 0
WScript.Sleep 3000
'Wrap.FreeConsole()
WScript.Echo "Записано символов: " & CharsWritten
'====================== Вспомогательные функции =====================
Function CLngPtr(v) ' Возвращает указатель на число.
CLngPtr=Wrap.strncpy(v, v, 1)+8
End Function
Function CStrPtr(v) ' Возвращает указатель на строку.
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) ' Конвертирует из Unicode в ANSI.
s=Space(Len(w)) ' Возвращает указатель на строку.
ps=CStrPtr(s)
pw=CStrPtr(w)
Wrap.WideCharToMultiByte cp, 0, pw, Len(w), ps, Len(w), 0, 0
UniToAnsi=ps
End Function
Автор примера - YMP.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.