أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية استخدام توجيهات الإخراج في برنامج 32-بت Visual Basic المسماة

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية177696
الموجز
يمكن إنشاء Visual Basic للتطبيقات التي تتصل إلى عمليات أخرى من توجيهات. يجب إنشاء "توجيه إخراج مسمى" على Windows 2000 أو Windows NT; ومع ذلك، يمكنك قراءة من ثم كتابة إلى التوجيه هذا من أي نظام أساسي 32-بت.

توضح هذه المقالة اتصال العميل/الملقم باستخدام "أنبوبة الاتصال المسماة" في Visual Basic.
معلومات أخرى
في هذه المقالة تسمى عملية إنشاء NamedPipe في الملقم ثم تسمى عملية الاتصال بتوجيه الإخراج العميل.

هناك ستة الخطوات لإنشاء ملقم توجيه إخراج مسمى:
  1. إنشاء رمز مميز أمان التوجيه للسماح بالوصول إليه (لتوفير "أنبوبة الاتصال المسماة" أي عملية عن طريق إنشاء رمز أمان مميز مع المستقل Access التحكم قائمة (DACL) يحتوي على صفر الإدخالات الموجودة به).
  2. إنشاء توجيه إخراج مسمى.
  3. استدعاء ConnectNamedPipe لحظر حتى يصل عميل.
  4. استدعاء و/ReadFile أو WriteFile إلى الاتصال عبر التوجيه.
  5. استدعاء DisconnectNamedPipe عند الانتهاء من العملية استخدام توجيه الإخراج.
  6. إما CloseHandle على توجيه إخراج مسمى أو انتقل إلى الخطوة 4.
هناك ثلاث خطوات استخدام "أنبوبة الاتصال المسماة" من عميل "أنبوبة الاتصال المسماة":
  1. استدعاء CreateFile الحصول على مؤشر إلى "أنبوبة الاتصال المسماة".
  2. استدعاء و/ReadFile أو WriteFile إلى الاتصال عبر التوجيه.
  3. استدعاء CloseHandle على filehandle إنشاؤها في CreateFile.
بدلاً من ذلك، قد استدعاء CallNamedPipe تنفيذ معاملة لمرة واحدة عبر التوجيه. CallNamedPipe يفتح التوجيه ، يكتب عليه ، يقرأ منه ، ثم إغلاق توجيه الإخراج. وهذا ما يقوم العميل أدناه.

يوضح النموذج التالي كيفية إنشاء "ملقم أنبوبة الاتصال المسماة" عميل. فإنه يطبق فقط على الأكثر rudimentary من الدالات الضرورية للقيام بذلك مع مقداراً من تدقيق الأخطاء. يجب أن تحقق برنامج تام قيم الإرجاع API الخاص تسمى بدلاً من افتراض كانت ناجحة.

ملقم أنبوبة الاتصال المسماة

  1. إنشاء مشروع جديد. يتم إنشاء Form1 بشكل افتراضي.
  2. إضافة التعليمات البرمجية التالية إلى النموذج:
       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. إنشاء وحدة نمطية جديدة وإضافة التعريفات التالية:
       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. قم بحفظ النموذج.

عميل أنبوبة الاتصال المسماة

  1. إنشاء مشروع جديد. يتم إنشاء Form1 بشكل افتراضي.
  2. إضافة عناصر التحكم التالية بالنموذج:
       Type             Name               Caption/Default Value   ----             ----               ---------------------   TextBox          cbBytes            500   CommandButton    cmdCallNamedPipe   Call Named Pipe   TextBox          txtReceive					
  3. إضافة التعليمات البرمجية التالية إلى النموذج:
       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. لاحظ أنه إذا كان الملقم قيد التشغيل على جهاز آخر غير حيث يكون العميل تحتاج إلى تغيير '. ' في szPipeName متغير إلى اسم جهاز الملقم.
  5. قم بحفظ النموذج. لاختبار التعليمة البرمجية أعلاه أولاً بدء تشغيل الملقم ثم انقر فوق أي مكان على النموذج. تطبيق الملقم الآن بحظر وسيظهر أن يكون لديك معلق ولكن فعلياً بانتظار العميل للاتصال. ثم بدء تشغيل تطبيق عميل وانقر فوق أنبوبة في "مكالمة مسمى الاتصال." يجب على العميل إرسال القيمة 500 إلى الخادم الذي سيستجيب مع 500 بايت من البيانات. يمكنك تعيين القيمة في مربع النص cbBytes من 0 إلى 20000 بايت. لإيقاف الملقم ببساطة بإرسال 0 (صفر) من العميل. قد يتلقى العميل خطأ 233 (ERROR_PIPE_NOT_CONNECTED) ولكن وهذا عادي.

    قد تتضمن الاستخدام و/منافذ إكمال IO أو الحظر بدون "قراءات" التحسين آخر إلى النموذج ثم الكتابة باستخدام IO متراكب. يمكنك العثور على مزيد من المعلومات حول هذه الموضوعات في Microsoft Platform SDK.
مراجع
توجد عدة أساليب الاتصال InterProcess (IPC) في Windows 2000 و Windows NT و Windows 95 تسمح أحادية الاتجاه أو ثنائية الاتجاه نقل البيانات بين عمليات متعددة. للحصول على قائمة كاملة أساليب IPC المتوفرة في كل نظام أساسي الرجاء مراجعة المقالة التالية في "قاعدة المعارف لـ Microsoft:
95900: اتصال interprocess على Win32s و Windows 95 أو Windows NT

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 177696 - آخر مراجعة: 02/12/2007 19:08:32 - المراجعة: 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 واجهة برمجة تطبيقات, the operating system: Microsoft Windows 2000, Microsoft Windows 95, Microsoft Windows Millennium Edition

  • kbmt kbapi kbhowto KB177696 KbMtar
تعليقات
&t=">html>/html>