2011-09-13 19 views
5

मेरे पास कुछ सामान्य उद्देश्य फ़ंक्शन हैं जो मेरी exe फ़ाइल में Log(char* str) में परिभाषित हैं। यह फ़ंक्शन कॉलर से इनपुट के रूप में एक स्ट्रिंग लेता है और इसे उस एप्लिकेशन के लिए परिभाषित लॉगफाइल पर लिखता है। अब मैं डीएलएल कोड लिखना चाहता हूं जिसमें सर्वर पर फ़ाइल अपलोड करने के लिए एक फ़ंक्शन शामिल होगा।मेरे डीएलएल के अंदर मेरे exe में परिभाषित एक समारोह को कैसे कॉल करें?

उद्देश्य डीएलएल से अपलोड फ़ंक्शन को एक्सई में आयात करना और इसका उपयोग करना है। हालांकि, अगर कोई त्रुटि आती है, तो अपलोड फ़ंक्शन को लॉग फ़ाइल में त्रुटि लिखने के लिए Log(char* str) फ़ंक्शन को कॉल करना होगा।

समस्या यह है कि इस डीएलएल को कई अनुप्रयोगों में उपयोग करने की आवश्यकता है और प्रत्येक ऐप के पास एक अलग स्थान पर एक अलग लॉगफाइल होगा। मैं डीएलएल को इस तरह से लिखना चाहता हूं कि यह एप्लिकेशन में परिभाषित Log(char* str) को कॉल करता है। इसी तरह मेरे पास कुछ अन्य कार्य हैं जो एप्लिकेशन-विशिष्ट हैं और पहले डीएलएल में शामिल नहीं किए जा सकते हैं।

मैं ऐसे डीएलएल कोड कैसे लिख सकता हूं जहां यह केवल फ़ंक्शन प्रोटोटाइप को जानता है, लेकिन फ़ंक्शन परिभाषा नहीं, जो exe के अंदर रहता है?

+2

'लॉग (चार const * str) 'निश्चित रूप से? –

+0

बहु भाषा स्रोत फ़ाइलों को लिखना कठिन काम है। मेरा सुझाव है कि आप एक भाषा से चिपके रहें - जब तक कि आप इसे मजाक के लिए नहीं कर रहे हों। – pmg

+2

या 'लॉग (कॉन्स char * str) '? – trojanfoe

उत्तर

8

अपने डीएलएल में एक फ़ंक्शन है कि .exe कॉल कर सकता है, आपके Log फ़ंक्शन पर फ़ंक्शन पॉइंटर में गुजर रहा है। डीएलएल के अंदर, स्टोर जो पॉइंटर काम करता है और जब आपको चीजों को लॉग करने की आवश्यकता होती है तो इसका इस्तेमाल करें।

यदि आपके पास एक से अधिक ऐसे फ़ंक्शन हैं, तो आपको अपने डीएलएल को पास करने की आवश्यकता है, सभी प्रासंगिक फ़ंक्शन पॉइंटर्स को स्टोर करने के लिए struct का उपयोग करने पर विचार करें।

यहाँ समारोह संकेत पर एक अच्छा ट्यूटोरियल है: The function pointer tutorial

इस इंटरफेस सरल रखने के लिए, मैं अत्यधिक कम से कम एक प्रारंभिक बिंदु के रूप में, सादा C में सभी इन "अनुकूलन" कार्यों रखने की सिफारिश करेंगे। पॉइंटर-टू-सदस्य फ़ंक्शंस से निपटना और C++ गुजरने से C रैपर के माध्यम से ऑब्जेक्ट्स त्रुटि-प्रवण है। (लेकिन करने योग्य।) या C++ के साथ सभी दौर के साथ छड़ी।

यहां एक छोटा सा उदाहरण है।

typedef void (*logfunc)(char const*); 

अनुकूलित समारोह सूचक के आसपास गुजर आसान बनाने के लिए: एक आम हेडर में, कुछ इस तरह डाल दिया।

अपने DLL कोड में, आप तो हो सकता है:

logfunc cust_log; 

void dll_init_logging(logfunc l) 
{ 
    cust_log = l; 
} 

void dll_do_something() 
{ 
    cust_log("hello"); 
} 

कि संशोधित इन कार्यों यदि आवश्यक हो तो निर्यात अपने मंच पर बनाने के लिए।

फिर अपने मुख्य कोड से, तुम सब (यह मानते हुए आप DLL लोड कर रहे हैं और उनके मूल नाम के साथ अपने .exe को निर्यात कार्यों उपलब्ध हो सकें) क्या करने की जरूरत है:

void logit(char const* str) 
{ 
    printf("Log: %s\n", str); 
} 

int main (int argc, char const *argv[]) 
{ 
    // load the DLL 
    dll_init_logging(logit); 
    ... 
    dll_do_something(); 
    ... 
    return 0; 
} 
+0

बहुत कुछ। इसने मुझे कुछ विचार दिया, हालांकि मुझे 100% यकीन नहीं है कि इसे सी में कैसे कार्यान्वित किया जाए। ** "अपने डीएलएल में एक फ़ंक्शन है कि .exe कॉल कर सकता है, आपके लॉग फ़ंक्शन में फ़ंक्शन पॉइंटर में गुज़र रहा है। डीएलएल के अंदर, स्टोर जो पॉइंटर काम करता है और जब आपको चीजों को लॉग करने की आवश्यकता होती है तो इसका इस्तेमाल करें।"** क्या आप बेहतर समझने के लिए कोड कोड स्निपेट लिख सकते हैं – Shanty

+0

@Shanty: कुछ उदाहरण कोड जोड़ा गया है। संभवतः गतिशील लिंकिंग के साथ काम नहीं करेगा - आपके प्लेटफ़ॉर्म पर निर्भर करता है, लेकिन आपको यह विचार मिल जाएगा। (केवल काम करता है अगर स्थिर रूप से संकलित किया गया तो ठीक है।) – Mat

+0

@ मैट: बहुत बहुत धन्यवाद। इसने मेरी समस्या हल की। ​​ – Shanty

संबंधित मुद्दे