Momentálne ste offline a čaká sa, kým sa znova pripojíte na internet

Ako používať rozhrania Named Pipes v 32-bitového programu Visual Basic

DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:177696
SUHRN
Jazyka Visual Basic môžete vytvoriť aplikácie, ktoré oznámia iných procesovv Named Pipes. Named Pipe musí byť vytvorený pre systém Windows 2000 alebo Windows NT; však môžete čítať a zapisovať do tohto presmerovania zakékoľvek 32-bitové platformy.

Tento článok ukazuje klient/Server komunikáciu pomocou Named Pipe vJazyka Visual Basic.
DALSIE INFORMACIE
V tomto článku, proces vytvárania NamedPipe sa nazýva server,a proces pripojenie pomenovaného presmerovania sa nazýva klient.

Existuje šesť krokov k vytvoreniu server pomenovaného presmerovania:
  1. Vytvoriť token zabezpečenia pre presmerovanie na umožnenie prístupu k nej (na vytvorenie Named Pipe sprístupniť akýkoľvek proces vytvorením token zabezpečenia s Diskrečné prístup kontroly zoznamu DACL že nemá nulové položky v ňom).
  2. Vytvoriť pomenované presmerovanie.
  3. Volajte ConnectNamedPipe blokovať dovtedy, kým sa klient pripojí.
  4. Volajte službu ReadFile a/alebo WriteFile na komunikáciu cez potrubia.
  5. Volať DisconnectNamedPipe po dokončení procesu pomocou presmerovania.
  6. Buď CloseHandle na pomenované presmerovanie alebo prejdite späť na krok 4.
Existujú tri kroky používať Named Pipe od Named Pipe klienta:
  1. Zavolajte CreateFile získať popisovača k Named Pipe.
  2. Volajte službu ReadFile a/alebo WriteFile na komunikáciu cez potrubia.
  3. Volať CloseHandle o filehandle vytvorené v CreateFile.
Alternatívne mohol zavolať CallNamedPipe, ktoré vykonáva jednorazovýtransakciu cez potrubia. CallNamedPipe otvorí potrubia, píšečíta z neho, potom zatvorí potrubia. Je to, čo robí nižšie klienta.

Tieto vzorky demonštruje ako vytvoriť pomenovaný potrubné servera aKlient. Implementuje len najviac primitívne funkcie potrebné urobiťTakže, s minimálnu veľkosť kontroly chýb. Plne funkčné programmali skontrolovať návratu hodnôt API je že sa nazývajú, skôr akoza predpokladu, že boli úspešné.

Pomenované rúry Server

  1. Vytvoriť nový projekt. Form1 sa vytvorí na základe predvoleného nastavenia.
  2. Pridajte nasledovný kód do formulára:
       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. Vytvoriť nový modul a pridať nasledujúce vyhlásenia:
       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. Uložte formulár.

Pomenované rúry klienta

  1. Vytvoriť nový projekt. Form1 sa vytvorí na základe predvoleného nastavenia.
  2. Do formulára pridajte nasledujúce kontroly:
       Type             Name               Caption/Default Value   ----             ----               ---------------------   TextBox          cbBytes            500   CommandButton    cmdCallNamedPipe   Call Named Pipe   TextBox          txtReceive					
  3. Pridajte nasledovný kód do formulára:
       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. Všimnite si, že ak je na serveri spustená na stroji, než v ktorom klient je, budete musieť zmeniť "." v premennej szPipeName na názov server stroj.
  5. Uložte formulár.Otestovať vyššie uvedený kód, najprv spustite server a kliknite kdekoľvek naformulár. Serverová aplikácia je teraz blokovanie a zobrazí nereaguje,ale skutočne čaká na klient pre pripojenie. Potom spustite klientaaplikácie a kliknite na "Hovor s názvom Pipe." Klient by mal poslaťhodnota 500 na server, ktorý bude reagovať s 500 bajtov údajov. Môžetenastavte hodnotu v textovom poli cbBytes z 0 na 20000 bajtov. ZastaviťServer, jednoducho odoslať 0 (nula) od klienta. Klient obdržaťChyba 233 (ERROR_PIPE_NOT_CONNECTED), ale to je normálne.

    Ďalším zlepšením vzorky môže zahŕňať použitie IO dokončeniePrístavy a/alebo Non-zablokovanie číta a zapisuje pomocou prekrývali IO. Môžeteviac informácií o týchto témach nájsť v platforme Microsoft SDK.
ODKAZY
Existuje niekoľko spôsobov InterProcess komunikácie (IPC) k dispozícii vSystém Windows 2000, Windows NT a Windows 95 umožniť jednosmerné alebo obojsmerné prenos údajov medzi viaceré procesy. Pre úplný zoznam IPC metódy k dispozícii na každej platforme, pozri nasledujúci článok v databáze Microsoft Knowledge Base:
95900: Procesmi, komunikácia na systém Windows NT, Windows 95 a Win32s

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 177696 – Posledná kontrola: 10/18/2011 11:21:00 – Revízia: 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 KbMtsk
Pripomienky