Виртуальный файл.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Виртуальный файл.

Сообщение Taras2 » 16.10.2003 (Чт) 9:07

Привет All!

Задача в следующем: есть консольная утилита (не моя), которая работает с файлом заданным в командной строке, читает его и выдаёт результаты в стандартный вывод. Не хочется создавать временные файлы и дёргать диск. Можно ли и как задать этот файл в виде массива в памяти.

ЗЫ. Утилита не моя, поэтому переделать её я не смогу.

Спасибо.

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 16.10.2003 (Чт) 13:49

А разве нет такой функции с помощью которой файл в память поместить можно?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 16.10.2003 (Чт) 13:56

Между прочим раньше был такой комп - ZX SPECTRUM, там все грузилось в память (потому что винтов не было), так вот там с этим проблем вообще не было.

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 16.10.2003 (Чт) 14:07

Z-zzz писал(а):А разве нет такой функции с помощью которой файл в память поместить можно?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!


Да, есть Input называется, а дальше?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 16.10.2003 (Чт) 14:08

Ну положим, не все в память там грузилось. А насчет того, что автор темы спрашивает - ответ: нет.

Сэмулировать файл на диске чем то в памяти, то есть чтобы при обращении к c:\file.ext шло обращение в память - нереально.

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 16.10.2003 (Чт) 14:21

RayShade писал(а):Ну положим, не все в память там грузилось. А насчет того, что автор темы спрашивает - ответ: нет.
Сэмулировать файл на диске чем то в памяти, то есть чтобы при обращении к c:\file.ext шло обращение в память - нереально.


А если открыть pipe, как-то можно подсунуть проге на её запрос хендл этого pipe?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 16.10.2003 (Чт) 14:27

Прога открывает файл. И надеется, скорее всего получить его дескриптор. Что то мне смутно верится что она сильно возрадуется от того что ей сунут хендл пайпа и что она, считая его дескриптором файла, сможет с ним работать :)

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 16.10.2003 (Чт) 15:27

RayShade писал(а):Прога открывает файл. И надеется, скорее всего получить его дескриптор. Что то мне смутно верится что она сильно возрадуется от того что ей сунут хендл пайпа и что она, считая его дескриптором файла, сможет с ним работать :)

Так ведь она его просто последовательно (даже построчно) читает. Прога не производит перемещений по файлу.
Да и потом попытка не пытка.

ЗЫ. Я видел как результаты работы этой проги (STDOut) были направлены в Notepad, причем Notepad не знал имени файла и при его закрытии предлагал ввести имя файла.

zzoom
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 13.06.2003 (Пт) 10:29
Откуда: Рига

Сообщение zzoom » 29.10.2003 (Ср) 16:08

Taras2 писал(а):Так ведь она его просто последовательно (даже построчно) читает. Прога не производит перемещений по файлу.
Да и потом попытка не пытка.

Читать ПОСТРОЧНО и не производить перемещений, это что-то новое :lol:
Taras2 писал(а):ЗЫ. Я видел как результаты работы этой проги (STDOut) были направлены в Notepad, причем Notepad не знал имени файла и при его закрытии предлагал ввести имя файла.
А может все-таки через clipboard?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.10.2003 (Ср) 17:24

Для работы с файлами через API нет никакой разницы, является ли файл настоящим файлом, mailslot или pipe. Если приложение консольное, то stdin, stdout и stderr можно перенаправить почти куда угодно.
Покопайся в MSDN, а начни с Q173085.
Код: Выделить всё
Option Explicit



      Private Declare Function CreatePipe Lib "kernel32" ( _
          phReadPipe As Long, _
          phWritePipe As Long, _
          lpPipeAttributes As Any, _
          ByVal nSize As Long) As Long

      Private Declare Function ReadFile Lib "kernel32" ( _
          ByVal hFile As Long, _
          ByVal lpBuffer As String, _
          ByVal nNumberOfBytesToRead As Long, _
          lpNumberOfBytesRead As Long, _
          byval lpOverlapped As Any) As Long

      Private Type SECURITY_ATTRIBUTES
          nLength As Long
          lpSecurityDescriptor As Long
          bInheritHandle As Long
      End Type

      Private Type STARTUPINFO
         cb As Long
         lpReserved As Long
         lpDesktop As Long
         lpTitle As Long
         dwX As Long
         dwY As Long
         dwXSize As Long
         dwYSize As Long
         dwXCountChars As Long
         dwYCountChars As Long
         dwFillAttribute As Long
         dwFlags As Long
         wShowWindow As Integer
         cbReserved2 As Integer
         lpReserved2 As Long
         hStdInput As Long
         hStdOutput As Long
         hStdError As Long
      End Type

      Private Type PROCESS_INFORMATION
         hProcess As Long
         hThread As Long
         dwProcessID As Long
         dwThreadID As Long
      End Type

      Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
         lpApplicationName As Long, ByVal lpCommandLine As String, _
         lpProcessAttributes As Any, lpThreadAttributes As Any, _
         ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
         ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
         lpStartupInfo As Any, lpProcessInformation As Any) As Long

      Private Declare Function CloseHandle Lib "kernel32" (ByVal _
         hObject As Long) As Long

      Private Const NORMAL_PRIORITY_CLASS = &H20&
      Private Const STARTF_USESTDHANDLES = &H100&

      Private Sub ExecCmd(cmdline$)
          Dim proc As PROCESS_INFORMATION, ret As Long, bSuccess As Long
          Dim start As STARTUPINFO
          Dim sa As SECURITY_ATTRIBUTES, hReadPipe As Long, hWritePipe _
          As Long
          Dim bytesread As Long, mybuff As String
          Dim i As Integer

          mybuff = String(256, Chr$(65))

          sa.nLength = Len(sa)
          sa.bInheritHandle = 1&
          sa.lpSecurityDescriptor = 0&

          ret = CreatePipe(hReadPipe, hWritePipe, sa, 0)
          If ret = 0 Then
              MsgBox "CreatePipe failed. Error: " & Err.LastDllError
              Exit Sub
          End If

       start.cb = Len(start)
       start.dwFlags = STARTF_USESTDHANDLES
       start.hStdOutput = hWritePipe

       ' Start the shelled application:
       ret& = CreateProcessA(0&, cmdline$, sa, sa, 1&, _
       NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
       If ret <> 1 Then
           MsgBox "CreateProcess failed. Error: " & Err.LastDllError
       End If

       bSuccess = ReadFile(hReadPipe, mybuff, 100, bytesread, 0&)
       If bSuccess = 1 Then
           List1.AddItem Left(mybuff, bytesread)
       Else
           MsgBox "ReadFile failed. Error: " & Err.LastDllError
       End If

          ret& = CloseHandle(proc.hProcess)
          ret& = CloseHandle(proc.hThread)
          ret& = CloseHandle(hReadPipe)
          ret& = CloseHandle(hWritePipe)
      End Sub

Вызов: ExecCmd ("C:\Console\Debug\console.exe")
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList  
cron