Sunday, April 28, 2024

विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट पार्ट-2 | Visual Basic Component Object – Best Info

Table of Contents

विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट क्या है एवं कार्य – कॉम, कॉम+, डॉट नेट तथा ओ.एल.ई. | COM, COM+, .NET and OLE

विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट – कॉम, कॉम+, डॉट नेट तथा ओ.एल.ई.परिचय (Introduction) – इस आर्टिकल को पढ़ने के बाद आप यदि पहले से विजुअल बेसिक प्रोग्रामर है तो यह जान जायेंगे कि विजुअल बेसिक में किया गया कोड संग्रह व्यर्थ नहीं जाने वाला है। इस लेख में कम्पोनेण्ट ऑब्जेक्ट मॉडल, कॉम+, डॉट नेट, ओ.एल.ई को विस्तार से रोचकपूर्वक समझाया गया है।

इस पार्ट में हम जानेंगे – डॉट नेट असेम्बली बनाना (Creating the Net Assembly), की युग्म बनाना तथा असेम्बली को साइन करना (Creating a Key and Signing the Assembly), असेम्बली को रजिस्टर करना तथा टाइप लायब्रेरी को बनाना, ग्लोबल असेम्बली कैश में असेम्बली को जोड़ना, डॉट नेट क्लास को कॉल करने के लिए विजुअल बेसिक 6.0 कोड लिखना, डॉट नेट क्लाइण्टस से कॉम कम्पोनेण्ट्स को कॉल करना, अनमैनेज्ड कोड तथा रनटाइम कॉलेबल रैपर्स के बारे में

डॉट नेट असेम्बली बनाना (Creating the .Net Assembly)

पब्लिक क्लास के साथ डॉट नेट असेम्बली बनाने के लिए निम्नलिखित पदों का अनुसरण करें –

  1. विजुअल स्टूडियो खोलें।
  2. File मेन्यू से New Project… को क्लिक करें।
  3. तत्पश्चात् New Project डायलॉग बॉक्स खुलेगा।
  4. डायलॉग बॉक्स के बायीं ओर Project types: खण्ड में Windows का चयन करें।
  5. Templates खण्ड में Class Library का चयन करें।
  6. Name टेक्स्टबॉक्स में एप्लिकेशन का नाम PhysServer2 दें तथा प्रोजेक्ट बनाने के लिए OK को क्लिक करें। 
  7. सॉल्यूशन एक्सप्लोरर से Class1. Vb को दायाँ क्लिक करें तथा पॉप पप मेन्यू से Rename का चयन कर इसका नाम NETTemperature.vb बदलें।
  8. NETTemperature.vb को दो बार क्लिक कर कोड डिज़ायनर में पहले के कोड को मिटाकर निम्नलिखित कोड लिखें –

Public Interface iTemperature

Property Celsius() As Double
Property Fahrenheit() As Double
Function GetCelsius() As Double
Function GetFahrenheit() As Double
End Interface

Public Class NET_Temperature
Implements iTemperature

Private mdblCelsius As Double
Private mdbl Fahrenheit As Double
Public Property Celsius As Double Implements iTemperature.Celsius
Get
Celsius = mdblCelsius

End Get
Set (ByVal Value As Double)
mdblCelsius = Value
mdblFahrenheit = ((Value * 9)/5) + 32
End Set

End Property
Public Property Fahrenheit() As Double Implements iTemperature.Fahrenheit
Get
Fahrenheit = mdblFahrenheit 

End Get
Set (ByVal Value As Double)
mdblFahrenheit = Value
mdblCelsius ((Value -32) * 5) /9)
End Set
End Property
Public Function GetCelsius() As Double Implements iTemperature .GetCelsius
GetCelsius mdblCelsius
End Function
Public Function GetFahrenheit As Double Implements iTemperature.GetFahrenheit
GetFahrenheit mdblFahrenheit
End Function
End Class

कोड की शुरूआत iTemperature नामक इंटरफेस को परिभाषित करने से होता है, क्योंकि इंटरफेस को डिफाइन Public की-वर्ड के साथ किया गया है। इसको उस टाइप लायब्रेरी में निर्यात कर दिया जायेगा, जो आप इस असेम्बली से बनाएँगे। आप इंटरफेस की परिभाषा को पूरे या आशिक क्लास परिभाषा के ढाँचा (skeleton) के रूप में समझ सकते हैं। इंटरफेस की परिभाषा में क्लास की ही तरह प्रॉपर्टी, मेथड, फंक्शन, सबरूटीन्स तथा इवेण्ट हो सकते हैं, परन्तु क्लास के विपरीत इंटरफेस परिभाषा में इन सदस्यों के लिए कोड नहीं होता है। क्लास एक इंटरफेस या एक से अधिक इंटरफेस को लागू कर सकता है।

यह भी देखें :  कम्प्यूटर की मूल संरचना | Basic Structure Of Computer – Best Info In Hindi

यह कोड NET_Temperature क्लास को परिभाषित करता है जो iTemperature इंटरफेस का उपयोग करता है। विशेषकर क्लास परिभाषा में यह लाइन क्लास तथा इंटरफेस के बीच एक संधि (contract) को स्थापित करता है –
Implements                   iTemperature

यह कॉन्ट्रैक्ट कहता है कि क्लास इंटरफेस के सभी सदस्यों को लागू करेगा। इसके और अन्य सदस्य भी हो सकते हैं जो इंटरफेस का हिस्सा नहीं हैं, लेकिन जब आप ऐसे किसी क्लास को बनाने का प्रयास करते हैं जो इंटरफेस को पूर्णतः लागू नहीं करता है, तब आपको त्रुटि प्राप्त होता है।

ध्यान दें  – यह क्लास दो पब्लिक प्रॉपर्टी तथा दो पब्लिक मेथड को एक्स्पोज़ (expose) करता है। उस प्रारूप पर ध्यान दें जिसका उपयोग उस इंटरफेस के सदस्यों के जिसे वह क्लास लागू करता है के साथ उस क्लास के सदस्यों को संबद्ध करने में होता है। उदाहरण के लिए NET_Temperature क्लास में Celsius प्रॉपर्टी को परिभाषित इस तरह से किया जाता है –
Public Property Celsius() As Double Implements iTemperature.Celsius
कोड का उपरोक्त लाइन एक प्रॉपर्टी को परिभाषित करता है, जो Double लौटाता है तथा कम्पाइलर को यह बताता है कि यह प्रॉपर्टी iTemperature इंटरफेस के अंदर Celsius प्रॉपर्टी का कार्यान्वयन (implementation) है।

विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट क्या होता है एवं कार्य – कॉम, कॉम+, डॉट नेट तथा ओ.एल.ई. | COM, COM+, .NET and OLE

विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट क्या है एवं कार्य - कॉम, कॉम+, डॉट नेट तथा ओ.एल.ई. | COM, COM+, .NET and OLE
विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट क्या है एवं कार्य – कॉम, कॉम+, डॉट नेट तथा ओ.एल.ई. | COM, COM+, .NET and OLE

की युग्म बनाना तथा असेम्बली को साइन करना (Creating a Key and Signing the Assembly)

असेम्बली को ग्लोबल स्तर पर उपलब्ध कराने के लिए आपको की युग्म बनाने की आवश्यकता होती तथा इसे उपयोग करने के लिए असेम्बली को साइन (sign) करना होता है। इसके अतिरिक्त आप असेम्बली में शीर्षक (title) तथा विवरण (description) जोड़कर असेम्बली के साथ कार्य करना अधिक आसान बना सकते हैं।

असेम्बली को साइन करने के लिए आप sn यूटिलिटि को रन कर सकते हैं और की (key) फाइल का नाम स्वयं जोड़ सकते हैं या फिर आप स्ट्राँग नाम बनाने के लिए विजुअल स्टूडियो डॉट नेट यूजर इंटरफेस का उपयोग कर सकते हैं। हम यहाँ बाद वाले विधि (स्ट्राँग नाम बनाने की विधि) का उपयोग करेंगे। इसको करने के लिए इन पदों का अनुसरण करें-

  • विजुअल स्टूडियो डॉट नेट में सॉल्यूशन एक्स्प्लोरर से AssemblyInfo.vb को दो बार क्लिक कर इसे एडिटिंग विण्डो में खोलें।
  • इस फाइल के सबसे ऊपर Assembly Attributes खण्ड में AssembyTitle तथा AssemblyDescription में संशोधन कर यह लिखें –
    <Assembly : Assembly Title (“PhysServer2”)>
    <Assembly Assembly Description (“.NET Version of PhyServer”)>
    टिप : विजुअल बेसिक डॉट नेट का Assembly Attributes खण्ड विजुअल बेसिक के Project Properties के समान है।
  • सॉल्यूशन एक्स्प्लोरर में प्रोजेक्ट नोड को दायाँ क्लिक करें तथा Properties का चयन करें। Common Properties फोल्डर को क्लिक करें तथा फिर Strong Name प्रॉपर्टी पेज को क्लिक करें। Generate Strong Name Using बॉक्स का चयन करें। Generate Key को क्लिक कर की फाइल (key file) जेनेरेट करें तथा अपने प्रोजेक्ट में जोड़े। प्रॉपर्टी डायलॉग बॉक्स को बंद करने के लिए OK को क्लिक करें।
  • अब आप असेम्बली बनाने के लिए तैयार है। Build को क्लिक करें या Ctrl + Shift + B दबाकर सफलतापूर्वक असेम्बली बनाऐं।

असेम्बली को रजिस्टर करना तथा टाइप लायब्रेरी को बनाना (Registering the Assembly and Creating a Type Library)

अब आप नये असेम्बली तथा NET_Temperature क्लास का उपयोग अन्य डॉट नेट एप्लिकेशन से कर सकते हैं, लेकिन आपको अभी भी अपने कॉम एप्लिकेशनों में अपने क्लास तथा इसके सदस्यों को उपलब्ध कराना शेष है। इसके लिए विजुअल स्टूडियो डॉट नेट कमाण्ड प्रॉम्प्ट को खोलें। तथा इन पदों का अनुसरण करें-

  1. Start को क्लिक करें।
  2. All Programs को इंगित करें।
  3. Microsoft Visual Studio 2005 को इंगित करें तथा Visual Studio. Net Tools को इंगित करें और Visual Studio.NET Command Prompt का चयन करें। प्रोजेक्ट डायरेक्ट्री को PhysServer2 से बदलने के लिए यह टाइप करें-
    regasm / tlb: PhysServer2.tlb PhysServer2.dll
यह भी देखें :  डॉट नेट फ्रेमवर्क क्या है | Best Info .Net Framework Features

regasm यूटिलिटि एक टाइप लायब्रेरी का निर्माण करेगा तथा आपके विण्डोज रजिस्ट्री में इसको रजिस्टर कर PhysServer2.dll के क्लास को कॉम क्लाइन्टस में उपलब्ध करायेगा।

ग्लोबल असेम्बली कैश में असेम्बली को जोड़ना (Adding the Assembly to the Global Assembly Cache)

अंततः सभी कॉम क्लाइण्टस को ग्लोबल स्तर पर नये रजिस्टर किये गये असेम्बली में उपलब्ध कराने के लिए चाहे वे आपके हार्ड ड्राइव में कहीं भी हो, विजुअल स्टूडियो डॉट नेट कमाण्ड प्रॉम्प्ट में वापस आकर यह टाइप करें- gacutil/ I PhysServer2.dll
gacutil यूटिलिटि जी. ए. सी. (GAC) में असेम्बली को जोड़ेगा तथा स्टेटस संदेश को प्रदर्शित करके यह बताएगा कि यह कार्य हो चुका है।

डॉट नेट क्लास को कॉल करने के लिए विजुअल बेसिक 6.0 कोड लिखना (Writing Visual Basic 6.2 Code to call the .Net Class)

अब आप NET_Temperature क्लास को उपयोग करने के लिए कॉम क्लाइण्ट लिखने को तैयार है। इसके लिए इन पदों का अनुसरण करें –

  1. विजुअल बेसिक 6.0 खोलें तथा New Project डायलॉग बॉक्स में New टैब को क्लिक करें।
  2. Standard Exe का चयन करें तथा Open को क्लिक करें। 
  3. प्रोजेक्ट एक्स्प्लोरर विण्डो में Forml नाम के फॉर्म को हाइलाइट कर दायाँ क्लिक करें और Rename का चयन करें तथा इसका नाम बदलकर frmTemperature करें।
  4. फॉर्म पर सभी कंट्रोल को जोड़ें तथा इस प्रकार से उनके प्रॉपर्टी का मान बदलें।
कंट्रोलप्रॉपर्टीमान
लेबलNameIbl Fahrenheit
 TextFahrenheit
टेक्स्टबॉक्सNametxtFahrenheit
 Textरिक्त
बटनNamebtnConvertToC
 TextConvert to C
लेबलNamelblCelsius
 TextCelsius
टेक्स्टबॉक्सNametxtCelsius
 Textरिक्त
बटनNamebtnConvertoF
 TextConvert to F
  • PhysServer2 में क्लास को कॉम कॉलेबल रैपर के माध्यम से उपयोग करने के लिए Project को क्लिक करें तथा References को क्लिक करें। तत्पश्चात् References डायलॉग बॉक्स खुलेगा। PhysServer के डॉट नेट संस्करण के रेफ्रेन्स का चयन करें । OK क्लिक कर इस डायलॉग बॉक्स को बंद कर दें।

अब आप कोड लिखने के लिए तैयार हैं जो NET_Temperature क्लास के मेथड तथा प्रॉपर्टी का उपयोग करता है। View मेन्यू को क्लिक करें तथा Code को क्लिक करें और frmTemperature के लिए फॉर्म मॉडयूल में इस कोड को लिखें-

Private moTempClass As PhysServer2.NET TEMPERATURE
Private moTemp As PhysServer2.iTemperature
Private Sub btnConvertToC_Click ()
With moTemp

Fahrenheit txtFahrenheit. Text
txtCelsius Text=. GetCelsius
End With
End Sub
Private Sub btnConvertToF_Click ()
With mo Temp

.Celsius = txtCelsius. Text
txtFahrenheit. Text = .GetFahrenheit
End With
End Sub
Private Sub Form_Load ( )

Set moTempClass = New PhysServer2.NET_TEMPERATURE
Set moTemp = moTempClass
End Sub

यह याद रखें कि डॉट नेट प्रोजेक्ट में आपने iTemperature इंटरफेस का उपयोग कर Net_Temperature को परिभाषित किया है। उपरोक्त कोड दर्शाता है कि किस प्रकार आप ऑब्जेक्ट में वापस इंटरफेस (moTemp नामक ऑब्जेक्ट की तरह व्यक्त किया गया) को प्राप्त कर सकते हैं। यद्यपि यह अतिरिक्त कोड की तरह दिखता है। यदि आप इसे विजुअल बेसिक में प्रयोग करेंगे तो पायेंगे कि ऑब्जेक्ट के साथ कार्य करने में कहीं अधिक इंटरफेस के साथ कार्य करना सुविधायुक्त होता है। इसीलिए इंटरफेस माइक्रोसॉफ्ट इंटेलिसेन्स कमाण्ड कम्पलीशन को सपोर्ट करता है। NET_TEMPERATURE को कार्य करते हुए देखने के लिए इन पदों का अनुसरण करें –

  1. F5 दबाकर प्रोजेक्ट को शुरू करें।
  2. Fahrenheit टेक्स्ट बॉक्स में 95 प्रविष्ट करें तथा Convert to C को क्लिक करें। Celsius बॉक्स में 35 दिखेगा।
  3. फिर, Celsius बॉक्स में -14 टाइप करें तथा Convert to F क्लिक करें। Fahrenheit बॉक्स में 6.8 प्रकट होना चाहिए।
  4. प्रोजेक्ट को रोकने के लिए फॉर्म को बंद करें।
यह भी देखें :  विजुअल बेसिक कम्पोनेण्ट ऑब्जेक्ट पार्ट-1 | Visual Basic Component Object - Best Info

निस्संदेह विजुअल बेसिक 6.0 से डॉट नेट कम्पोनेन्ट्स को कॉल करने की पूरी प्रक्रिया नयी है क्योंकि विजुअल बेसिक 6.0 के रिलीज होने के समय डॉट नेट मौजूद नहीं था। विजुअल बेसिक 6.0 में कॉम कॉल्स द्वारा संयोजित एक से अधिक कम्पोनेण्ट्स बनाने की योग्यता है तथा डॉट नेट कॉम कॉलेबल रैपर (Com Callable Wrappers) डॉट नेट कॉल्स फंक्शन को कॉम कॉल्स की तरह ही बनाता है।

इसका सबसे बढ़िया पहलू यह है कि आपको कॉम कोड से डॉट नेट कम्पोनेण्ट्स के उपयोग करने पर किसी सुरक्षा या स्थायित्व (stability) का खतरा उठाने की आवश्यकता नहीं है। सी. एल. आर. के माध्यम से कॉल कर कॉम कॉलेबल रैपर अब भी आपके डॉट नेट कम्पोनेण्ट्स को मैनेज्ड कोड के सभी लाभों को उपलब्ध कराता है। इससे कोई मतलब नहीं है कि आप डॉट नेट कम्पोनेण्ट्स को कहाँ उपयोग करें।

डॉट नेट क्लाइण्टस से कॉम कम्पोनेण्ट्स को कॉल करना (Calling Com Components from .NET Clients)

कभी-कभी प्रोग्रामिंग में बदलाव आपको उन सभी चीजों को छोड़ देने के लिए प्रेरित करता है जो पहले से उपलब्ध है। इसका एक बेहद प्रासंगिक उदाहरण हैं, मान लें कि आप विजुअल बेसिक में एप्लिकेशनों को सालों से लिख रहे हैं।

यदि 
आप कई विकासकर्ताओं के जैसे हैं तो आपने समय के साथ ही कोड का एक भंडार भी बना लिया होगा और यदि आप विभिन्न भाषा गुरुओं के सुझावों का अनुसरण कर रहे हैं कि कोड को कम्पोनेन्ट में बदला जाता है अर्थात् कम्पोनेन्ट ऑब्जेक्ट मॉडल (भूतपूर्व माइक्रोसॉफ्ट एक्टिक्स सर्वर) का उपयोग कर आपने अपने एप्लिकेशन को कॉलेबल फंक्सनैलिटि (callable functionality) के टुकड़ों में बदल दिया है।

निसन्देह आप संभवतः कम्पोनेण्ट्स यथा अन्य विकासकर्ताओं तथा कम्पनियों के एक्टिवएक्स कंट्रोल्स में भी अच्छा खासा निवेश (investment) कर चुके होंगे।

लेकिन यदि आप किसी अन्य ऑपरेटिंग सिस्टम के लिए पूरी तरह से बदलने का निर्णय लेते हैं तो क्या होगा ? यहाँ आपका में लगाया गया सब कुछ व्यर्थ हो जाता है। आप अपने पहले से उपलब्ध किसी भी कोड को उपयोग नहीं कर सकते है तथा नये प्लेटफॉर्म पर कुछ भी करने के लिए फिर से सब कुछ सीखना होगा। यह निदेह आपके उत्पादकता के लिए एक बड़ा झटका होगा, लेकिन घबराइए मत कॉम से डॉट नेट में स्वीच करने पर आपकी उत्पादकता में कोई बड़ा नुकसान नहीं होने वाला है। इसके दो मुख्य अवधारणा है जो कॉम विकास से डॉट नेट विकास में जाना आसान बनाता है तथा कोड और उत्पादकता का कोई नुकसान नहीं होता है।

1-डॉट नेट कम्पोनेन्ट्स कॉम कम्पोनेन्ट्स को कॉल कर सकते हैं।
2-कॉम कम्पोनेन्ट्स डॉट नेट कम्पोनेन्ट्स को कॉल कर सकते हैं।

इंटरऑपरेबिलिटि का यह दोहरा मार्ग कॉम से डॉट नेट में जाने का मूल मंत्र है। जैसे-जैसे आप डॉट नेट की जटिलताओं को सीखते हैं, वैसे-वैसे आप कॉम कम्पोनेन्ट्स को उपयोग करना जारी रख सकते हैं। ऐसी कई परिस्थितियाँ हैं, जहाँ इंटरऑपरेबिलिटी उपयोगी है –

  1. डॉट नेट में स्वीच करना तुरंत नहीं होगा। इसके लिए डॉट नेट प्रोग्रामिंग अवधारणाओं को सीखने तथा कार्यान्वयन में समय लगता है। अतः आप सम्भवतः यह मान जायेंगे कि आप को तब तक कॉम कोड के साथ कार्य करना जारी रखना पड़ेगा। जब तक आप, आपके सहकर्मी तथा आपके सप्लायर्स गति नहीं पकड़ लेते हैं।
  2. जो कोड आप डॉट नेट को माइग्रेट (migrate) कर सकते हैं, वे एक बार में माइग्रेट नहीं किए जा सकते हैं। आपको माइग्रेट करने के बाद प्रत्येक माइग्रेटेड कम्पोनेन्ट को एक-एक कर जाँचना होगा।
  3. आपको तृतीय पक्ष (third party) कॉम कम्पोनेन्ट्स का भी प्रयोग करना पड़ सकता है, जो आप डॉट नेट में नहीं बदल सकते तथा सप्लायर ने भी उसका डॉट नेट संस्करण रिलीज नहीं किया होगा।
  4. यद्यपि विजुअल बेसिक 6.0 कोड डॉट नेट में माइग्रेट हो जायेगा माइग्रेशन सटिक नहीं होगा। आपके पास ऐसे कम्पोनेन्ट्स भी हो सकते हैं, जिन्हें कार्यान्वयन या भाषा प्रचलनों (quirks) के कारण डॉट नेट में बदला नहीं जा सकता है।

अनमैनेज्ड कोड तथा रनटाइम कॉलेबल रैपर्स (Unmanaged Code and Runtime Callable Wrappers)

वैसे कोड जो माइक्रोसॉफ्ट डॉट नेट कॉमन लैंग्वेज रनटाइम के अंदर कार्य करते हैं मैनेज्ड कोड (managed code) कहे जाते हैं। ऐसे कोड के सी. एल. आर (CLR) द्वारा दी जा रही सभी सुविधाएँ प्राप्त होती हैं। इन सुविधाओं में क्रॉस भाषा वर्जनिंग सपोर्ट (security and versioning support) तथा गारबेज इंटिग्रेशन (cross language integration) सिक्योरिटी संकलन (garbage collection) प्रमुख हैं।

वैसे कोड जो सी. एम. आर. के अंदर कार्य नहीं करते हैं अनमैनेज्ड कोड (unmanaged code) कहे जाते हैं। कॉम कम्पोनेण्ट्स वस्तुतः अनमैनेज्ड कोड होते हैं। क्योंकि कॉम को तब डिज़ायन किया गया था, जब सी. एल. आर. अस्तित्व में ही नहीं था। इसलिए कॉम कोड सी. एल. आर. के द्वारा प्रदान किये गये फ्रेमवर्क के अंदर कार्य नहीं करता है। इसलिए यह सी. एल. आर. द्वारा दी जा रही सेवाओं का भी लाभ नहीं उठा सकता।

एक ही एप्लिकेशन में मैनेज्ड तथा अनमैनेज्ड कोड को मिलाने में एक समस्या है। समस्या यह है कि अनमैनेज्ड कोड सी. एल. आर. इनवायरमेन्ट के द्वारा पहचाना नहीं जाता है। मैनेज्ड कोड न केवल सी. एल. आर. पर निर्भर होते हैं।

इस उलझन से निकलने का केवल एक रास्ता प्रॉक्सी का उपयोग है। सामान्य शब्दों में प्रॉक्सी सॉफ्टवेयर का एक अंश है जो कम्पोनेन्ट से कमाण्ड स्वीकार करता, उन्हें संशोधित करता है तथा फिर उन्हें दूसरे कम्पोनेन्ट को फॉरवर्ड करता है। वह प्रॉक्सी जो मैनेज्ड कोड से अनमैनेज्ड कोड को कॉल करने में उपयोग होता है, रनटाइम कॉलेबल रैपर (Runtime callable wrapper) या आर. सी. डब्ल्यू. (RCW) कहा जाता है।

Rate this post
Suraj Kushwaha
Suraj Kushwahahttp://techshindi.com
हैलो दोस्तों, मेरा नाम सूरज कुशवाहा है मै यह ब्लॉग मुख्य रूप से हिंदी में पाठकों को विभिन्न प्रकार के कंप्यूटर टेक्नोलॉजी पर आधारित दिलचस्प पाठ्य सामग्री प्रदान करने के लिए बनाया है।

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Stay Connected

0FansLike
0FollowersFollow
0SubscribersSubscribe
spot_img
- Advertisement -

Latest Articles