2009-09-08 14 views
8

मेरे पास एक डेल्फी एप्लिकेशन है जिसे मैंने काफी सरल रैपर लिखा है .exe के लिए।मैं एक निष्पादन योग्य से बीपीएल में डेल्फी कार्यों को कैसे कॉल करूं?

मूल रूप से, वहाँ एक dll कि काम करता है, जिनमें से एक मैं iteratively कहेंगे एक बार मेरी आवरण यह क्या करने की जरूरत किया था का एक समूह था। मैं इस डीएलएल फाइल के नियंत्रण में नहीं हूं, और कभी नहीं होगा।

खैर, अब यह DLL एक बीपीएल है, और मुझे यकीन है कि कैसे है कि फ़ाइल के भीतर कार्यों कॉल करने के लिए नहीं कर रहा हूँ। अग्रिम में धन्यवाद।

उत्तर

10

आसान तरीका एक पैकेज से कार्यों का उपयोग करने के लिए इकाई समारोह, जिसमें "का उपयोग करें", हमेशा की तरह यह कहते हैं, और अपनी परियोजना के क्रम पैकेजों की सूची पर पैकेज डाल है। इसके लिए काम करने के लिए, कुछ आवश्यकताएं हैं:

  1. आपकी परियोजना को उसी डेल्फी संस्करण का उपयोग करना चाहिए जैसा कि पैकेज को संकलित करने के लिए उपयोग किया गया था।
  2. आप इकाई के लिए DCU फ़ाइल के लिए उपयोग किया जाना चाहिए, या कम से कम डीसीपी पैकेज के लिए फ़ाइल।
  3. जब आपका प्रोग्राम शुरू होता है तो पैकेज ऑपरेटिंग सिस्टम के खोज पथ में मौजूद होना चाहिए।

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

यदि आप पहली दो आवश्यकताओं को पूरा नहीं कर सकते हैं, तो वहां बहुत कठिन तरीका है, जो आपको डेल्फी या सी ++ बिल्डर में लिखा नहीं गया है, तो आपको भी क्या करना होगा। पैकेज को सामान्य डीएलएल की तरह व्यवहार करें। इसे LoadLibrary के साथ लोड करें। GetProcAddress का उपयोग अपने Initialize फ़ंक्शन को लोड करने के लिए करें, और उसके बाद इसे कॉल करें। (याद रखें कि कॉलिंग सम्मेलन register है, stdcall नहीं।) फिर उस फ़ंक्शन का पता लोड करें जिसे आप कॉल करना चाहते हैं, ध्यान रखें कि फ़ंक्शन का नाम कुछ इकाई और प्रकार की जानकारी शामिल करने के लिए उलझा हुआ है। FreeLibrary पर कॉल करने से पहले Finalize फ़ंक्शन पर कॉल करें। LoadPackage और UnloadPackage के लिए स्रोत देखें; चाहे आपको CheckForDuplicateUnits पर कॉल करने की आवश्यकता हो, इस पर निर्भर करता है कि आप आवश्यकता संख्या को संतुष्ट कर सकते हैं या नहीं।

+0

किसी भी तरह से आप इसे करने के लिए संसाधन के लिए मुझे इंगित कर सकते हैं? मैं वास्तव में डेल्फी प्रोग्रामर नहीं हूं, इसलिए मुझे कुछ सामानों के लिए नुकसान हुआ है। – Dan

+0

मुझे अंतिम पैराग्राफ में उल्लिखित तरीके से संकुल को "मैन्युअल रूप से" लोड करने के तरीके का वर्णन करने वाले किसी भी संसाधन से अवगत नहीं है। अंतिम पैराग्राफ में वर्णित संकुल का उपयोग करने का सामान्य तरीका कुछ है जो मुझे डेल्फी सहायता में दिखाई देने की उम्मीद है, हालांकि मैं इसे स्वयं नहीं देख सकता क्योंकि मेरे पास कहीं भी डेल्फी इंस्टॉल नहीं है। –

2

एक बीपीएल बस इसे करने के लिए कुछ विशिष्ट परिवर्धन के साथ एक DLL है। आपको डीएलएल के साथ एक विशिष्ट चेतावनी के साथ काम करने में कोई परेशानी नहीं होनी चाहिए: बीपीएल को डेल्फी के उसी संस्करण में बनाया जाना चाहिए जैसा आप उपयोग कर रहे हैं। यदि आपके पास स्रोत कोड नहीं है तो यह एक बड़ी कमी हो सकती है। यदि यह आपके लिए एक समस्या है, तो आपको शायद इसे किसी भी व्यक्ति के साथ बात करनी चाहिए और उन्हें डीएलएल में वापस लाने के लिए कहें।

+0

-1, मैं 'वापस डीएलएल-नरक' विचार से असहमत हूं। बीपीएल का एक बहुत समृद्ध इंटरफेस, और पारदर्शी स्मृति प्रबंधन का सामना करना पड़ता है। –

+0

चाहे आप इसके प्रभावों को पसंद करते हैं या नहीं, इस उद्देश्य को नहीं बदलते हैं कि आप डेल्फी के एक अलग संस्करण के साथ संकलित डेल्फी निष्पादन योग्य से बीपीएल लोड नहीं कर सकते हैं। यदि आपको ऐसा करने का कोई तरीका पता है, तो मुझे यह जानने में दिलचस्पी होगी कि कैसे ... –

+0

बीपीएल निश्चित रूप से एक अलग डेल्फी संस्करण के साथ बनाया जा सकता है, अगर कोई डीएलएल इंटरफ़ेस और डीएलएल-संगत प्रकारों पर चिपक जाता है (कोई तार नहीं एक शुरुआत के लिए)। – mghie

1

एक बीपीएल DLL समस्याओं का एक बहुत समाप्त कर सकते हैं। यदि आप इसे स्थिर रूप से लिंक कर सकते हैं, तो सीमा पारदर्शी लेकिन सभी हो जाती है। यदि आपको इसे गतिशील रूप से लोड करना है, तो आपको एक डीएलएल-स्टाइल एक्सेस फ़ंक्शन (आमतौर पर एक ऑब्जेक्ट या इंटरफ़ेस देता है) और कुछ सामान्य प्रकार (इंटरफ़ेस) परिभाषाओं की आवश्यकता होती है। बीपीएल के निर्माता द्वारा आपूर्ति की जाने वाली सभी चीज़ें।

+0

एक "डीएलएल बनाने का क्या फायदा होगा जिसमें कार्यों का एक गुच्छा था, जिसमें से एक मैं बीपीएल में कॉल करूंगा?" आपके द्वारा उद्धृत लाभों में से कोई भी ओपी के लिए कोई फर्क नहीं पड़ता। हो सकता है कि वह उन डीएलएल समस्याओं में से किसी को भी पीड़ित न करे? – mghie

+0

उस फ़ंक्शन के पैरामीटर पर निर्भर करता है। मेब दान एक हेडर लाइन पोस्ट कर सकते हैं। –

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