السلام عليكم.
فكرة هذه التجربة هي كيفية مشاركة المعلومات بين برنامجين :)
و قد كتبت هذه التجربة بسبب سؤال وضع في هذا المنتدى لذلك أردت وضع مثال عن كيفية عمل ذلك في Visual C++:)
أولا هذه صورة للبرنامجين:

طبعا يوجد برنامجين الاول ( و اسمه Send ) يقوم بارسال البيانات إىل البرنامج الثاني ( و اسمه Recv ).
طبيعة البيانات التي يقوم البرنامج Send بارسالها هي احداثيات الماوس أثناء حركتها و يقوم البرنامج الثاني بعرض هذه الاحداثيات أي قمت بعملية نقل معلومات الاحداثيات من البرنامج الأول و عرضها في البرنامج الثاني.
فكرة البرنامجين بسيطة و تعتمد في أساسها على إنشاء منطقة ذاكرة مشتركة بين البرنامجين بحيث يستطيع البرنامجين التعامل معها و هذه الطريقة تسمى Memory mapped file و لاستخدام هذه الطريقة نستخدم أربعة توابع API و هي :
التابع الأولو هو من أجل إنشاء الذاكرة المشتركة:
HANDLE CreateFileMapping( HANDLE hFile, // handle to file LPSECURITY_ATTRIBUTES lpAttributes, // security DWORD flProtect, // protection DWORD dwMaximumSizeHigh, // high-order DWORD of size DWORD dwMaximumSizeLow, // low-order DWORD of size LPCTSTR lpName // object name );
البارامتر الأول نمرر له القيمة INVALID_HANDLE_VALUE و التي تحدد أننا نريد إنشاء Memory mapped file.
البارامتر الثاني له علاقة بال Security و إذا كان ممكن أن نورث هذه المنطقة إلى الأبناء.
البارامتر الثالث يحدد فيما إذا كنا نريد إنشاء المنطقة من أجل القراءة أو الكتابة أو مع بعضهما.
البارامترين الرابع و الخامس يحددان حجم هذه الذاكرة.
البارامتر السادس يحدد اسم هذه الذاكرة.
التابع الثاني و يستخدم لفتح ( الحصول على Handle ) الذاكرة المشتركة:
HANDLE OpenFileMapping( DWORD dwDesiredAccess, // access mode BOOL bInheritHandle, // inherit flag LPCTSTR lpName // object name );
البارامتر الأول وظيفته مثل البارامتر الثالث في التابع السابق.
البارامتر الثاني وظيفته مثل البارامتر الثاني في التابع السابق.
البارامتر الثالث يحدد اسم الذاكرة المشتركة المراد فتحهاو طبعا يتم استخدام أحد التابعين في أحد البرنامجين و يتم استخدام التابع الثاني في البرنامج الآخر أي يتم إنشاء الذاكرة في برنامج , و يتم فتح هذه الذاكرة في البرنامج الآخر.
التابع الثالث و وظيفته عمل Map لهذه الذاكرة ضمن ذاكرة البرنامج أي عملية ربط ذاكرة البرنامج مع الذاكرة المشتركة:
LPVOID MapViewOfFile( HANDLE hFileMappingObject, // handle to file-mapping object DWORD dwDesiredAccess, // access mode DWORD dwFileOffsetHigh, // high-order DWORD of offset DWORD dwFileOffsetLow, // low-order DWORD of offset SIZE_T dwNumberOfBytesToMap // number of bytes to map );
البارامتر الاول هو ال Handle الذي تعاد قيمته من التابعين الأول و الثاني.
البارامتر الثاني مثل البارامتر الثالث في التابع الأول.
البارامترات الثالث و الرابع و الخامس يحددون المنطقة التي سيتم عمل عملية Map لها.
التابع الرابع ووظيفته إغلاق الذاكرة المشتركة:
BOOL CloseHandle( HANDLE hObject // handle to object );
ليس هناك أوامر لارسال المعلومات بين البرنامجين و لكن البرنامج المرسل يقوم بوضع المعلومات في الذاكرة المشتركة و تصبح مسؤولية البرنامج المستقبل ان يفحص وجود بيانات جديدة في هذه الذاكرة .
شيفرة البرنامجين يمكن الحصول عليها من الوصلة التالية:
http://arabteam.nicmatic.com/adel/MemoryMa...MappedFiles.zip