2010-06-14 11 views
5

मैं LPCWSTR स्ट्रिंग प्रिंट डीबग करने की कोशिश कर रहा हूं, लेकिन मुझे sprintf बफर में पुश के दौरान कोई समस्या आती है, क्योंकि यह केवल स्ट्रिंग से पहला अक्षर पुनर्प्राप्त करता है।sprintf एक एलपीसीडब्लूआरएआर चर

HANDLE WINAPI hookedCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { 
    char buffer[1024]; 
    sprintf_s(buffer, 1024, "CreateFileW: %s", lpFileName); 
    OutputDebugString(buffer); 
    return trueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, dwCreationDisposition, hTemplateFile); 
} 

उदाहरण के लिए मैं CreateFileW: C या CreateFileW: \ मिलती है:

यहाँ कोड है।

मैं इसे बफर में ठीक से कैसे दबा सकता हूं?

धन्यवाद।

+1

क्या आप विस्तृत संस्करण का उपयोग नहीं करना चाहिए: 'wsprintf_s'? – AraK

उत्तर

6

swprintf_s का उपयोग करें जो sprintf_s का संस्करण है जो विस्तृत चरित्र तारों के लिए डिज़ाइन किया गया है।

तुम भी wchar_t बजाय char की एक सरणी की आवश्यकता होगी और इसके अलावा OutputDebugStringW()

उपयोग करने के लिए, ध्यान दें कि आप कि swprintf_w entierly नहीं हो सकता है क्या आप कॉल करना चाहते। यदि यह उस स्ट्रिंग से मुकाबला करता है जो आपके द्वारा दिए गए आकार से अधिक लंबा है, तो यह किसी प्रकार का दावा निष्पादित करता है। मेरा सुझाव है कि आप इस स्थिति का विशेष रूप से परीक्षण करें।

5

जब तक आप इस एक समारोह में यूनिकोड (और नहीं, कहते हैं, अपने पूरे परियोजना में) को लक्षित करने के लिए एक ठोस कारण है, यह चारसेट-अज्ञेयवाद मैक्रो का उपयोग करने के लिए बुद्धिमान हो सकता है जहाँ भी संभव:

HANDLE WINAPI hookedCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { 
TCHAR buffer[1024]; 
_stprintf_s(buffer, 1024, _T("CreateFileW: %s"), lpFileName); 
OutputDebugString(buffer); 
return trueCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, dwCreationDisposition, hTemplateFile); 
} 
6

आप sprintf() को बताने की आवश्यकता है कि आप एक विस्तृत चरित्र स्ट्रिंग पास करते हैं। % Ls विनिर्देशक का प्रयोग करें:

sprintf_s(buffer, 1024, "CreateFileW: %ls", lpFileName); 

ध्यान दें कि यह कितना अनुत्पादक है। आपका कोड यूनिकोड ऑपरेटिंग सिस्टम पर चलता है। यह आपके char [] स्ट्रिंग को वापस एक व्यापक स्ट्रिंग में कनवर्ट करना होगा इससे पहले कि वह इसे डीबगर पर भेज सके। यह बूट करने के लिए डेटा हानि के एक महत्वपूर्ण जोखिम के साथ बस सीपीयू चक्र बर्बाद कर दिया गया है। जब आप रोम में हों, तो रोमन की तरह कार्य करें और wchar_t + wsprintf() का उपयोग करें। और # यूनिकोड को परिभाषित करें ताकि आप स्वचालित रूप से तेज़ आउटपुट DebugStringW() को कॉल कर सकें, जिसे स्ट्रिंग को परिवर्तित करने की आवश्यकता नहीं है। सी ++ का उपयोग करने का बिंदु तेजी से कोड लिखना है, जानबूझकर धीमा करना व्यर्थ है।