Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để sử dụng tên đường ống trong một chương trình 32-bit Visual Basic

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
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ácbằ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 trongVisual 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 giangiao 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àmVì 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ăngnê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áchì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ácgiá 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ácmáy chủ, chỉ đơn giản là gửi 0 (Zero) từ khách hàng. Khách hàng có thể nhận đượclỗ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ànhCổ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) trongWindows 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

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 177696 - Xem lại Lần cuối: 08/19/2011 10:34:00 - Bản sửa đổi: 2.0

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

  • kbapi kbhowto kbmt KB177696 KbMtvi
Phản hồi