2010-09-29 8 views
12

डी में गतिशील रूप से डीएलएल से कार्यों को गतिशील रूप से लोड करने और कॉल करने का कोई तरीका है? मैं चाहता हूं कि मेरा प्रोग्राम स्टार्टअप और शायद ऑन-द-फ्लाई पर प्लगइन लोड करने में सक्षम हो।लोडिंग प्लगइन्स (डीएलएल) ऑन-द-फ्लाई

+0

हां। यहां एक त्वरित संदर्भ दिया गया है: http://www.digitalmars.com/d/2.0/dll.html –

+0

यही वह है जो मुझे डर था ... मूल रूप से हम proc पता प्राप्त करने और जाने से सी विधि का उपयोग कर अटक गए हैं क्या आप वहां मौजूद हैं। मुझे लगता है कि भयानक नहीं है, क्योंकि मैं अपनी सभी प्लगइन ऑब्जेक्ट्स को "मास्टर फैक्ट्री" में लपेट सकता हूं, लेकिन इष्टतम नहीं। –

उत्तर

9

यह इस बात पर निर्भर करता है कि आप कितनी गतिशील प्राप्त करना चाहते हैं। यदि आप गतिशील रूप से एक डीएलएल लोड करना चाहते हैं और कुछ पूर्वनिर्धारित कार्यों को चलाने के लिए चाहते हैं, तो वी ली here द्वारा एक बहुत अच्छा रैपर है। टेम्पलेट्स की शक्ति के लिए धन्यवाद, यह आपको इस तरह की चीजों को करने की अनुमति देता है:

// define functions 
alias Symbol!("MessageBoxW", int function(HWND, LPCWSTR, LPCWSTR, UINT)) mbw; 
alias Symbol!("MessageBoxA", int function(HWND, LPCSTR, LPCSTR, UINT)) mba; 
// load dll 
auto dll = new Module!("User32.dll", mbw, mba); 
// call functions 
dll.MessageBoxW(null, "Hello! DLL! ", "Hello from MessageBoxW", MB_OK); 
dll.MessageBoxA(null, "Hello! DLL! ", "Hello from MessageBoxA", MB_OK); 

कोड डी 1 है। डी 2 के लिए, आपको के साथ प्रतिस्थापित करना होगा, toStringz() का उपयोग करें और संभवतः scope हटा दें। संपादित करें: इस कोड केmy D2 port इस प्रश्न को ढूंढने वाले अन्य लोगों के लिए उपयोगी हो सकता है।

+0

मेरी इच्छा है कि मेरे पास अधिक +1 +1 अंक हों। यही वह है जिसकी तलाश में मैं हूं। धन्यवाद! –

+1

@ टिमोथी: खुशी हुई यह मदद की। मेरे लिए, कोड एक अच्छा उदाहरण है कि आप टेम्पलेट्स और मिक्सिन का उपयोग करके कोड की कुछ पंक्तियों के साथ कितना हासिल कर सकते हैं। यह लगभग पायथन की तरह लगता है। – stephan

+0

मुझे एहसास है कि यह कुछ महीने पुराना है, लेकिन डी 2.0 अपडेट के लिए एक टन धन्यवाद! मैं यह भी चाहता हूं कि हाथ से बाहर निकलने के लिए मुझे अधिक उत्साह मिले! –

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