2013-02-26 18 views
6
dumpbin.exe

मैं और दृश्य स्टूडियो 2010 में कार्यों के बहुत सारे वर्गों के साथ एक .dll पुस्तकालय लिखा है जब मैं के साथ फ़ाइल की सामग्री को देखने का उपयोग कर:DLL फ़ंक्शन नाम

dumpbin.exe /EXPORTS myDll.dll 

मैं लंबे समय से मिल एक समारोह के स्थान सूचक किसी तरह का है, जो इस (.dll में दूसरी प्रविष्टि) की तरह दिखता है के साथ फ़ंक्शन नाम:

  2 1 0001100A [email protected]@[email protected]@[email protected] = @ILT+5([email protected]@[email protected]@[email protected]) 

यह किसी भी तरह से पढ़ने के लिए मुश्किल है, लेकिन मैं "अच्छे" दूसरे से प्रक्रिया/समारोह सूची को देखा। डीएलएल-एस, इस तरह:

141 8C 00002A08 PogoDbWriteValueProbeInfo 

मैं इसे कैसे बना सकता हूं। डीएलएल सूची इस तरह से दिखती है?

पी.एस .: मेरी dll स्रोत कोड इस तरह दिखता है:

namespace codecX 
{ 
    class codec 
    { 
     public: 
     static __declspec(dllexport) double Initialize(double a, double b); 
     ... 
+1

क्या आप वाकई अनमोल नाम निर्यात करना चाहते हैं? यदि आप ऐसा करते हैं तो आप फ़ंक्शन ओवरलोडिंग का उपयोग करने में सक्षम नहीं होंगे। ऐसा लगता है कि आप एक सी ++ वर्ग निर्यात कर रहे हैं। क्या आप इंस्टेंस विधियों, कन्स्ट्रक्टर इत्यादि निर्यात कर रहे हैं या क्या आपके सभी तरीके स्थिर हैं? –

+1

http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names –

+0

डेविड एच।, हाँ मेरा इरादा मानव-पठनीय प्रारूप निर्यात करना था। क्यूं कर? मुझे अन्य सहकर्मियों को बनाया गया डीडी पास करना होगा और किसी अन्य व्यक्ति द्वारा लिखित स्रोत कोड और/या पुस्तकालयों की अच्छी समझ के लिए पठनीय प्रारूप होना आवश्यक है। :) – TomiL

उत्तर

7

आप वैश्विक पता स्थान में उन स्थिर सदस्य कार्यों खींच और फिर उन्हें निर्वासन 'सी' के साथ रैप की जरूरत है। यह सी ++ नाम mangling को दबाने होगा और बदले में आप सी नाम mangling जो कम बदसूरत है दे:

extern "C" __declspec(dllexport) Initialize(double a, double b) 
{ 
    codec::Initialize(a, b); 
} 

और फिर अपने स्थिर सदस्य कार्यों पर __declspec (dllexport) को हटा दें:

class codec 
{ 
    public: 
     static double Initialize(double a, double b); 
} 
+0

जॉन, आपके उत्तर के लिए धन्यवाद! इसने मेरी समस्या हल कर दी है! – TomiL

3

यह कहा जाता है नाम-मैंगलिंग और तब होता है जब आप C++ को संकलित करते हैं तो C++ - कंपाइलर। "humand-readable" नामों को बनाए रखने के लिए आपको अपनी कक्षाओं और कार्यों को घोषित करने और परिभाषित करते समय extern "C" का उपयोग करना होगा। अर्थात

extern "C" void myFunction(int, int); 

here देखें और यह भी mixing C and C++ गूगल।

+0

आपने मंगल को कवर किया है, लेकिन सजावट का उल्लेख छोड़ दिया गया है –

+0

@ डेविड हेफरनन मान लें कि मैं इसके बारे में भूल गया हूं, ठीक है;)? लेकिन आप बिल्कुल सही हैं। –

+0

Bash.d, आपके उत्तर के लिए धन्यवाद! मुझे यही चाहिए! – TomiL

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