2012-04-11 15 views
15

मैं पी/आह्वान जानने के लिए कोशिश कर रहा हूँ, इसलिए मैं C++जब बुला सी ++ सी # में dll एक प्रवेश बिंदु मिल करने में असमर्थ

KingFucs.h एक सरल dll बनाया :

#include "KingFuncs.h" 
#include <stdexcept> 

using namespace std; 

namespace KingFuncs 
{ 
    int KingFuncs::GiveMeNumber(int i) 
    { 
     return i; 
    } 
} 

तो यह संकलित करता है, तो मैं अपने WPF के डिबग फ़ोल्डर में इस dll की नकल की, कोड के साथ:

[DllImport("KingFuncDll.dll", EntryPoint = "GiveMeNumber", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern int GiveMeNumber(
       int i 
      ); 

और बटन क्लिक करें में यह बुला:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    int num = GiveMeNumber(123); 
} 

लेकिन यह मुझे अपवाद देता है:

DLL 'KingFuncDll.dll' में 'GiveMeNumber' नामक एक प्रवेश बिंदु ढूँढने में असमर्थ।

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

+1

कृपया मेरा प्रश्न यहां देखें: http://stackoverflow.com/questions/9849541/writing-c-intended-to-be-called-from-c –

+0

मैंने एक ही प्रश्न हल किया, और [इस पोस्ट] में इसका वर्णन किया (https://stackoverflow.com/a/45263176/1817569)। – Hamid

उत्तर

31

जब आप अपना फ़ंक्शन निर्यात करते हैं तो आपको extern "C" का उपयोग करने की आवश्यकता होती है ताकि आप C++ नाम मैंगलिंग को दबा सकें। और आपको कक्षा के सदस्यों को पी/आमंत्रित करने की भी कोशिश नहीं करनी चाहिए। बजाय मुक्त कार्यों का उपयोग करें:

extern "C" { 
    __declspec(dllexport) int GiveMeNumber(int i) 
    { 
     return i; 
    } 
} 

कामयाब तरफ अपने DllImport विशेषता सब गलत है। SetLastError का उपयोग न करें जो केवल Win32 API के लिए है। यदि टेक्स्ट पैरामीटर नहीं हैं तो CharSet सेटिंग को परेशान न करें। ExactSpelling के लिए कोई ज़रूरत नहीं है। और कॉलिंग सम्मेलन संभवतः Cdecl है।

[DllImport("KingFuncDll.dll", CallingConvention=CallingConvention.Cdecl)] 
public static extern int GiveMeNumber(int i); 
+0

धन्यवाद, यह काम किया। लेकिन कक्षा के एक समारोह को कॉल करना संभव नहीं है? (यह मेरा पहला बार बाहरी "सी" का उपयोग कर रहा है, मैंने सोचा कि मुझे हमेशा सी ++ में कक्षा के भीतर फ़ंक्शन को परिभाषित करने की आवश्यकता है) –

+0

आपको C++ में किसी कक्षा के भीतर फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है। पुराने फैशन सी कार्य ठीक हैं। –

0

समस्या यह है कि आप सी ++ एक सी ++ वर्ग के अंदर "समारोह" की घोषणा कर रहे हैं और StdCall उपयोग करने के लिए पी/आह्वान कह रहे है।

कक्षा के बाहर एक सी ++ फ़ंक्शन घोषित करने का प्रयास करें और इसे आपके जैसा निर्यात करें। फिर आपका कोड काम करना चाहिए।

यदि आपके पास वास्तव में कक्षा के अंदर सी ++ फ़ंक्शन होना चाहिए, तो कॉलिंग कॉन्वेन्शन .इसकॉल पर एक नज़र डालें। लेकिन फिर आप अपने अप्रबंधित वर्ग उदाहरण बनाने के लिए ज़िम्मेदार हैं और इसे अपने पी/इनवॉक कॉल के पहले पैरामीटर के रूप में पास करते हैं

0

एक डीएलएल फ़ाइल का एंट्री पॉइंट नाम .exp फ़ाइल में दिया जाता है जो डीबग फ़ोल्डर में मिलता है स्रोत फाइलें मौजूद हैं। यदि डंपबिन काम नहीं करता है तो आप इसे आजमा सकते हैं।

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