2010-05-27 10 views
6

मेरे पास एक मूल डीएलएल है जो एक अलग अनुप्रयोग में प्लग-इन है (एक जिसे मेरे पास अनिवार्य रूप से शून्य नियंत्रण है)। सबकुछ तब तक बढ़िया काम करता है जब तक कि मैं एक अतिरिक्त .lib फ़ाइल से लिंक नहीं करता (मेरे डीएलएल को ABQSMABasCoreUtils.dll नामक किसी अन्य डीएलएल से लिंक करता है)। इस फ़ाइल में मूल एप्लिकेशन से कुछ अतिरिक्त एपीआई है जिसका मैं उपयोग करना चाहता हूं। मैंने निर्यात किए गए किसी भी फ़ंक्शन का उपयोग करने के लिए कोई भी कोड भी नहीं लिखा है, लेकिन इस नए डीएलएल में बस लिंक करने से समस्याएं पैदा हो रही हैं। विशेष रूप से, जब मैं प्रोग्राम चलाने का प्रयास करता हूं तो मुझे निम्न त्रुटि मिलती है:Win32 DLL आयात करने वाले मुद्दे (DllMain)

एप्लिकेशन ठीक से शुरू करने में विफल रहा (0xc0000025)। आवेदन को समाप्त करने के लिए ओ के पर क्लिक करें।

मुझे विश्वास है कि मैंने कहीं पढ़ा है कि यह आम तौर पर एक DllMain फ़ंक्शन को FALSE लौटने के कारण होता है। इसके अलावा, निम्न संदेश मानक आउटपुट में लिखा है:

त्रुटि: मेमोरी आवंटन घटक प्रारंभ

से पहले की कोशिश की मैं कर रहा हूँ लगभग 100% यकीन है कि यह त्रुटि संदेश अनुप्रयोग से आ रहा है और किसी प्रकार की नहीं है विंडोज़ त्रुटि

यह एक छोटे से अधिक (उर्फ चारों ओर घिसटते हुए और flipping हर स्विच मैं के बारे में पता) में देख रहे हैं मैं जुड़ा हुआ साथ/एमएपी जिसके परिणामस्वरूप .map फ़ाइल में चालू है और यह पाया:

0001:000af220  [email protected]@Z    00000001800b0220 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 
0001:000af226  [email protected][email protected]    00000001800b0226 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 
0001:000af22c  [email protected][email protected]   00000001800b022c f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 
0001:000af232  [email protected]@Z    00000001800b0232 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 

अगर मैं उन undecorate

void __cdecl operator delete(void * __ptr64) 
void * __ptr64 __cdecl operator new(unsigned __int64) 
void * __ptr64 __cdecl operator new[](unsigned __int64) 
void __cdecl operator delete[](void * __ptr64) 

मुझे यकीन है कि मैं समझता हूँ कि कैसे ABQSMABasCoreUtils.dll से कुछ भी इस .map फ़ाइल के भीतर मौजूद कर सकते हैं या क्यों मेरे DLL भी ABQSMABasCoreUtils.dll लोड करने के लिए प्रयास कर रहा है नहीं कर रहा हूँ: "undname" वे निम्नलिखित (उसी क्रम) देने का उपयोग कर नाम अगर मेरे पास कोई कोड नहीं है जो संदर्भित करता है इस डीएलएल es। क्या कोई मुझे इस जानकारी को एक साथ रखने में मदद कर सकता है और यह पता लगा सकता है कि यह क्यों काम नहीं कर रहा है? इसके लायक होने के लिए मैंने "डंपबिन" के माध्यम से पुष्टि की है कि मूल आवेदन ABQSMABasCoreUtils.dll आयात करता है, इसलिए इससे कोई फर्क नहीं पड़ता कि इससे कोई फर्क नहीं पड़ता। मैंने अपने डीएलएल में इस डीएलएल को लोड करने में देरी की कोशिश की है लेकिन इससे परिणाम नहीं बदले हैं।

संपादित

मैं डबल जाँच कर ली है और इसमें शामिल सभी फ़ाइलों 64 बिट कर रहे हैं।

+1

क्या आपने आयात लाइब्रेरी के स्थिर लिंकिंग के बजाय 'LoadLibrary' का उपयोग करने का प्रयास किया है? यदि आप ऐसा करते हैं, तो आप मुख्य आवेदन पहले ही शुरू कर चुके हैं और आपके पास कुछ लाभ है। – Oleg

+0

मैंने इसके बारे में सोचा लेकिन मैं इस पुस्तकालय से बड़ी संख्या में कार्यों का उपयोग कर समाप्त कर दूंगा। क्या मुझे प्रत्येक के लिए GetProcAddress का उपयोग नहीं करना पड़ेगा? यदि संभव हो तो मैं इससे बचना पसंद करूंगा। – brady

+1

सी 0000025 = STATUS_NONCONTINUABLE_EXCEPTION। विंडबग में एप्लिकेशन चलाने का प्रयास करें और देखें कि यह कहां दुर्घटनाग्रस्त है; शायद यह आपको एक संकेत देगा। – Luke

उत्तर

5

मुझे बस वही समस्या थी। यह डीएलएलएस की लोडिंग के बजाय एबकस एपीआई के साथ एक मुद्दा है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि एबकस एपीआई नए को ओवरराइड करता है और कार्यों को हटा देता है (जैसा कि आपने देखा है)। यदि आप नए फोन या इस तरह के odb_initializeAPI(); फोन करके के रूप में Abaqus एपीआई, आरंभ करने से पहले अपने कार्यक्रम में हटा दें, फिर आप

त्रुटि मिलती है: स्मृति आवंटन घटक प्रारंभ से पहले की कोशिश की

त्रुटि संदेश और कार्यक्रम दुर्घटनाओं ।

मेरे कार्यक्रम में, पहले new से पहले odb_initializeAPI(); पर कॉल करने से समस्या हल हो गई।

+1

यह थोड़ी देर हो गया है क्योंकि मैंने इसे ठीक किया है लेकिन मुझे थोड़ा अलग समस्या थी। मैं वास्तव में उपयोगकर्ता सबराउटिन में ओडीबी तक पहुंच रहा था इसलिए मैं getActiveOdb() का उपयोग कर रहा था। मुझे यह त्रुटि मिल रही थी क्योंकि मैं msvcr90.dll पर निर्भरता के साथ संकलित था और Abaqus msvcr80.dll का उपयोग कर रहा था। लेकिन मुझे खुशी है कि आपने उपरोक्त पोस्ट किया है - अबैकस उपयोगकर्ता सबराउटिन और पोस्ट प्रोसेसर के लिए त्वरित सहायता ऑनलाइन ढूंढना मुश्किल है। – brady

+0

@brady आप निर्भरता मुद्दे को कैसे पहचानते हैं और ठीक करते हैं? मेरा मानना ​​है कि 'msvcr100.dll' मेरे प्रोग्राम में' msvcr80.dll' के साथ विरोधाभासी है। मैं वास्तव में इसके साथ कुछ मदद की सराहना करता हूं। – Derek

+1

मुझे याद नहीं है कि मैंने इसे कैसे पहचाना - मैंने शायद "डंपबिन/आयात" उपयोगिता का उपयोग किया और अनावश्यक सी ++ रनटाइम पुस्तकालयों को देखा। समस्या को ठीक करने के लिए, मुझे विजुअल सी ++ 8.0 (विजुअल स्टूडियो 2005) के साथ निर्माण करना पड़ा जो अबाकस के उस संस्करण के लिए समर्थित सी ++ कंपाइलर था। आप यहां समर्थित कंपाइलर्स देख सकते हैं: [एबकस सिस्टम आवश्यकताएं] (http://www.3ds.com/support/certified-hardware/simulia-system-information/)। उचित संस्करण चुनें और सिस्टम आवश्यकताएं क्लिक करें, अपना प्लेटफॉर्म चुनें, और सी ++ कंपाइलर आवश्यकताओं को देखें। – brady

0

ABQSMABasCoreUtils.dll ऐसा लगता है कि यह 64-बिट फ़ंक्शंस आयात कर रहा है। क्या आपका डीएल 64-बिट भी है? यदि नहीं, तो यह समस्या है - आप एक ही प्रक्रिया में विभिन्न आर्किटेक्चर के लिए संकलित डीएलएल मिश्रण नहीं कर सकते हैं।

+0

यदि यह मामला था, तो कोड संकलित करने में विफल रहेगा - रनटाइम पर असफल नहीं। –

2

अच्छा, सुनिश्चित करें कि आप उस पुस्तकालय के आयात का संदर्भ लेंगे। नया या हटाए गए ऑपरेटर के बिना सी ++ प्रोग्राम लिखना मुश्किल है। तीसरे पक्ष के सॉफ़्टवेयर से निपटने के लिए जो सोचता है कि उन ऑपरेटरों के सीआरटी संस्करण को ओवरराइड करने की आवश्यकता है, यह असंभव है, असंभव है जब यह आपको तब तक कॉल करने की अनुमति नहीं देगा जब तक कि यह सही न हो। सभी उम्मीदों को छोड़ दें या विक्रेता से मदद लें।

+1

क्या बड़े सी ++ कार्यक्रमों के लिए इस तरह के आम ऑपरेटरों को ओवरराइड करना आम बात है? यह बहुत मूर्खतापूर्ण लगता है। क्या यह लगभग/DEFAULTLIB के साथ मिलना संभव है? – brady

+2

यह केवल मूर्ख कार्यक्रमों और नींव शैली वर्ग पुस्तकालयों में आम है जो उनके साथ जुड़े सभी कोडों पर भरोसा करते हैं। आप इसके चारों ओर नहीं मिल सकते हैं। .lib हैकिंग केवल तभी लाएगा जब कुछ कोड आवंटक और अन्य कोड का उपयोग नहीं करता है। यह एक स्वचालित मेमोरी लीक या एवी है। –

1

ABQSMABasCoreUtils.dll लोड करने के दौरान त्रुटि के संभावित कारणों में से एक यह है कि कुछ निर्भरता मॉड्यूल (समावेशी देरी लोड DLLs) नहीं मिल सका। ABQSMABasCoreUtils.dll की सभी निर्भरताओं की जांच करने के लिए निर्भरता वॉकर (http://www.dependencywalker.com/ देखें) का उपयोग करें।

  1. सत्यापित करें कि आप LoadLibrary के लिए सम्मान के साथ ABQSMABasCoreUtils.dll लोड कर सकते हैं:

    मैं दो सुझाव हैं। आपको ABQSMABasCoreUtils.dll से किसी भी फ़ंक्शन को कॉल करने की आवश्यकता नहीं है। LoadLibrary का उपयोग मुझे अंतिम समाधान के रूप में नहीं दिखता है। यह केवल एक नैदानिक ​​परीक्षण है। परीक्षण के साथ आप सत्यापित कर सकते हैं कि आपके प्रोग्राम में ABQSMABasCoreUtils.dll लोड करने की कुछ सामान्य समस्या है या आपके पास कुछ प्रकार की प्रक्रिया प्रारंभिक समस्या है।

  2. LoadLibrary के संबंध में ABQSMABasCoreUtils.dll की लोडिंग विफल हो जाएगी, फिर ABQSMABasCoreUtils.dll लोड करने के दौरान किए गए सभी कॉल के प्रोटोकॉल पर निर्भरता वाकर की प्रोफाइलिंग सुविधा का उपयोग करें। ABQSMABasCoreUtils.dll की लोडिंग के दौरान कौन सी फ़ाइल और रजिस्ट्री ऑपरेशन किया जाएगा, यह जानने के लिए एक अन्य तरीका प्रोसेस मॉनिटर का उपयोग होगा (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx देखें)।

यदि LoadLibrary विफल नहीं है, तो आपके पास वास्तव में डीएलएल की प्रारंभिक समस्या है। आम तौर पर समस्या तब मौजूद होती है जब DllMain के अंदर एक डीएलएल किसी अन्य DLL से फ़ंक्शन का उपयोग करने का प्रयास करता है जिसे अभी तक प्रारंभ नहीं किया गया है (अभी तक DllMain से रिटर्न नहीं है)। इस समस्या के निदान शुरू करने से पहले, हमें LoadLibrary के साथ एक और अधिक सरल समस्याओं को बाहर करने का प्रयास करना चाहिए।

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