Použití Named Pipes 32bitové programu Visual Basic

Překlady článku Překlady článku
ID článku: 177696 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Jazyka můžete vytvářet aplikace komunikovat jiné procesy prostřednictvím služby Pipes. Pojmenovaného kanálu musí být vytvořen na Windows 2000 nebo Windows NT; však čtení a zápisu, že kanálu z jakékoli 32bitové platformě.

Tento článek demonstruje komunikace klient server pomocí pojmenovaného kanálu jazyka.

Další informace

V tomto článku NamedPipe vytváření proces se nazývá server a připojení k pojmenovanému kanálu proces se nazývá klient.

Existuje šest kroků k vytvoření serveru pojmenovaného kanálu:
  1. Vytvoření tokenu zabezpečení pro kanál umožnit přístup k jeho (pojmenovaného kanálu zpřístupnit k libovolnému procesu vytvořením token zabezpečení s volitelný Access Control seznam (DACL) obsahující nulové položky).
  2. Vytvoření pojmenovaného kanálu.
  3. Volání ConnectNamedPipe blokovat dokud připojení klienta.
  4. Zavolejte funkci ReadFile nebo WriteFile komunikovat prostřednictvím kanálu.
  5. Po dokončení procesu volání DisconnectNamedPipe pomocí kanálu.
  6. Buď CloseHandle na pojmenovaného kanálu nebo přejděte ke kroku 4.
Existují tři kroky pomocí pojmenovaných kanálů z pojmenovaných kanálů klienta:
  1. Volání CreateFile získat popisovač pojmenovaného kanálu.
  2. Zavolejte funkci ReadFile nebo WriteFile komunikovat prostřednictvím kanálu.
  3. Volat CloseHandle vytvořen CreateFile filehandle.
Případně by volání CallNamedPipe, který provádí jednorázové transakce prostřednictvím kanálu. CallNamedPipe otevře kanálu, zapíše jej, přečte z něj a potom zavře kanálu. Toto je níže klienta provádí.

Následující příklad znázorňuje způsob vytvoření pojmenovaného kanálu Server a klient. Implementuje pouze nejčastěji rudimentary funkce potřebné k tomu, s minimální množství pro kontrolu chyb. Plně funkční program zkontrolujte vrácené hodnoty API, které jsou volány, nikoli za předpokladu, že byly úspěšné.

Pojmenovaný server kanálu

  1. Vytvoření nového projektu. Jako výchozí je vytvořen formulář Form1.
  2. Přidejte následující kód formuláře:
       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. Vytvořte nový modul a přidejte následující deklarace:
       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. Formulář uložit.

Pojmenovaný kanál klienta

  1. Vytvoření nového projektu. Jako výchozí je vytvořen formulář Form1.
  2. Přidejte následující ovládací prvky formuláře:
       Type             Name               Caption/Default Value
       ----             ----               ---------------------
       TextBox          cbBytes            500
       CommandButton    cmdCallNamedPipe   Call Named Pipe
       TextBox          txtReceive
    					
  3. Přidejte následující kód formuláře:
       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. Poznámka: Pokud je server spuštěn v počítači, než je klient, je třeba změnit '. ' v proměnné szPipeName k názvu počítače serveru.
  5. Formulář uložit. Chcete-li otestovat kód výše, nejprve spustit server a klepněte na libovolné místo ve formuláři. Aplikace serveru je nyní blokování a zobrazí se mají neodpovídá, ale ve skutečnosti čeká pro připojení klienta. Potom spusťte klientské aplikace a klepněte "volání název kanálu." Klient by měl odeslat na server odpoví 500 bajtů dat hodnota 500. Můžete nastavit hodnotu v textovém poli cbBytes od 0 do 20000 bajtů. Zastavení serveru, jednoduše odeslat 0 (nula) z klienta. Klient může přijímat chyba 233 (ERROR_PIPE_NOT_CONNECTED), ale toto je normální.

    Jiná zlepšení ukázkové může zahrnovat použití IO dokončování porty a blokování bez čtení a zápisu IO překrytím pomocí. Další informace o tyto subjekty můžete najít v Microsoft Platform SDK.

Odkazy

Několik metod InterProcess komunikace (IPC) jsou k dispozici v systému Windows 2000, Windows NT a Windows 95 povolit jednosměrný nebo obousměrný přenos dat mezi více procesy. Úplný seznam IPC metody na každý platformě k dispozici naleznete v následujícím článku databáze Microsoft Knowledge Base:
95900: Meziprocesové komunikace na Windows NT, Windows 95 a Win32s

Vlastnosti

ID článku: 177696 - Poslední aktualizace: 12. února 2007 - Revize: 2.4
Informace v tomto článku jsou určeny pro produkt:
  • 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 Service Pack 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
Klíčová slova: 
kbmt kbapi kbhowto KB177696 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:177696

Dejte nám zpětnou vazbu

 

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