Adlandırılmış Yöneltme'de bir <a0>Visual Basic</a0> 32-bit program'ı nasıl kullanılır

ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.

Makalenin İngilizcesi aşağıdaki gibidir:177696
Özet
Visual Basic, diğer işlemler için adlandırılmış kanallar aracılığıyla iletişim kuran uygulamalar oluşturabilirsiniz. Named Pipe Windows 2000 veya Windows NT üzerinde oluşturulması gerekir; ancak okuyabilir ve bu kanal için tüm 32 bitlik platform yazma.

Bu makalede, Visual Basic'te bir adlandırılmış yöneltme kullanarak istemci/sunucu iletişim gösterilmektedir.
Daha fazla bilgi
Bu makalede, the NamedPipe oluşturma işlemi, sunucu olarak adlandırılır ve adlandırılmış kanal için bağlanma işlemi istemci olarak adlandırılır.

Bir adlandırılmış yöneltme sunucusu oluşturmak için altı adım vardır:
  1. (Bir adlandırılmış yöneltme herhangi bir işlem ile bir kısıtlı erişim denetim listesi (sıfır girdiler var, DACL) bir güvenlik belirteci oluşturma tarafından kullanılabilmesi için <a0></a0>) erişim izni vermek bu kanal için bir güvenlik belirteci oluşturur.
  2. Adlandırılmış kanal oluşturun.
  3. Bir istemci bağlandıktan kadar engellemeye ConnectNamedPipe arayın.
  4. ReadFile WriteFile kanal iletişim kurmak için ve/veya arayın.
  5. Işlem tamamlandığında, DisconnectNamedPipe arama kanal kullanma.
  6. Her iki CloseHandle adlandırılmış yöneltme veya 4 adım geri gidin.
Named Pipe istemci bir adlandırılmış yöneltme kullanmak için üç adım bulunmaktadır:
  1. Adlandırılmış kanal için bir tanıtıcı elde etmek için CreateFile'ı çağırın.
  2. ReadFile WriteFile kanal iletişim kurmak için ve/veya arayın.
  3. CreateFile'de oluşturulan kodlayan üzerinde CloseHandle arayın.
Alternatif olarak, kanal bir defalık bir işlem gerçekleştiren CallNamedPipe çağrı. CallNamedPipe kanal açar, kendisine yazar, buradan okur ve sonra kanal kapatır. Istemci aşağıdaki yaptıklarını budur.

Aşağıdaki örnek bir adlandırılmış yöneltme sunucusu ve istemcisi nasıl oluşturulacağı gösterilmektedir. Bunu yalnızca hata denetimi en az bir tutar olarak bunu yapmak için gereken en gelişmemiş işlevleri gerçekleştirir. Tam işlevli BIR programı başarılı oldukları varsayılır yerine çaðrýlan apı ın dönüş değerlerini denetlemelisiniz.

Adlandırılmış yöneltme sunucusu

  1. Yeni bir proje oluşturun. Varsayılan olarak, Form1 oluşturulur.
  2. Form için aşağıdaki kodu ekleyin:
       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. Yeni bir modül oluşturun ve aşağıdaki bildirimleri ekleyin:
       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. Formu kaydedin.

Adlandırılmış yöneltme istemcisi

  1. Yeni bir proje oluşturun. Varsayılan olarak, Form1 oluşturulur.
  2. Aşağıdaki denetimleri forma ekleyin:
       Type             Name               Caption/Default Value   ----             ----               ---------------------   TextBox          cbBytes            500   CommandButton    cmdCallNamedPipe   Call Named Pipe   TextBox          txtReceive					
  3. Form için aşağıdaki kodu ekleyin:
       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. Sunucu, istemci olduğu dışındaki bir makine üzerinde çalışıyorsa, değiştirmeniz gerektiğini unutmayın '. ', sunucu bilgisayarın adı için bir değişken szPipeName.
  5. Formu kaydedin. Yukarıdaki kod sınamak için <a0></a0>, ilk sunucuyu başlatın ve herhangi bir yeri tıklatın. Sunucu uygulaması engelleme ve askıda görünmesini artık olsa da, istemcinin bağlanmak için gerçekte bekliyor. Sonra istemci uygulamasını başlatın ve "Arama adlandırılmış kanal."'ı tıklatın Istemci, değeri 500, 500 bayt veri ile yanıt verir sunucu için göndermelisiniz. 20000 Bayt için 0'dan cbBytes</a1> metin kutusuna değer ayarlayabilirsiniz. Sunucuyu durdurmak için <a0></a0>, <a1>0</a1> (sıfır) yalnızca istemciden gönderin. Istemci, <a1>hata</a1> (ERROR_PIPE_NOT_CONNECTED) 233 alabilirsiniz, ancak bu normaldir.

    Örnek için başka bir geliştirme, GÇ Tamamlama bağlantı noktaları ve/veya olmayan engelleme okuma kullanımı içerebilir ve örtüşen GÇ kullanarak yazar. Bu konular hakkında daha fazla bilgi, Microsoft Platform SDK'DA bulabilirsiniz.
Referanslar
Windows 2000, <a2>Windows NT</a2> ve <a4>Windows 95, birden çok işlemi arasında tek yönlü veya çift yönlü aktarımı veri sağlayan çeşitli InterProcess iletişim (IPC) yöntemleri vardır. Her bir platformda kullanılabilir yöntemleri IPC tam bir listesi için lütfen Microsoft Knowledge Base'de aşağıdaki makaleye bakın:
95900: Windows NT, Windows 95 ve Win32s işlemler arası iletişim

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 177696 - Son İnceleme: 02/12/2007 19:08:32 - Düzeltme: 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 Uygulama Programlama Arabirimi, the operating system: Microsoft Windows 2000, Microsoft Windows 95, Microsoft Windows Millennium Edition

  • kbmt kbapi kbhowto KB177696 KbMttr
Geri bildirim