2011-05-28 11 views
5

मैं इस तरह एक DllMain लिख रहा था:डेलमेन नहीं कहा जा रहा है?

#include "main.h" 
#include "init.h" 
#include <iostream> 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
//std::cout<<"hi\n"; //only for debug. did not shown. 
switch (fdwReason) 
{ 
    case DLL_PROCESS_ATTACH: 
     // attach to process 
     // return FALSE to fail DLL load 
     //std::cout<<"hello\n"; //only for debug. did not shown. 
     init(); //did not run :(
     break; 

    case DLL_PROCESS_DETACH: 
     // detach from process 
     break; 

    case DLL_THREAD_ATTACH: 
     // attach to thread 
     break; 

    case DLL_THREAD_DETACH: 
     // detach from thread 
     break; 
} 
return TRUE; // succesful 
} 

लेकिन एक परीक्षण कार्यक्रम के बाद LoadLibrary का उपयोग करता है(), कुछ भी नहीं हुआ, कोई नमस्ते या स्क्रीन पर हाय। क्या आप समस्या का पता लगाना चाहते हैं? बहुत धन्यवाद!

पीएस मैंने DllMain not being called पर सवाल देखा है लेकिन यह अभी भी मदद नहीं करता है।

पीएस 2: फोन करने वाले कार्यक्रम

तरह
int main() 
{ 
cout<<"This is a test program to test.\n"; 
HINSTANCE hinstDLL; 
hinstDLL=LoadLibrary("ijl15.dll"); 
cout<<"Look like everything goes well.\n"; 
cout<<hinstDLL; 
return 0; 
} 

परीक्षक कार्यक्रम outputs है:

This is a test program to test. 
Look like everything goes well. 
0x6a980000 
Process returned 0 (0x0) execution time : 0.007 s 
Press any key to continue. 
+0

हम्म ... ठीक लगता है ... क्या आप LoadLibrary() कोड जोड़ सकते हैं? इसके अलावा, बस निश्चित होने के लिए - आप कंसोल विंडो में प्रिंटआउट की तलाश में हैं, है ना? – TCS

+0

मैं इनिट() को चलाने के लिए तैयार था, लेकिन यह कभी काम नहीं करता तो मैंने कुछ कोउट की कोशिश की लेकिन यह अभी भी काम नहीं कर रहा है। – xxbidiao

+0

सभी के लिए आपके लिंकर स्विच क्या हैं? –

उत्तर

8

कुछ की कोशिश करता करने के बाद (एक बहुत :() मैंने पाया कि मैं याद किया

#define DLL_EXPORT extern "C" __declspec(dllexport) 

इस समारोह नाम सही ढंग से करता है और अंत में DllMain सफलतापूर्वक कहा जाता है। वैसे भी धन्यवाद आप सभी!

+1

ऐसा कुछ समस्या का समाधान कैसे करता है? फिर आप कोड में 'DLL_EXPORT' का उपयोग कहां करते हैं? –

1

मुझे लगता है कि यह अपने कंसोल बातचीत कोड है कि बंद है। आप कुछ कम सूक्ष्म करने की कोशिश कर सकते हैं, जैसे खिड़की खोलना या ShellExecute() ध्वनि में डालना।

+1

आउटपुट डी bugString() इस तरह की चीज़ के लिए बहुत अच्छा है। – Ferruccio

+0

@ फ़िर्रुसियो इनिट() में फाइलों को लॉग लिखने जैसी अन्य चीजें हैं, लेकिन यह बिल्कुल काम नहीं कर रहा है ... आखिर में डीएलएलएमआईएन असफल रहा :(लेकिन वैसे भी धन्यवाद! – xxbidiao

1

आप DLLMain में जो भी कर सकते हैं उसमें आप गंभीर रूप से सीमित हैं। विशेष रूप से, कोई भी I/O करना आम तौर पर नो-नो है। यह कुछ सरल प्रारंभिक कार्य करने के लिए है, निष्पादन योग्य में मुख्य() की तरह कार्य नहीं करना है।

+0

वास्तव में, हैलो और हाय केवल डीबग के लिए हैं , और init() नहीं चला। – xxbidiao

+0

@xxbidiao ओके, init() क्या करता है? –

+0

आईओ के बारे में: क्या आप निश्चित हैं? 'DllMain' में AFAIK केवल एक चीज जिस पर आप भरोसा कर सकते हैं यह है कि kernel32.dll लोड हो गया है , और Win32 IO फ़ंक्शंस हैं। जाहिर है आप सीआरटी के बारे में सुनिश्चित नहीं हो सकते हैं, लेकिन सीधे Win32 IO के साथ आपको सुरक्षित होना चाहिए। वैसे भी, सहमत है कि डेलमेन केवल भारी "आंतरिक" प्रारंभिकता के लिए है, भारी सामग्री के लिए एक अलग समारोह प्रदान करना चाहिए। –

0

LoadLibrary वास्तव में एक मूल्य लौटा रहा है (आपके cout<<hinstDLL कॉल द्वारा प्रदर्शित किया गया है)?

क्या आपके डीएलएल एक ही निर्देशिका में है या PATH पर्यावरण चर के माध्यम से उपलब्ध है?

क्या आपके पास अलग-अलग स्थानों (रिलीज बनाम डीबग) में आपके डीएल के कई संस्करण हैं?

+0

परीक्षण कार्यक्रम में परिणाम: यह परीक्षण करने के लिए एक परीक्षण कार्यक्रम है। देखो सब कुछ ठीक हो जाता है। 0x6a980000 प्रक्रिया 0 (0x0) निष्पादन समय लौटा दी गई: 0.007 एस जारी रखने के लिए कोई भी कुंजी दबाएं। ... कुछ – xxbidiao

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