Как организовать обмен данными с Шахматным Движком? - VB

Узнай цену своей работы

Формулировка задачи:

Всем привет! Решил сделать свою Графическую Оболочку для Шахматного Движка, но не знаю как организовать обмен данными. Несколько дней ворошил инет - и ничего вразумительного(( Вот цитата из описания движка: "Шахматный движок представляет собой обычное приложение (чаще всего консольное). Оно получает различные команды по стандартному устройству ввода (stdin), как-то их обрабатывает и результат подаёт на стандартное устройство вывода (stdout)." Подскажите, ПЛЗ, что это за "стандартное устройство"!! Пробовал через через создание консоли - не идёт... Для начала наладил передачу команд через AppActivate->SendKeys, а ответ вытаскиваю из ЛогФайла (благо у движка есть такая опция), но очень уж это вычурно... Подскажите хоть в каком направлении копать, а лучше примерчик дайте...

Решение задачи: «Как организовать обмен данными с Шахматным Движком?»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
  4. Private Declare Function PeekNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long, lpBuffer As Any, ByVal nBufferSize As Long, lpBytesRead As Long, lpTotalBytesAvail As Long, lpBytesLeftThisMessage As Any) As Long
  5. Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoW" (lpStartupInfo As STARTUPINFO)
  6. Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessW" (ByVal lpApplicationName As Long, ByVal lpCommandLine As Long, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
  7. Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
  8. Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
  9. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  10. Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  11.  
  12. Private Type SECURITY_ATTRIBUTES
  13.     nLength As Long
  14.     lpSecurityDescriptor As Long
  15.     bInheritHandle As Long
  16. End Type
  17. Private Type PROCESS_INFORMATION
  18.     hProcess As Long
  19.     hThread As Long
  20.     dwProcessId As Long
  21.     dwThreadId As Long
  22. End Type
  23. Private Type STARTUPINFO
  24.     cb As Long
  25.     lpReserved As Long
  26.     lpDesktop As Long
  27.     lpTitle As Long
  28.     dwX As Long
  29.     dwY As Long
  30.     dwXSize As Long
  31.     dwYSize As Long
  32.     dwXCountChars As Long
  33.     dwYCountChars As Long
  34.     dwFillAttribute As Long
  35.     dwFlags As Long
  36.     wShowWindow As Integer
  37.     cbReserved2 As Integer
  38.     lpReserved2 As Byte
  39.     hStdInput As Long
  40.     hStdOutput As Long
  41.     hStdError As Long
  42. End Type
  43. Private Type PIPE
  44.     hRead As Long
  45.     hWrite As Long
  46. End Type
  47.  
  48. Private Const CREATE_NEW_CONSOLE = &H10
  49. Private Const STARTF_USESHOWWINDOW = &H1
  50. Private Const STARTF_USESTDHANDLES = &H100
  51. Private Const SW_HIDE = 0
  52.  
  53. Dim PipeIn As PIPE, PipeOut As PIPE, pi As PROCESS_INFORMATION
  54.  
  55. Private Function conWrite(ByVal sData As String) As Boolean
  56.     Dim lBytesWrote As Long
  57.  
  58.     sData = StrConv(sData, vbFromUnicode)
  59.  
  60.     If WriteFile(PipeIn.hWrite, StrPtr(sData), LenB(sData), lBytesWrote, 0&) Then
  61.    
  62.         If lBytesWrote = LenB(sData) Then conWrite = True
  63.     End If
  64. End Function
  65.  
  66. Private Function conRead() As String
  67.     Dim buf As String, count As Long
  68.    
  69.     PeekNamedPipe PipeOut.hRead, ByVal 0&, 0&, ByVal 0&, count, ByVal 0&
  70.     If count > 0 Then
  71.         buf = String$((count + 1) \ 2, 0&)
  72.         If ReadFile(PipeOut.hRead, ByVal StrPtr(buf), count, count, ByVal 0&) Then
  73.             conRead = DOS2Win(StrConv(Left$(buf, count), vbUnicode))
  74.         End If
  75.     End If
  76. End Function
  77. Private Function InitConsole(CommandLine As String, nShow As Long) As Boolean
  78.     Dim attr As SECURITY_ATTRIBUTES
  79.     Dim sui As STARTUPINFO
  80.    
  81.     attr.nLength = Len(attr)
  82.     attr.lpSecurityDescriptor = 0
  83.     attr.bInheritHandle = True
  84.    
  85.     If CreatePipe(PipeIn.hRead, PipeIn.hWrite, attr, 0) <> 0 Then
  86.    
  87.       If CreatePipe(PipeOut.hRead, PipeOut.hWrite, attr, 0) <> 0 Then
  88.      
  89.         sui.cb = Len(sui)
  90.         GetStartupInfo sui
  91.         sui.hStdInput = PipeIn.hRead
  92.         sui.hStdOutput = PipeOut.hWrite
  93.         sui.hStdError = PipeOut.hWrite
  94.         sui.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
  95.         sui.wShowWindow = nShow
  96.         If CreateProcess(0&, StrPtr(CommandLine), ByVal 0, ByVal 0, 1&, CREATE_NEW_CONSOLE, ByVal 0, 0&, sui, pi) = 0 Then
  97.             DeinitConsole
  98.             MsgBox "CreateProcess failed with code " & Err.LastDllError
  99.         Else
  100.             InitConsole = True
  101.         End If
  102.       End If
  103.     End If
  104. End Function
  105. Private Function DOS2Win(ByVal Str As String) As String
  106.      Dim i As Long
  107.      For i = 239 To 192 Step -1
  108.          Str = Replace(Str, Chr(i), Chr(i + 16))
  109.      Next i
  110.      For i = 191 To 128 Step -1
  111.          Str = Replace(Str, Chr(i), Chr(i + 64))
  112.      Next i
  113.      Str = Replace$(Str, Chr(0), "")
  114.      DOS2Win = Str
  115. End Function
  116. Private Sub DeinitConsole()
  117.     If pi.hProcess <> 0 Then TerminateProcess pi.hProcess, 0&
  118.     CloseHandle PipeIn.hRead: CloseHandle PipeIn.hWrite
  119.     CloseHandle PipeOut.hWrite: CloseHandle PipeOut.hWrite
  120.     CloseHandle pi.hThread: CloseHandle pi.hProcess
  121. End Sub
  122. Private Sub Form_Load()
  123.     Dim s As String
  124.  
  125.     If InitConsole("C:\Windows\System32\Cmd.exe", SW_HIDE) Then
  126.  
  127.         conWrite "@echo off" & vbCrLf
  128.         conWrite "echo %SystemRoot%" & vbCrLf
  129.  
  130.         Stop
  131.  
  132.         s = conRead()
  133.         MsgBox s
  134.  
  135.         DeinitConsole
  136.     End If
  137.  
  138.     End
  139. End Sub
  140. Private Sub Form_Unload(Cancel As Integer)
  141.     DeinitConsole
  142. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы