मेरे पास एक ऐसा प्रोग्राम है जिसमें मैं पूर्णस्क्रीन पोस्ट-प्रोसेसिंग प्रभाव जोड़ रहा हूं। मेरे पास प्रोग्राम के लिए स्रोत नहीं है (यह मालिकाना है, हालांकि एक डेवलपर ने मुझे डीबग प्रतीकों की एक प्रति भेज दी है, .मैप प्रारूप)। मेरे पास लिखित और काम करने वाले प्रभावों के लिए कोड है, कोई समस्या नहीं है।रैपर DLLs में स्टैक ओवरफ़्लो से बचें
मेरी समस्या अब दोनों को जोड़ रही है। मूल कार्यक्रम के आयात तालिका को संशोधित करने के
उपयोग चक्करदार मार्ग:
मैं दो तरीकों अब तक की कोशिश की है। यह बहुत अच्छा काम करता है और स्थिर होने की गारंटी है, लेकिन जिस उपयोगकर्ता के साथ मैंने बात की है, वह इसके साथ सहज नहीं है, इसे इंस्टॉलेशन की आवश्यकता है (एक संग्रह निकालने से परे), और कुछ प्रश्न हैं यदि डेटोरस के साथ प्रोग्राम को पैच करना शर्तों के तहत मान्य है ईयूएलए का। तो, वह विकल्प बाहर है।
दूसरा विकल्प पारंपरिक डीएलएल-प्रतिस्थापन है। मैंने OpenGL (opengl32.dll) को लपेट लिया है, और मुझे सिस्टम प्रतिलिपि के बजाय अपना डीएलएल लोड करने के लिए प्रोग्राम की आवश्यकता है (बस इसे सही नाम से प्रोग्राम फ़ोल्डर में छोड़ दें, यह आसान है)।
मुझे सीजी फ्रेमवर्क और रनटाइम (जो ओपनजीएल पर निर्भर करता है) लोड करने के लिए मेरे डीएलएल की आवश्यकता है और कुछ अन्य चीजें हैं। जब सीजी लोड होता है, तो यह मेरे कुछ कार्यों को कॉल करता है, जो सीजी कार्यों को कॉल करते हैं, और मुझे स्टैक ओवरफ्लो और अनंत लूप मिलते हैं। मुझे या तो उपनिर्देशिका में सीजी डीएलएल को शामिल करने में सक्षम होना चाहिए और अभी भी अपने कार्यों का उपयोग करना चाहिए (सुनिश्चित नहीं है कि मेरे डीएलएल आयात तालिका को एक उपनिर्देशिका में एक डीएलएल में इंगित करना संभव है) या मुझे गतिशील रूप से उनसे लिंक करना होगा (जो मैं ' डी न करें, केवल निर्माण प्रक्रिया को सरल बनाने के लिए), कुछ उन्हें सिस्टम की फ़ाइल (मेरे कस्टम प्रतिस्थापन नहीं) के संदर्भ में मजबूर करने के लिए मजबूर करें।
पूरी श्रृंखला है: प्रोग्राम DLL ए (opengl32.dll नामित) लोड करता है। डीएलएल एक sysdir/opengl32.dll को cg.dll लोड करता है और गतिशील रूप से लिंक (GetProcAddress)। अब मुझे cs.dll की आवश्यकता है sysdir/opengl32.dll, डीएलएल ए
यह कैसे किया जाएगा? संपादित करें: यह कैसे किया जाएगा आसानी से GetProcAddress का उपयोग किये बिना? यदि कुछ और काम नहीं करता है, तो मैं उस पर वापस आने के लिए तैयार हूं, लेकिन यदि संभव हो तो मैं नहीं चाहूंगा।
संपादित 2: मैं बस एमएसडीएन दस्तावेज़ों (पूरी तरह से असंबंधित खोज पर) में SetDllDirectory फ़ंक्शन में ठोकर खाई। पहली नज़र में, ऐसा लगता है कि मुझे क्या चाहिए। क्या यह सही है, या मैं गलतफहमी कर रहा हूँ? (अब इसे जांचने के लिए बंद करें)
संपादित 3: मैंने इस समस्या को थोड़ा अलग तरीके से हल कर लिया है। OpenGL32.dll को छोड़ने के बजाय, मैंने अपना डीएलएल बदलकर DInput.dll कर दिया है। 120 से अधिक (प्रोग्राम, सीजी, और जीएलईडब्ल्यू) के बजाय एक समारोह को निर्यात करने का लाभ न केवल मुझे है, मुझे वापस चलने वाले कार्यों के बारे में चिंता करने की ज़रूरत नहीं है (मैं ओपनजीएल को सामान्य रूप से लिंक कर सकता हूं) । कॉल में शामिल होने के लिए मुझे अवरोध करने की आवश्यकता है, मैं डेटोर का उपयोग कर रहा हूं। सब कुछ, यह बहुत बेहतर काम करता है। यह सवाल, हालांकि, अभी भी एक दिलचस्प समस्या है (और उम्मीद है कि भविष्य में पागल चीजें करने की कोशिश कर रहे किसी और के लिए उपयोगी होगा)। दोनों जवाब अच्छे हैं, इसलिए मुझे यकीन नहीं है कि अभी तक कौन सा चुनना है ...
भविष्य में इस प्रश्न को पूरा करने वाले किसी भी व्यक्ति के लिए, सर्वोत्तम विकल्प (जो मैंने बाद में कुछ समय बाद समाप्त किया) ** ** डेटोर ** का उपयोग नहीं करते हैं। यह छोटी है, विशेष रूप से WoW64 में, और रिकर्सन-रोकथाम जैसी मूलभूत सुविधाओं को याद कर रहा है। [EasyHook] (http://easyhook.codeplex.com/) सुविधाओं, स्थिरता/प्रदर्शन, और सामान्य हैंडलिंग में कहीं बेहतर है। – ssube