استرداد صورة نقطية عن بُعد ، باستخدام مقبض Hbitmap في C#

StackOverflow https://stackoverflow.com/questions/3674638

  •  01-10-2019
  •  | 
  •  

سؤال

انا املك MarshalByRefObject وهو ما كنت بحاجة لتسلسله وتخزينه (في قاعدة بيانات) ، حتى أتمكن من إلغاء تخصيصه والرجوع إليه لاحقًا. لقد اخترت الاقتراب من هذا بشكل مختلف: الآن أقوم بتشغيل خدمة Windows التي تبقي ببساطة MarshalByRefObjects "على قيد الحياة" (يرجى ملاحظة أن RemoteObject هو في الواقع كائن طرف ثالث ، لا أخلق نفسي):

// This is the object which extends the MarshalByRefObject class
RemoteObject myRemoteObject = new RemoteObject;

TcpServerChannel channel = new TcpServerChannel(6789);
ChannelServices.RegisterChannel(channel, true);

ObjRef objRef = RemotingServices.Marshal((System.MarshalByRefObject)myRemoteObject, id);

في appdomain آخر ، أقوم ببساطة بتوصيل الكائن واسترداده ؛ كل شيء يعمل بشكل جيد:

RemoteObject myLocalObject = (FCEngine.IFCVerificationSession)Activator.GetObject(
                           typeof(FCEngine.IFCVerificationSession),"tcp://localhost:6789/" + id);

الآن المشكلة هي أن RemoteObject يحتوي على خاصية هي ببساطة HBITMAP مقبض يلقي إلى long يكتب. يمكنني استرداد المقبض بسهولة. عادة (محليا) سأفعل:

IntPtr hbitmap = (IntPtr)myLocalObject.ContextImage;
System.Drawing.Bitmap bmp = System.Drawing.Image.FromHbitmap(hbitmap);

هذا لا يعمل في الحالة الحالية. أحصل على System.Runtime.InteropServices.ExternalException أعتقد أن المشكلة هي ذلك hbitmap هو مقبض لبعض الذاكرة التي لا توجد في AppDomain المحلي ، ولكن في AppDomain خدمة Windows. سؤالي هو ما هي خياراتي:

  • ال RemoteObject هو معقد جدا ، إنه يشبه الشجرة التي تعبر فيها العقد عن طريق استدعاء وظائفها. يفرض الطرف الثالث أنه لا يمكنني اجتياز الكائن إلا مرة واحدة. لذا فإن اجتياز خدمة تكنولوجيا المعلومات ، وتخزين نقطات في قاعدة بيانات ، وعبورها عن بعد مرة أخرى لن يعمل.
  • ستكون المثالية أن تكون قادرًا على استدعاء وظيفة في خدمة Windows ، وتمرير مقبض HbitMap كوسيطة ، وإعادة رسم النقطات الفعلي. هذا غير ممكن في خدمات Windows.
  • يمكنني تخزين المقبض في قاعدة بيانات وجعل استطلاع خدمة Windows Service قاعدة البيانات الخاصة به. يمكن بعد ذلك استرداد صورة نقطية وتخزينها في نفس ديسيبل بالنسبة لي. يمكنني بعد ذلك استرداد هذا النقطية عن بعد. هذا قبيح للغاية ، لأنني بحاجة إلى صورة نقطية على الفور.

في الأساس ، أود أن أعرف ما إذا كان لديك اقتراحات لعدم اضطرارها إلى إجراء اختراقات قبيحة مثل الخيار الثالث ... ما هي خياراتي؟

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

هل كانت مفيدة؟

المحلول

Hbitmap هو مقبض ، وليس له أي معنى لتسلسل المقابض غير المدارة. تحتاج إلى تسلسل محتوى Bitmap ، وإعادة إنشائها (صورة نقطية) على جانب بعيد ، ثم إعادة تعيين HbitMap التي تم إنشاؤها حديثًا.

PS PS جسديًا هو مؤشر للمؤشر ، يتم تطبيق قيمته فقط تم إنشاء مساحة العنوان.

برأيي المتواضع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top