Teď jste offline a čekáte, až se znova připojí internet.

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

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
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

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 177696 - Poslední kontrola: 02/12/2007 19:08:32 - Revize: 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 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

  • kbmt kbapi kbhowto KB177696 KbMtcs
Váš názor
html>cript> /html>