2009-08-21 13 views
8

मैं एक सी ++ Win32 आवेदन डिबगिंग कर रहा हूँ और मैं, कि प्रक्रिया के संदर्भ से एक मनमाना Win32 एपीआई कॉल करना चाहते हैं जैसे कि प्रोग्राम कोड की इस पंक्ति समाप्त हो चुकी थी:क्या मैं विजुअल स्टूडियो तत्काल विंडो से Win32 API को कॉल कर सकता हूं?

DestroyWindow(0x00021c0e); 

लेकिन में प्रवेश कि तत्काल खिड़की देता है:

CXX0017: Error: symbol "DestroyWindow" not found 

संपादित करें: समारोह, {,,user32.dll}[email protected] का पूरा नाम का उपयोग करना, मैं तत्काल विंडो को समझने के लिए जो समारोह मेरा मतलब हो और समारोह का पता दिखाने कर सकते हैं:

{,,user32.dll}[email protected] 
0x76600454 [email protected] 

लेकिन जब मैं इसे कहते हैं की कोशिश, ऐसा होता है:

{,,user32.dll}[email protected](0x00021c0e); 
CXX0004: Error: syntax error 

तो यह और भी इस तरह तत्काल खिड़की से एक सी समारोह कॉल करने के लिए संभव है, या मैं गलत पेड़ भौंकने कर रहा हूँ?

उत्तर

4

एक बार जब आप समारोह पता है (जैसा कि आप अद्यतन प्रश्न में किया है), तो आप एक समारोह सूचक को यह कास्टिंग और यह कॉल करने का प्रयास कर सकते हैं:

(*(BOOL (*)(HWND))0x76600454)((HWND)0x00021c0e) 

कि के पहले भाग का पता डाले BOOL (*)(HWND) पर, जो HWND पैरामीटर लेने और BOOL लौटने वाले फ़ंक्शन के लिए सूचक है। फिर, फ़ंक्शन पॉइंटर को संदर्भित और बुलाया जाता है। पैरामीटर को सही करने के लिए सुनिश्चित करें, अन्यथा बुरी चीजें घटित होंगी। 64-बिट सिस्टम पर, और HWND 64 बिट्स हो सकते हैं, इसलिए हो सकता है कि आप पैरामीटर को int के रूप में पास करने में सक्षम न हों।

संपादित करें: पूरी कहानी के लिए टिप्पणियां देखें।

+1

विचार के लिए धन्यवाद, लेकिन ... यह मुझे 'CXX0004: त्रुटि: वाक्यविन्यास त्रुटि' देता है। आदिम प्रकारों ('दोनों 'मामलों में' int') के साथ विंडोज प्रकार (' BOOL' और 'HWND') को प्रतिस्थापित करना चीजों में सुधार करता है, लेकिन फिर मुझे 'CXX0014: त्रुटि: अनुपलब्ध ऑपरेंड' मिलता है। (मैं 32-बिट प्रक्रिया में हूं, बीटीडब्ल्यू।) – RichieHindle

+1

स्पष्ट रूप से कार्य सूचक सूचक प्रकारों को पार्सिंग में वीएस डीबगर वास्तव में खराब है। इसके लिए एक टाइपिफ़ बनाने का प्रयास करें। 'Typedef BOOL (* DESTROYWINDOW) (HWND) रखें;' अपने कोड में, फिर डीबगर में '(* (DESTROYWINDOW) 0x76600454) ((शून्य *) 0x00021c0e) लिखें। –

+0

@Adam: हाँ! (लेकिन एक योग्य एक)। कोड में 'टाइपपीफ' को जोड़कर, * और * वास्तव में कोड में 'टाइपपीफ' का उपयोग करके, ताकि संकलक परिभाषा को दूर नहीं फेंक सके, और * संकलन इकाई के भीतर प्रक्रिया के निष्पादन को तोड़कर जहां मैंने उपयोग किया 'typedef', अब मैं तत्काल खिड़की से DestroyWindow को कॉल कर सकते हैं। धन्यवाद! ऐसा करने के लिए इन हुप्स के माध्यम से कूदना शर्म की बात है, लेकिन कम से कम यह संभव है। – RichieHindle

2

मुझे विश्वास है कि समस्या यह है कि सी ++ ईई को DestroyWindow के संदर्भ को हल करने में समस्याएं आ रही हैं। विधि मंगलाचरण वाक्य रचना योग्यता की इस शैली (केवल अतीत में कास्टिंग के लिए यह प्रयोग किया जाता) का समर्थन करता है, तो निम्न

{,,user32}DestroyWindow(0x00021c0e); 

मुझे यकीन है कि नहीं कर रहा हूँ की कोशिश करो। लेकिन यह एक शॉट के लायक है।

संपादित करें आपको एक जोड़ने की आवश्यकता हो सकती है या नहीं! समापन के बाद}। यह थोड़ी देर हो गया है क्योंकि मैंने इस वाक्यविन्यास का उपयोग किया है और मैं अक्सर इसे समकक्ष विंडबग के साथ भ्रमित करता हूं।

+0

सुझाव के लिए धन्यवाद, लेकिन मैंने पहले से ही कोशिश की है और यह काम नहीं करता है। और मैंने इसे '_DestroyWindow @ 4' आदि के रूप में सजाने की कोशिश की है, साथ ही पूरी तरह से योग्य' {, user32.dll} _DestroyWindow @ 4' तक, बिना किसी खुशी के। – RichieHindle

+0

@RichieHindle, disapointing :( – JaredPar

+0

@JaredPar: स्थिति सुधारने में मदद के लिए +1 - मेरा संपादित प्रश्न देखें। अब मैं समझ सकता हूं कि मेरा कौन सा फ़ंक्शन मेरा मतलब है, लेकिन मैं अभी भी इसे कॉल नहीं कर सकता। – RichieHindle

1

मुझे एक कामकाज पता चला, लेकिन मैं अभी भी तत्काल विंडो को काम करने के लिए पसंद करूंगा।

समाधान नहीं है:

  • के रूप में सवाल
  • में दिखाया गया है, समारोह का पता प्राप्त Disassembly विंडो का उपयोग उस पते पर जाना है, और वहाँ
  • एक ब्रेकपाइंट डाल कुछ करने के लिए क्या करने के लिए

    : आवेदन यह DestroyWindow
  • कदम वापस ऊपर कॉल स्टैक DestroyWindow के फोन करने वाले है, जो इस तरह दिखता है करने के लिए कॉल करने के लिए

    6D096A9D धक्का ECX
    6D096A9E कॉल DWORD ptr डी एस: [6D0BB4B8h]

  • push ecx अनुदेश पर एक ब्रेकपाइंट रखा, और पर DestroyWindow

  • हिट एक स्पष्ट जारी रखें, और फिर से करने के लिए आवेदन करने के लिए कुछ करना यह ecx
  • परिवर्तन push/call
  • से अधिक वांछित मान और कदम के लिए डीबगर में ecx के मूल्य का मूल्य नीचे है कि कोड फोन
  • नोट कर
  • ecx का मूल्य को बहाल करने और अगले वक्तव्य सेट का उपयोग वापस push पर जाने के लिए, और जारी रखें

यह longwinded है, लेकिन यह काम करता है। यह मानता है कि आप ऐप को उपयुक्त एपीआई कॉल कर सकते हैं।

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