2017-03-13 10 views
7

तो सीधे मेरे सवाल का: कैसे मैं एक 32-बिट एएसएम संकलक के साथ मेरी एएसएम फ़ाइलों को संकलित कर सकते हैं, यह मेरी 64-बिट परियोजना में शामिल हैं और संकलित कोड का उपयोग एएसएम फ़ाइल के फ़ंक्शन नामों का उपयोग करके?दृश्य स्टूडियो - 64-बिट परियोजना के अंदर 32-बिट कोड संकलन

तो यह थोड़ा स्पष्ट नहीं है, मैं विस्तार से बता सकते हैं:

मैं 64-बिट के लिए 32-बिट से मेरा एक परियोजना परिवर्तित कर रहा हूँ और मैं एक तकनीकी समस्या हुई थी। मेरी परियोजना एक एएसएम फ़ाइल संकलित करती है और संकलित बाइनरी का उपयोग इसके उपयोग के लिए इनपुट के रूप में करती है।

जब मेरी परियोजना 32-बिट थी, तो यह काफी आसान था। मैंने प्रोजेक्ट में एएसएम फाइलों को शामिल किया और Microsoft Macro Assembler के साथ उन्हें संकलित करने के लिए एक बिल्ड नियम जोड़ा - फिर मैं अपने 32-बिट प्रोजेक्ट से संकलित कोड तक पहुंच सकता था, जिसे मैं एएसएम से .h हेडर फ़ाइल और एक्सेस तक एक्सेस करना चाहता था यह समारोह नाम का उपयोग कर (मैं क्योंकि यह obj को संकलित किया गया था ऐसा करने में सक्षम था और लिंकर प्रतीकों जानता था क्योंकि मैं एक .h फाइल करने के लिए प्रोटोटाइप निर्यात)।

अब, मैं 64-बिट के लिए इस कोड में परिवर्तित करने की जरूरत है, लेकिन मैं अभी भी एएसएम की जरूरत है 32-बिट कोड के रूप में संकलित है और अभी भी किया जाना है से एक ही बात (संकलित 32-बिट कोड तक पहुँचने करने में सक्षम हो मेरी 64-बिट प्रोग्राम)। हालांकि, जब मैं इसे संकलित करने का प्रयास करता हूं, तो यह स्पष्ट रूप से निर्देशों को पहचान नहीं पाता है क्योंकि अब पूरी परियोजना 64-बिट कोड के रूप में संकलित की जा रही है।

अग्रिम धन्यवाद।

+1

आप 64 बिट प्रक्रिया में 32 बिट कोड लोड या चला नहीं सकते हैं। आपके विकल्प या तो (यह 64 बिट के लिए संकलन होने: आप कोड बदलने की जरूरत नहीं हो सकता है) कोडांतरक कोड अद्यतन करने के लिए कर रहे हैं; या 32 बिट कोड को अपनी प्रक्रिया में चलाएं (माता-पिता प्रक्रिया में इंटर-प्रोसेस संचार के कुछ रूपों के साथ)। – Richard

+0

@ रिचर्ड, यह नहीं कहा कि मुझे इसे चलाने की ज़रूरत है। मैं स्पष्ट होना, मेरे कार्यक्रम – Aviv

+2

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

उत्तर

2

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

उस 32-बिट डीएलएल को आपके 64-बिट अनुप्रयोग में बाइनरी संसाधन के रूप में एम्बेड किया जा सकता है - केवल स्मृति का एक ब्लॉब जिसे आप लोड और एक्सेस कर सकते हैं।

तो फिर आप वास्तव में उस डीएलएल में संकलित कोड के साथ कुछ भी कैसे कर सकते हैं? मैं इसे का उपयोग करने के जोकिम Bauch के MemoryModule पुस्तकालय का एक कुछ हद तक काट दिया संस्करण का उपयोग करेंगे। मेमोरी मॉड्यूल को डीएलएल को स्मृति के एक हंक से लोड करने और उनके निर्यात तक पहुंच प्रदान करने के लिए डिज़ाइन किया गया है - यह केवल विंडोज एपीआई के LoadLibrary() की तरह है, केवल फाइल से बजाय स्मृति से। इसे कॉलिंग प्रक्रिया के समान आकार के लिए करने के लिए डिज़ाइन किया गया है, लेकिन कुछ हैकररी के साथ, आप इसे 64-बिट लाइब्रेरी के रूप में संकलित कर सकते हैं, लेकिन 32-बिट लाइब्रेरी को पढ़ने में सक्षम हैं। जिसके परिणामस्वरूप उपयोगों के बहुत सरल होगा:

// Load the embedded DLL first from the current module. 
hresource = FindResource(hmodule, "MyLibrary.DLL", "binary"); 
hglobal = LoadResource(hmodule, hresource); 
data = LockResource(hglobal); 
size = SizeofResource(hmodule, hresource); 

// Turn the raw buffer into a "library". 
libraryHandle = MemoryLoadLibrary(data, size); 

// Get a pointer to some export within it. 
myFunction = MemoryGetProcAddress(libraryHandle, "myFunction"); 

कहा, जैसा कि मैंने पहले उल्लेख (और अन्य भी उल्लेख), आप निर्यात करने के लिए संकेत प्राप्त कर सकते हैं, भले ही आप उन्हें आह्वान करने के लिए सक्षम नहीं होगा , क्योंकि कोड का 32-बिट और 4 जीबी चिह्न से नीचे मौजूद पते पर भी लोड नहीं किया जा सकता है। लेकिन यदि आप वास्तव में 64-बिट एप्लिकेशन में 32-बिट कोड एम्बेड करना चाहते हैं, तो मैं इसके बारे में कैसे जाऊंगा।

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