सी

2010-06-10 4 views
5

में सार्वजनिक एपीआई से सहायक कार्यों को कैसे छिपाना है मैं एक परियोजना पर काम कर रहा हूं और मुझे एक एपीआई बनाने की आवश्यकता है। मैं सर्वर (मेरे आवेदन) और ग्राहकों (मेरे एपीआई का उपयोग कर अन्य अनुप्रयोगों) के बीच संवाद करने के लिए सॉकेट का उपयोग कर रहा हूं।सी

इस परियोजना ग में नहीं है सी ++

मैं एक linux पृष्ठभूमि से आते हैं और यह मेरा पहला Windows का उपयोग कर परियोजना, विजुअल स्टूडियो 2008, और dll पुस्तकालयों है।

मेरे पास क्लाइंट और सर्वर के बीच संचार काम है, लेकिन मेरे पास कुछ परियोजनाओं पर डुप्लीकेट है। मैं एक लाइब्रेरी (शायद एक डीएलएल फाइल) बनाना चाहता हूं, कि दोनों परियोजनाएं लिंक कर सकती हैं इसलिए मुझे अतिरिक्त कोड बनाए रखने की आवश्यकता नहीं है।

मुझे पुस्तकालय भी बनाना है जिसमें एपीआई है जिसे मुझे अपने ग्राहकों के लिए उपलब्ध कराने की आवश्यकता है। एपीआई फ़ंक्शंस के भीतर जो मैं सार्वजनिक चाहता हूं, इन सहायक कार्यों के लिए कॉल हैं जो "डुप्लिकेट कोड" हैं, मैं इन कार्यों को अपने क्लाइंट को बेनकाब नहीं करना चाहता, लेकिन मैं चाहता हूं कि मेरा सर्वर उन कार्यों का उपयोग करने में सक्षम हो। मैं यह कैसे कर सकता हूँ?

मैं एक उदाहरण के साथ स्पष्टीकरण देने की कोशिश करूंगा। यही वह है जो मैंने शुरू किया था।

सर्वर परियोजना:

int Server_GetPacket(SOCKET sd); 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 

ग्राहक परियोजना:

//Server Project: 
int Server_GetPacket(SOCKET sd); 

// library with public and private types 
// private API (not exposed to my client) 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 
// public API (header file available for client) 
int Client_SendCommand(int command); 
int Client_GetData(int command, char *buf, int len); 

धन्यवाद किसी भी मदद की सराहना की जाएगी:

int Client_SendCommand(int command); 
int Client_GetData(int command, char *buf, int len); 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 

यह मैं के साथ खत्म करना चाहते हैं की तरह है ।

उत्तर

1

यदि आप डीएलएल में "निजी" फ़ंक्शंस डालते हैं और उन्हें सामान्य माध्यमों से बाहरी रूप से कॉल करने योग्य बनाते हैं (उदाहरण के लिए, लाइब्रेरी को लोड करने वाली प्रक्रिया द्वारा कॉल करने योग्य), तो वे दूसरों के लिए "सार्वजनिक" भी होंगे। नाम और चीजों को इस तरह से खराब करना संभव है, लेकिन शायद यह एक अच्छा समाधान नहीं है।

डीएलएल के विरोध में उन्हें स्थिर रूप से लिंक्ड लाइब्रेरी में रखना बेहतर हो सकता है। नोट, हालांकि, इस मामले में भी कोई व्यक्ति बाइनरी को स्पष्ट रूप से अलग कर सकता है और कोड प्राप्त कर सकता है।

+0

मैं एक स्वच्छ एपीआई प्रदान करने के बारे में अधिक चिंतित हूं जिसमें केवल सार्वजनिक कार्य शामिल हैं। मैं सिर्फ सभी सहायक कार्यों को एपीआई का हिस्सा होने से बचना चाहता हूं। क्या आप कह रहे हैं कि मैं "निजी" कार्यों के लिए एक स्थिर पुस्तकालय बना रहा हूं और फिर "सार्वजनिक एपीआई" कार्यों को एक डीएलएल में डाल सकता हूं? – emge

+0

@emge: यह एक संभावना है। यह आपके विकास वास्तुकला पर निर्भर करता है कि क्या यह समझ में आता है। एक "सरल" समाधान केवल आपके प्रोजेक्ट में स्रोत फ़ाइलों को शामिल करना होगा और उन्हें सीधे बाइनरी में बनाना होगा। फिर वांछित निर्यात किए गए कार्यों के साथ एक अलग परियोजना के रूप में सार्वजनिक एपीआई डीएलएल का निर्माण करें। –

+0

धन्यवाद, मुझे "सरल" समाधान पसंद है, लेकिन अगर मैं अपनी परियोजना में स्रोत फ़ाइल शामिल करता हूं और एपीआई डीएलएल को उन कार्यों में से कुछ का उपयोग करने की आवश्यकता है तो मैं डुप्लिकेट कोड रखने के मुद्दे को कैसे प्राप्त करूं? – emge

5

उपयोग

static int ReceiveAll(SOCKET sd, char *buf, int len); 

आदि कार्यों फ़ाइल/संकलन इकाई के लिए स्थानीय बनाने के लिए।

+0

यदि मैं निजी कार्यों को स्थिर के रूप में घोषित करता हूं और उन्हें लाइब्रेरी में डालता हूं, तो क्या मैं इसे सर्वर_गेटपैकेट() से अपने सर्वर प्रोजेक्ट से कॉल कर पाऊंगा? – emge

+0

उसी * फ़ाइल * में कार्य उन्हें देखेंगे। अन्य नहीं करेंगे। –

0

यदि आप केवल अपने डीएलएल में कुछ फ़ंक्शंस का खुलासा करना चाहते हैं, तो आप प्रोजेक्ट बनाने के दौरान लिंकर को एक निर्यात फ़ाइल (dllname.def) बना सकते हैं। इस निर्यात फ़ाइल में उन कार्यों की एक सूची होती है जिन्हें आप अपने डीएलएल का उपयोग कर अनुप्रयोगों के लिए सार्वजनिक रूप से उपलब्ध करना चाहते हैं।

इस बारे में अधिक जानकारी के लिए एमएसडीएन आलेख here देखें।

मुझे लगता है कि आप उन कार्यों पर __declspec(dllexport) कीवर्ड का उपयोग करके समान कार्यक्षमता भी प्राप्त कर सकते हैं जिन्हें आप निर्यात करना चाहते हैं।