명명된 파이프 VBA 32비트 프로그램 방법

기술 자료 번역 기술 자료 번역
기술 자료: 177696 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

Visual Basic 다른 프로세스가 명명된 파이프를 통해 통신하는 응용 프로그램을 만들 수 있습니다. 그러나 Windows 2000 또는 Windows NT 명명된 파이프 만들어져 있어야 합니다. 그리고 읽기 및 해당 파이프로 모든 32 비트 플랫폼에서 쓰기 수 있습니다.

이 문서에서는 Visual Basic에서 명명된 파이프를 사용하여 클라이언트/서버 통신을 보여 줍니다.

추가 정보

이 문서에서는 해당 NamedPipe 만드는 프로세스를 서버, 호출되며 클라이언트가 명명된 파이프 연결 프로세스가 호출됩니다.

명명된 파이프 서버 만들기 여섯 단계를 다음과 같습니다.
  1. 파이프 (명명된 파이프 모든 프로세스를 사용할 수 있는 DACL (임의 액세스 제어 목록 (0으로 항목이 들어 있는) 보안 토큰을 만들어 정확하게 수) 액세스를 위한 보안 토큰을 만듭니다.
  2. 명명된 파이프를 만듭니다.
  3. 클라이언트가 연결할 때까지 ConnectNamedPipe를 호출하십시오.
  4. ReadFile 또는 WriteFile 파이프에 통신하도록 호출하십시오.
  5. 프로세스가 끝날 때 DisconnectNamedPipe 호출하여 파이프 사용하는.
  6. 어느 CloseHandle 명명된 파이프 또는 다시 4 단계로 갑니다.
명명된 파이프를 사용하여 명명된 파이프 클라이언트 사용할 수 있는 세 가지 단계를 다음과 같습니다.
  1. 명명된 파이프 핸들을 가져오려면 CreateFile를 호출하십시오.
  2. ReadFile 또는 WriteFile 파이프에 통신하도록 호출하십시오.
  3. CloseHandle CreateFile에서 만든 filehandle에 대해 호출하십시오.
또는 파이프에 일회성 트랜잭션을 수행하는 CallNamedPipe를 호출할 수 있습니다. CallNamedPipe는 파이프를 여는 씁니다, 읽은 다음 파이프를 닫습니다. 아래 클라이언트 수행하는 것입니다.

다음 샘플에서는 명명된 파이프 서버 및 클라이언트 만드는 방법을 보여 줍니다. 최소한의 오류 검사를 사용하여 작업을 수행하는 데 필요한 가장 기본적인 기능만을 구현합니다. 완벽하게 작동하는 프로그램이 성공한 것처럼 가정하고 대신, 호출되는 API의 반환 값을 확인해야 합니다.

명명된 파이프 서버

  1. 새 프로젝트를 만듭니다. 기본적으로 Form1이 만들어집니다.
  2. 폼에 다음 코드를 추가합니다:
       Option Explicit
       Private Const szPipeName = "\\.\pipe\bigtest"
       Private Const BUFFSIZE = 20000
       Private BigBuffer(BUFFSIZE) As Byte, pSD As Long
       Private sa As SECURITY_ATTRIBUTES
       Private hPipe As Long
    
       Private Sub Form_Click()
          Dim i As Long, dwOpenMode As Long, dwPipeMode As Long
          Dim res As Long, nCount As Long, cbnCount As Long
          For i = 0 To BUFFSIZE - 1       'Fill an array of numbers
             BigBuffer(i) = i Mod 256
          Next i
    
          'Create the NULL security token for the pipe
          pSD = GlobalAlloc(GPTR, SECURITY_DESCRIPTOR_MIN_LENGTH)
          res = InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)
          res = SetSecurityDescriptorDacl(pSD, -1, 0, 0)
          sa.nLength = LenB(sa)
          sa.lpSecurityDescriptor = pSD
          sa.bInheritHandle = True
    
          'Create the Named Pipe
          dwOpenMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH
          dwPipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE
          hPipe = CreateNamedPipe(szPipeName, dwOpenMode, dwPipeMode, _
                                  10, 10000, 2000, 10000, sa)
    
          Do  'Wait for a connection, block until a client connects
             res = ConnectNamedPipe(hPipe, ByVal 0)
    
             'Read/Write data over the pipe
             cbnCount = 4
    
             res = ReadFile(hPipe, nCount, LenB(nCount), cbnCount, ByVal 0)
    
             If nCount <> 0 Then
    
                If nCount > BUFFSIZE Then 'Client requested nCount bytes
                   nCount = BUFFSIZE      'but only send up to 20000 bytes
                End If
                'Write the number of bytes requested
                res = WriteFile(hPipe, BigBuffer(0), nCount, cbnCount, ByVal 0)
                'Make sure the write is finished
                res = FlushFileBuffers(hPipe)
             End If
    
             'Disconnect the NamedPipe
             res = DisconnectNamedPipe(hPipe)
          Loop Until nCount = 0
    
          'Close the pipe handle
          CloseHandle hPipe
          GlobalFree (pSD)
          End
       End Sub
    					
  3. 새 모듈을 만들고 다음 선언을 추가합니다:
       Option Explicit
    
       Public Const FILE_ATTRIBUTE_NORMAL = &H80
       Public Const FILE_FLAG_NO_BUFFERING = &H20000000
       Public Const FILE_FLAG_WRITE_THROUGH = &H80000000
    
       Public Const PIPE_ACCESS_DUPLEX = &H3
       Public Const PIPE_READMODE_MESSAGE = &H2
       Public Const PIPE_TYPE_MESSAGE = &H4
       Public Const PIPE_WAIT = &H0
    
       Public Const INVALID_HANDLE_VALUE = -1
    
       Public Const SECURITY_DESCRIPTOR_MIN_LENGTH = (20)
       Public Const SECURITY_DESCRIPTOR_REVISION = (1)
    
       Type SECURITY_ATTRIBUTES
               nLength As Long
               lpSecurityDescriptor As Long
               bInheritHandle As Long
       End Type
    
       Public Const GMEM_FIXED = &H0
       Public Const GMEM_ZEROINIT = &H40
       Public Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
    
       Declare Function GlobalAlloc Lib "kernel32" ( _
          ByVal wFlags As Long, ByVal dwBytes As Long) As Long
       Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
       Declare Function CreateNamedPipe Lib "kernel32" Alias _
          "CreateNamedPipeA" ( _
          ByVal lpName As String, _
          ByVal dwOpenMode As Long, _
          ByVal dwPipeMode As Long, _
          ByVal nMaxInstances As Long, _
          ByVal nOutBufferSize As Long, _
          ByVal nInBufferSize As Long, _
          ByVal nDefaultTimeOut As Long, _
          lpSecurityAttributes As Any) As Long
    
       Declare Function InitializeSecurityDescriptor Lib "advapi32.dll" ( _
          ByVal pSecurityDescriptor As Long, _
          ByVal dwRevision As Long) As Long
    
       Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" ( _
          ByVal pSecurityDescriptor As Long, _
          ByVal bDaclPresent As Long, _
          ByVal pDacl As Long, _
          ByVal bDaclDefaulted As Long) As Long
    
       Declare Function ConnectNamedPipe Lib "kernel32" ( _
          ByVal hNamedPipe As Long, _
          lpOverlapped As Any) As Long
    
       Declare Function DisconnectNamedPipe Lib "kernel32" ( _
          ByVal hNamedPipe As Long) As Long
    
       Declare Function WriteFile Lib "kernel32" ( _
          ByVal hFile As Long, _
          lpBuffer As Any, _
          ByVal nNumberOfBytesToWrite As Long, _
          lpNumberOfBytesWritten As Long, _
          lpOverlapped As Any) As Long
    
       Declare Function ReadFile Lib "kernel32" ( _
          ByVal hFile As Long, _
          lpBuffer As Any, _
          ByVal nNumberOfBytesToRead As Long, _
          lpNumberOfBytesRead As Long, _
          lpOverlapped As Any) As Long
    
       Declare Function FlushFileBuffers Lib "kernel32" ( _
          ByVal hFile As Long) As Long
    
       Declare Function CloseHandle Lib "kernel32" ( _
          ByVal hObject As Long) As Long
    					
  4. 양식을 저장하십시오.

명명된 파이프 클라이언트

  1. 새 프로젝트를 만듭니다. 기본적으로 Form1이 만들어집니다.
  2. 다음 컨트롤을 폼에 추가합니다:
       Type             Name               Caption/Default Value
       ----             ----               ---------------------
       TextBox          cbBytes            500
       CommandButton    cmdCallNamedPipe   Call Named Pipe
       TextBox          txtReceive
    					
  3. 폼에 다음 코드를 추가합니다:
       Option Explicit
       Private Const szPipeName = "\\.\pipe\bigtest", BUFFSIZE = 20000
       Private Declare Function CallNamedPipe Lib "kernel32" Alias _
          "CallNamedPipeA" ( _
          ByVal lpNamedPipeName As String, _
          lpInBuffer As Any, _
          ByVal nInBufferSize As Long, _
          lpOutBuffer As Any, _
          ByVal nOutBufferSize As Long, _
          lpBytesRead As Long, _
          ByVal nTimeOut As Long) As Long
    
       Private Sub cmdCallNamedPipe_Click()
          Dim res As Long, myStr As String, i As Long, cbRead As Long
          Dim numBytes As Long, bArray() As Byte, temp As String
    
          numBytes = cbBytes.Text
          If cbBytes.Text < 0 Then
             MsgBox "Value must be at least 0.", vbOKOnly
             Exit Sub
          End If
          If numBytes > BUFFSIZE Then
             numBytes = BUFFSIZE
          End If
          ReDim bArray(numBytes)  'Build the return buffer
    
          'Call CallNamedPipe to do the transaction all at once
          res = CallNamedPipe(szPipeName, numBytes, LenB(numBytes), _
             bArray(0), numBytes, _
             cbRead, 30000) 'Wait up to 30 seconds for a response
    
          If res > 0 Then
             temp = Format(bArray(0), " 000")
             For i = 1 To cbRead - 1
                If (i Mod 16) = 0 Then temp = temp & vbCrLf
                temp = temp & " " & Format(bArray(i), "000")
             Next i
             txtReceive.Text = temp
          Else
             MsgBox "Error number " & Err.LastDllError & _
                    " attempting to call CallNamedPipe.", vbOKOnly
          End If
       End Sub
    
    					
  4. 서버가 클라이언트 위치 이외의 다른 컴퓨터에서 실행되는 경우 변경해야 한다는 참고 있는 '. ' 서버 컴퓨터 이름을 변수 szPipeName 있는.
  5. 양식을 저장하십시오. 위의 코드를 테스트하려면 먼저 서버를 시작하고 폼에서 아무 곳이나 클릭하십시오. 서버 응용 차단 및 응답이 있을 수 나타납니다 이제 있지만 실제로 클라이언트를 위해 기다리고 있습니다. 다음 클라이언트 응용 프로그램을 시작하고 "호출 명명된 파이프" 클릭하십시오 클라이언트가 500 값을 500 바이트 데이터 응답할 서버 보내야 합니다. cbBytes 텍스트 상자의 값은 0에서 20000 바이트 설정할 수 있습니다. 서버를 중지하려면 클라이언트에서 0 (영 으로) 보내기만 하면 됩니다. 클라이언트 오류 233 (ERROR_PIPE_NOT_CONNECTED)를 받을 수 있지만 이것은 정상입니다.

    샘플 향상된 또 다른 기능은 IO 완료 포트 및/또는 비 차단 읽기 사용할 수 있을지 및 겹친 IO 사용하여 쓰기. 이러한 주제에 대한 자세한 내용은 Microsoft 플랫폼 SDK 찾을 수 있습니다.

참조

Windows 2000, Windows NT 및 Windows 95 여러 프로세스 간에 데이터의 단방향 또는 양방향 전송 허용 에서 사용할 수 있는 여러 가지 InterProcess 통신 (IPC) 메서드 있습니다. 각 플랫폼에서 사용할 수 있는 IPC 메서드의 전체 목록은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
95900: Windows NT와 Windows 95 Win32s가 따라 프로세스 간 통신

속성

기술 자료: 177696 - 마지막 검토: 2007년 2월 12일 월요일 - 수정: 2.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 4.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Windows NT 4.0
  • Microsoft Windows NT 3.51 서비스 팩 5
  • Microsoft Windows NT 4.0
  • Microsoft Windows 98 Standard Edition
  • Microsoft Win32 Application Programming Interface
  • the operating system: Microsoft Windows 2000
  • Microsoft Windows 95
  • Microsoft Windows Millennium Edition
키워드:?
kbmt kbapi kbhowto KB177696 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com