Làm th? nào đ? s? d?ng tên đư?ng ?ng trong m?t chương tr?nh 32-bit Visual Basic

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 177696 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Visual Basic có th? t?o các ?ng d?ng giao ti?p v?i các quá tr?nh khác b?ng phương ti?n c?a tên đư?ng ?ng. ?ng tên là ph?i đư?c t?o trên Windows 2000 ho?c Windows NT; Tuy nhiên, b?n có th? đ?c t? và ghi vào đó ?ng t? b?t k? n?n t?ng 32-bit.

Bài vi?t này ch?ng t? khách hàng/máy ch? truy?n thông b?ng cách s? d?ng m?t ?ng tên trong Visual Basic.

THÔNG TIN THÊM

Trong bài này, quá tr?nh t?o ra NamedPipe đư?c g?i là máy ch?, và quá tr?nh k?t n?i v?i ?ng tên đư?c g?i là khách hàng.

Có sáu bư?c th?c hi?n đ? t?o ra m?t ?ng tên máy ch?:
  1. T?o ra m?t m? thông báo b?o m?t cho các đư?ng ?ng đ? cho phép truy c?p vào nó (đ? làm cho m?t tên là ?ng có s?n cho b?t k? quá tr?nh b?ng cách t?o ra m?t m? thông báo b?o m?t v?i m?t tùy Access Control List (DACL) có s? không m?c trong nó).
  2. T?o ra ?ng tên.
  3. G?i ConnectNamedPipe đ? ch?n cho đ?n khi m?t khách hàng k?t n?i.
  4. G?i ReadFile và/ho?c WriteFile giao ti?p qua các đư?ng ?ng.
  5. G?i DisconnectNamedPipe khi hoàn t?t quá tr?nh b?ng cách s? d?ng đư?ng ?ng.
  6. Ho?c là CloseHandle trên ?ng tên, ho?c đi quay l?i bư?c 4.
Có ba bư?c đ? s? d?ng m?t ?ng tên là t? các khách hàng đ?t tên là ?ng:
  1. G?i CreateFile đ? có đư?c m?t x? l? tên là ?ng.
  2. G?i ReadFile và/ho?c WriteFile giao ti?p qua các đư?ng ?ng.
  3. G?i CloseHandle ngày filehandle t?o ra trong CreateFile.
Ngoài ra, b?n có th? g?i CallNamedPipe, mà th?c hi?n m?t m?t th?i gian giao d?ch qua đư?ng ?ng. CallNamedPipe s? m? ra các đư?ng ?ng, vi?t nó, đ?c các bài nó, sau đó đóng c?a các đư?ng ?ng. Đây là nh?ng g? khách hàng dư?i đây.

M?u sau đây ch?ng t? làm th? nào đ? t?o ra m?t ?ng tên máy ch? và Khách hàng. Nó th?c hi?n ch? các ch?c năng nh?t thô sơ c?n thi?t đ? làm V? v?y, v?i m?t s? ti?n t?i thi?u c?a ki?m tra l?i. M?t chương tr?nh đ?y đ? ch?c năng nên ki?m tra các giá tr? tr? l?i c?a API c?a mà đư?c g?i là, thay v? gi? s? h? đ? thành công.

Tên h? ph?c v? đư?ng ?ng

  1. T?o m?t d? án m?i. Form1 đư?c t?o ra theo m?c đ?nh.
  2. Thêm m? sau vào các h?nh th?c:
       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. T?o m?t mô-đun m?i và thêm các tuyên b? sau:
       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. Lưu bi?u m?u.

Đư?c đ?t tên theo đư?ng ?ng khách hàng

  1. T?o m?t d? án m?i. Form1 đư?c t?o ra theo m?c đ?nh.
  2. Thêm đi?u khi?n sau đây đ? các h?nh th?c:
       Type             Name               Caption/Default Value
       ----             ----               ---------------------
       TextBox          cbBytes            500
       CommandButton    cmdCallNamedPipe   Call Named Pipe
       TextBox          txtReceive
    					
  3. Thêm m? sau vào các h?nh th?c:
       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. Lưu ? r?ng n?u máy ch? đang ch?y trên m?t máy khác hơn là nơi các khách hàng là, b?n c?n ph?i thay đ?i các '.' trong szPipeName bi?n đ? các tên c?a máy ch?.
  5. Lưu bi?u m?u. Đ? ki?m tra m? ? trên, l?n đ?u tiên b?t đ?u máy ch? và b?m vào b?t c? nơi nào trên các h?nh th?c. Các ?ng d?ng máy ch? là bây gi? ch?n và s? xu?t hi?n đ? có treo, nhưng nó th?c s? ph?i ch? đ?i cho khách hàng đ? k?t n?i. Sau đó b?t đ?u khách hàng ?ng d?ng và Click vào "Call Named ?ng." Khách hàng nên g?i các giá tr? 500 đ?n máy ch?, mà s? đáp ?ng v?i 500 byte d? li?u. B?n có th? thi?t l?p giá tr? trong h?p văn b?n cbBytes t? 0 đ?n 20000 byte. Đ? ngăn ch?n các máy ch?, ch? đơn gi?n là g?i 0 (Zero) t? khách hàng. Khách hàng có th? nh?n đư?c l?i 233 (ERROR_PIPE_NOT_CONNECTED), nhưng đi?u này là b?nh thư?ng.

    C?i ti?n khác đ? m?u có th? bao g?m vi?c s? d?ng c?a IO hoàn thành C?ng và/ho?c Non-Blocking l?n đ?c và vi?t b?ng cách s? d?ng ch?ng chéo IO. B?n có th? t?m thông tin thêm v? các đ?i tư?ng trong n?n t?ng Microsoft SDK.

THAM KH?O

Có s?n m?t s? phương pháp giao ti?p InterProcess (IPC) trong Windows 2000, Windows NT và Windows 95 cho phép m?t chi?u ho?c hai cách truy?n d? li?u gi?a các quá tr?nh nhi?u. Đ? có m?t danh sách đ?y đ? c?a IPC phương pháp có s?n trên m?i n?n t?ng, xin vui l?ng xem bài vi?t sau trong cơ s? ki?n th?c Microsoft:
95900: Thông tin liên l?c interprocess trên Windows NT, Windows 95 và Win32s

Thu?c tính

ID c?a bài: 177696 - L?n xem xét sau cùng: 19 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • 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 Windows 98 Standard Edition
  • Microsoft Win32 Application Programming Interface
  • Microsoft Windows Millennium Edition
T? khóa: 
kbapi kbhowto kbmt KB177696 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:177696

Cung cấp Phản hồi

 

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