2008-12-04 11 views
13

मेरे पास Taskbar Shuffle जैसा डेल्फी एप्लिकेशन है जिसमें एक हुक डीएल शामिल है।क्या 32-बिट एप्लिकेशन से 64-बिट डीएल तक पहुंच बनाना संभव है?

EDIT: यह हुक डीएलएल विंडोज संदेशों को भेजकर मुख्य ऐप के साथ संचार करता है।

मैं XP और Vista x64 और मेरी प्रारंभिक विचार करने के लिए समर्थन जोड़ने के लिए चाहते हैं 64-बिट (FreePascal साथ यह संकलन) को dll परिवर्तित लेकिन अब (डेल्फी) के लिए आवेदन 32-बिट रखने के लिए किया गया था।

क्या 64-बिट डीएल तक पहुंचने के लिए 32-बिट एप्लिकेशन के लिए यह संभव है?

EDIT2: मैं LoadLibrary के माध्यम से dll लोड कर रहा हूँ तो मुझे लगता है मैं क्या मैं लिंक पर पढ़ें के साथ अनुसार, अटक के बाद से एक 32-बिट प्रक्रिया एक 64-बिट DLL लोड करने में सक्षम नहीं होगा हूँ नीचे दिए गए उत्तरों में से एक पर लार्स ट्रुजिन्स द्वारा निर्देशित।

उत्तर

6

नहीं। आपको दो संस्करणों को संकलित करना होगा: 64-बिट और 32-बिट।

+0

भले ही हुक डीएलएल केवल मुख्य ऐप के साथ विंडोज संदेशों को भेजने के लिए संवाद करना है? – smartins

+0

नहीं, 32 बिट डीएल 64 बिट प्रक्रिया या अन्य तरीकों से लोड हो जाता है। यदि ऐसा नहीं है, तो कोई समस्या नहीं है। –

+0

गलत जवाब।यह अब संभव है, अगर आप पृष्ठभूमि 64 बिट प्रक्रिया बनाते हैं। :) –

2

नहीं, लेकिन आप COM का उपयोग कर उस पर पहुंचने में सक्षम हो सकते हैं। यदि आप एक COM ऑब्जेक्ट के अंदर डीएल चलाते हैं जो स्टैंड-अलोन प्रक्रिया के रूप में चल रहा है, और marshallable इंटरफेस के साथ संवाद (उदाहरण: ऑटोमेशन-संगत इंटरफेस), यह काम करना चाहिए। डीएल क्या करता है और एकीकरण और कॉल सतह कितनी व्यापक है, इस पर निर्भर करता है कि यह हमेशा संभव नहीं है, लेकिन यह एक विकल्प है जो उस परिदृश्य को संभव बनाने में सक्षम होना चाहिए।

+0

केवल तभी जब यह एक सेवा EX सेवा, डीईओएम या COM + की प्रक्रिया से बाहर है। अन्यथा COM dll आपकी प्रक्रिया में लोड हो जाएगा और उसी प्लेटफ़ॉर्म के लिए बनाया जाना चाहिए। –

9

जब तक 64-बिट डीएलएल एक अलग 64-बिट प्रक्रिया द्वारा लोड किया जा रहा है, और 32-बिट प्रक्रिया और 64-बिट डीएलएल के बीच सभी संचार ढीले-युग्मित आईपीसी-जैसी तंत्रों के माध्यम से है जो ओएस मार्शल कर सकता है , तो हाँ आप यह कर सकते हैं।

मैंने कुछ ऐसा ही किया है। एक 32-बिट अनुप्रयोग को एक कस्टम प्रिंट स्पूलर ऐड-इन को एक डीएलएल में लागू करने की आवश्यकता होती है। ऐप और स्पूलर ऐड-इन आईपीसी तंत्र के माध्यम से संचारित (इस मामले में अस्थायी फ़ाइलों को कहने का एक शानदार तरीका)।

64-बिट सिस्टम पर 32-बिट अनुप्रयोगों के बारे में सब कुछ ठीक काम करता है सिवाय इसके कि प्रिंट स्पूलर ने ऐड-इन डीएलएल लोड करने से इंकार कर दिया, क्योंकि प्रिंट स्पूलर निश्चित रूप से 64-बिट प्रक्रिया थी।

समाधान 64-बिट में केवल स्पूलर ऐड-इन पुनर्निर्माण के रूप में सरल था। पूरे 32-बिट ऐप को बदलने की जरूरत नहीं है।

+0

मैं LoadLibrary के माध्यम से dll लोड कर रहा हूँ तो मुझे लगता है मैं अटक कर रहा हूँ के बाद से एक 32-बिट प्रक्रिया एक 64-बिट DLL लोड करने में सक्षम नहीं होगा, मैं क्या लिंक लार्स Truijens द्वारा बताया पर पढ़ें के साथ अनुसार। – smartins

6

मैं सिर्फ इस समाधान में पता चला, CodeCentral से: http://cc.embarcadero.com/Author/802978

यह 32 बिट कोड से किसी भी 64 बिट पुस्तकालय कॉल करने के लिए अनुमति देता है।

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

एक नमूना है जो किसी भी 64 बिट लाइब्रेरी को लोड करने में सक्षम है, फिर 32 बिट निष्पादन योग्य से इस लाइब्रेरी के किसी भी फ़ंक्शन को कॉल करें।

अच्छी तरह से काम करने लगता है। सभी मामलों में, कोड इसे देखने लायक है: यह तकनीकी है, लेकिन अच्छी तरह डिज़ाइन किया गया है!

+0

क्या आप वाकई 32 बिट कोड से * * * बिट बिट लाइब्रेरी को कॉल कर सकते हैं? एक 64 बिट लाइब्रेरी डेटा वापस कर सकती है जो 32 बिट प्रक्रिया से अनुपयोगी हो सकती है। –

+0

यह "पुल" बहुत सारे डेटा प्रकारों को संभालता है: 64 बिट, सिमड एक्सएमएम और वाईएमएम रजिस्टर्स, x87 और यहां तक ​​कि एवीएक्स रजिस्ट्रार। स्मृति मैप किए गए फ़ाइल के माध्यम से मेमोरी बफर को संभाला जाएगा। डेटा 32 बिट पर वापस लौटाया गया है जैसा कि यह 64 बिट लाइब्रेरी से प्राप्त हुआ था। तो यदि आप 64 बिट से पुनर्प्राप्त हैंडल के साथ खेलना चाहते हैं तो आपको बाद में एपीआई के 64 बिट संस्करण को कॉल करना पड़ सकता है। चूंकि आप अपना 64 बिट फ़ंक्शन लिख सकते हैं (यदि आप थोड़ी सी एएसएम जानते हैं), तो आप इस लाइब्रेरी के साथ जो भी चाहें कर सकते हैं, यदि डिफ़ॉल्ट पुल आपके लिए पर्याप्त नहीं है। यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आप * किसी भी * 64 बिट लाइब्रेरी को कॉल कर सकते हैं। –

+0

अधिक जटिल हैंडलिंग के लिए, आप फ्रीपास्कल के 64 बिट संस्करण का उपयोग करके कुछ रैपर लिख सकते हैं, फिर इस एफपीसी लाइब्रेरी को इस पुल के साथ मुख्य डेल्फी 32 बिट एप्लिकेशन से कॉल करें। कोड को समझने के लिए और मैप किया जाने क्या नहीं, और कहा कि उम्मीद की आवश्यकता होगी एक आवरण की आवश्यकता होती है, उन्हें आगे और पीछे की नकल करने की आवश्यकता होगी - –

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

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