2010-03-05 17 views
11

में कनवर्ट करना मेरे पास हैडर फ़ाइल (.h) फ़ाइल के साथ .lib फ़ाइल है। इस फ़ाइल में कुछ फ़ंक्शन हैं जिन्हें सी # एप्लिकेशन में उपयोग करने की आवश्यकता है।स्थिर लिंक लाइब्रेरी को गतिशील डीएल

गूगलिंग के बाद मुझे पता चला कि मुझे इस स्थिर पुस्तकालय से गतिशील डीएलएल बनाने की आवश्यकता है और इस गतिशील डीएलएल को इंटरपॉप का उपयोग करके सी # कोड से कॉल करें।

  1. मैंने एक Win32 प्रोजेक्ट बनाया है और चयनित प्रकार DLL बनाया है।
  2. अतिरिक्त हेडर फ़ाइल और अतिरिक्त निर्भरताओं के लिए .lib जोड़ा गया।

    मैं स्थिर पुस्तकालय में परिभाषित कार्यों को देखने में सक्षम हूं (जब मैं ctrl + space दबाता हूं)।

कुल नौसिखिया के रूप में मैं नहीं जानता कि मैं कैसे निम्नलिखित हस्ताक्षर के साथ उदारीकरण में, समारोह है, जो निर्यात कर सकते हैं:

void testfun(char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode) 

मैं एक अलग के साथ मेरी गतिशील DLL में एक ही हस्ताक्षर चाहते हैं नाम।

हेडर फ़ाइल और .cpp फ़ाइल में क्या लिखना है?

+0

क्या आप निर्यात किए गए कार्यों के लिए एक अलग नाम चाहते हैं? या .dll फ़ाइल के लिए अलग नाम? –

उत्तर

6

यदि आप अपनी lib को पुन: संकलित कर सकते हैं, तो बस उन सभी कार्यों के हस्ताक्षर में __declspec(dllexport) जोड़ें जिन्हें आप निर्यात करना चाहते हैं।

void __declspec(dllexport) testfun(char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode) 

यदि आप ऐसा नहीं कर सकते हैं, तो आप उन्हें एक .def फ़ाइल लिखकर निर्यात कर सकते हैं। डीफ़ फाइलों का उपयोग करके आप फ़ंक्शन का नाम भी निर्यात कर सकते हैं क्योंकि इसे निर्यात किया जाता है। http://msdn.microsoft.com/en-us/library/28d6s79h.aspx

---- mylib.def की सामग्री ----

LIBRARY 

EXPORTS 
    testfun 
    newname=testfun2 

फिर जब आप dll लिंक, mylib.def

link /dll /machine:x86 /def:mylib.def mylib.lib 

EDIT2 में शामिल हैं:

ध्यान दें कि पिनवोक मानता है कि आपके द्वारा आयात किए जाने वाले कार्यों में _stdcall कॉलिंग सम्मेलन होगा जबतक कि आप अन्यथा न कहें। तो आपको अपने सी # कोड में भी ऐसा करने की आवश्यकता हो सकती है।

[DllImport("mylib.dll", CallingConvention=CallingConvention.Cdecl)] 

या, आप __stdcall

void __declspec(dllexport) __stdcall testfun(char* inp_buff, ... 
+0

मैंने डीएलएल बनाया है। लेकिन जब मैं इसे सी # से कॉल करता हूं, तो यह कहा जाता है कि "DLL 'demo.dll' में 'testfun2' नामक एक प्रविष्टि बिंदु खोजने में असमर्थ" जब मैं डीएलएल निर्यात व्यूअर का उपयोग करके निर्यात किए गए कार्यों की सूची देखता हूं तो यह फ़ंक्शन नाम दिखाता है "? testfun2 @@ YAXPADPAG0PAI @ Z" समस्या क्या होगी ?? – Manjoor

+0

@ मंजूर: यह हो सकता है। क्या आपने डीफ़ फाइल या _declspec का उपयोग किया था? यदि आपने _declspec का उपयोग किया है, तो आपको शायद अपने C# dllImport कथन को ठीक करने की आवश्यकता है। कुछ कोड देखना उपयोगी होगा। –

+0

मैंने मूल कोड जोड़ा है। कृपया एक नज़र डालें – Manjoor

3

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

3

यह तुम क्या आप फ़ाइल ज को

  1. निम्न कोड जोड़ें कर सकते हैं क्या है होना करने के लिए अपने सी ++ कोड बदल सकता है।अपने प्रोजेक्ट के नाम

    #ifdef MYPROJECT_EXPORTS 
    #define MYPROJECT_API __declspec(dllexport) 
    #else 
    #define MYPROJECT_API _declspec(dllimport) 
    #endif 
    
  2. जाओ करने के लिए "MyProject" का नाम बदलने गुण के लिए> सी ++ -> प्रीप्रोसेसर और जोड़े defenition - MYPROJECT_EXPORTS

  3. सभी कार्यों आप dll जैसे बेनकाब करना चाहते हैं MYPROJECT_API जोड़ें:

    MYPROJECT_API void Test(); 
    
  4. जाओ गुण जनरल प्रोजेक्ट - गतिशील Dll

के लिए> विन्यास प्रकार परिवर्तन यह

आप

+0

मैंने इसे किया है जैसा आपने लोगों ने मुझे करने के लिए कहा था। डीएल बनाया गया। लेकिन मैं इसे अपने सी # एप्लिकेशन से कॉल करने में सक्षम नहीं हूं। मेरे द्वारा पोस्ट की गई टिप्पणी देखें। – Manjoor

+0

नमस्ते .. आपके द्वारा देखे जाने वाले फ़ंक्शन नाम को C++ नाम मैंगलिंग डालने का प्रयास किया गया है: अपने फ़ंक्शन के सामने बाहरी "सी" डालें और – SysAdmin

+0

को पुन: संकलित करें जैसा कि आपने कहा है कि मैंने अपने हेडर फ़ाइल में फ़ंक्शन से पहले बाहरी "सी" जोड़ा है। लेकिन कोई भाग्य नहीं है (नीचे दिए गए कोड को देखें) – Manjoor

3

लक्ष्य डीएलएल, मैं लिख रहा हूं, लोकप्रिय lzo लाइब्रेरी के लिए एक रैपर है। मैंने परियोजना को एलजेडओ नाम से बनाया है।

यहां मेरे असली एप्लिकेशन में कैसा दिखता है।

LZO.h

#ifdef LZO_EXPORTS 
    #define LZO_API __declspec(dllexport) 
    #else 
    #define LZO_API __declspec(dllimport) 
    #endif 

    extern "C" LZO_API void Decompress(char* inp_buff, 
unsigned short* inp_len, char* buffer_decomp,unsigned *output_len); 

LZO.cpp

 #include "stdafx.h" 
     #include "LZO.h" 
     #include "lzo1z.h" 
     #include "lzoconf.h" 
     #include "lz_decomp.c" 

     LZO_API void Decompress(char* inp_buff, unsigned short* inp_len, char* 
    buffer_decomp,unsigned *output_len) 
     { 
      //Calling from static library 
      lzo_decomp (inp_buff,inp_len,buffer_decomp,output_len,NULL); 
     } 

और अंत में मेरी सी # कोड

//P/Invoke declaration 
[DllImport("LZO.dll")] 
private static extern void Decompress(
    byte[] inp_buff, 
    int inp_len, 
    byte[] buffer_decomp, 
    ref int output_len 
);   

//And calling it as below 
Decompress(src, src.Length, dst, ref outlen); 
// src is byte [] 
// dst is also a byte [] 
// oulen is int 

जहां मैं wrog ???

+0

में एक वर्तनी त्रुटि "डेकोम्प्रेस" है। और "डीकंप्रेस" है .पीपी – SysAdmin

+0

मैंने इसे सही किया है (संपादित कोड देखें) लेकिन समस्या अभी भी वहां है। – Manjoor

+0

मैंने कुछ मूल चीजों को अपने मूल उत्तर –

1

उदारीकरण के दो संस्करणों उत्पन्न किया जा सकता देखते हैं, मुट्ठी गतिशील lib, (स्रोत फ़ाइल + हैडर + डायनामिक lib) है ->

या स्थिर lib = (गतिशील lib + DLL DLL का उपयोग करने की) -> (स्रोत फ़ाइल + हेडर) -> डीएलएल तक पहुंचने के लिए।

अगर आप गतिशील लिब है> वहाँ DLL बनाने के लिए (आप कुछ नहीं से कुछ नहीं मिल सकता है) कोई रास्ता नहीं है, गतिशील lib सिर्फ एक इंटरफेस,

है, लेकिन यदि आप स्टेटिक लिब है तो कोई इसे एक्सेस करने के लिए डीएलएल की आवश्यकता है।

0

संभावित समाधान के लिए this question पर मेरे उत्तर पर एक नज़र डालें। लगभग सकारात्मक यह आपके लिए काम करेगा ...

संक्षेप में: अपनी लिंकर सेटिंग्स में "लाइब्रेरी निर्भरता इनपुट का उपयोग करें" विकल्प सक्षम करें। यदि "सत्य" पर सेट किया गया है, तो यह परियोजना के इनपुट के रूप में निर्दिष्ट प्रत्येक LIB में घोषित सभी प्रतीकों & कोड को जोड़ने के लिए मजबूर होगा।

+0

जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। –

+0

@ एंटोनके किया - उत्तर का आवश्यक हिस्सा जोड़ा गया। –

0

यहां समस्या यह नहीं है कि कोड कैसे सजाया गया है, यह स्थिर पुस्तकालय बनाने का अतिरिक्त चरण है जिसमें सभी प्रविष्टि बिंदु शामिल हैं, और उसमें से डीएल बनाने की कोशिश कर रहा है।

यदि आप __delcspec दृष्टिकोण के साथ जाते हैं और पहले स्थिर पुस्तकालय का निर्माण करते हैं, तो DLL बनाने के दौरान उससे लिंक करने का प्रयास करें, आपको मृत-कोड स्ट्रिपिंग समस्या को हल करना होगा।

जब आप लिंक करते हैं, तो obj srcs का उपयोग सभी सजाए गए निर्यातों और निर्भरताओं को हल करने के लिए किया जाता है, बाकी सब कुछ छीन लिया जाता है।यदि आपके पास कोई DLL src नहीं है, तो कोई obj फ़ाइलें (शायद एक डीएल मुख्य को छोड़कर), आप जिस lib को निर्यात करना चाहते हैं, उसके सभी कोड को हटा दिया जाएगा (गुणों के बावजूद)।

  1. लिंकर बताओ नहीं अप्रयुक्त कोड है, जो शायद आप सामान आप नहीं चाहते की एक बहुत कुछ देने के लिए जा रहा है पट्टी:

    तो, आप या तो करने के लिए है।

  2. निर्यात मैन्युअल
  3. लिंक obj बजाय सीधे lib को जोड़ने की lib बनाने के लिए इस्तेमाल फ़ाइलों के खिलाफ dll बेनकाब करने के लिए एक डीईएफ़ फ़ाइल का उपयोग करें।
  4. या शायद डमी कोड बनाएं जो उन कार्यों को संदर्भित करता है जिन्हें आप निर्यात कर रहे हैं जो आप निर्यात कर रहे हैं।
संबंधित मुद्दे