현재 오프라인 상태입니다. 인터넷에 다시 연결하기를 기다리고 있습니다.

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

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

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가 따라 프로세스 간 통신

속성

문서 ID: 177696 - 마지막 검토: 02/12/2007 19:08:32 - 수정: 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
피드백
) + "//c.microsoft.com/ms.js'><\/script>");