2012-12-30 7 views
5

साथ एक स्ट्रिंग तालिका अद्यतन करने मैं प्रश्न यहाँ पूछा - updating STRING TABLE via UpdateResource (adding multiple strings)UpdateResource

और अब मैं फिर से पूछ रहा हूँ इस बार मैं सवाल का बहुत अधिक विस्तार में जोड़ सकते हैं के रूप में,।

मैं पिछले दिन या किसी वास्तविक लाभ के लिए यह कोशिश कर रहा हूं। मुझे परिणाम क्या होना चाहिए (मैंने मैन्युअल रूप से एमएसवीएस में स्ट्रिंग्स को जोड़ा है): जैसा कि आप देख सकते हैं, एकाधिक प्रविष्टियां, और यह "साफ" है और प्रोग्राम द्वारा आसानी से पहुंचा जा सकता है! enter image description here

अभी, मेरे स्रोत:

wstring buffer[5] = {L" Meow",L" I",L" Am",L" A",L" Dinosaur"}; // ignore the string 
if (HANDLE hRes = BeginUpdateResource("Output.exe",TRUE)) 
{ 
    for (int i = 0; i < 5; i++) 
    { 
    wchar_t * temp; 
    temp = new wchar_t[(buffer[i].length()+1)]; 
    wcscpy(temp,buffer[i].c_str()); 
    wcout << temp << endl; 
    UpdateResource(hRes,RT_STRING,MAKEINTRESOURCE(1),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        temp, 48); //buffer[i].length()+1 
    delete[] temp; 
    } 
    EndUpdateResource(hRes,FALSE); 

} 

का उत्पादन: enter image description here

कौन गलत है, क्योंकि यह केवल मेज पर अंतिम स्ट्रिंग को शामिल किया है लगता है, नहीं यह पहले तार !

जब मैं स्रोत को संशोधित करने की कोशिश तो MAKEINTRESOURCE (1) अब "MAKEINTRESOURCE (i)", परिणाम यह है के रूप में विभिन्न चित्रों में दिखाया गया: वास्तव में http://gyazo.com/5fa7a6682d5da2def4683227533b2755.png http://gyazo.com/e77f6e90cb3dbfe21d07b3d55c931acb.png http://gyazo.com/2e632768e2cdfcea8ab9cd08caea9cc8.png http://gyazo.com/f9dcd68c671923d8faefce76877bc3be.png

सफलता यह सभी तारों को जोड़ता है, लेकिन ऐसा लगता है कि विभिन्न स्ट्रिंग टेबल बनाए गए हैं जो वांछित नहीं थे। हालांकि मुझे लगता है कि आईडी में प्रत्येक तस्वीर में 16 की वृद्धि हुई है जो संभवतः कुछ समझा सकता है। असल में, मैं चाहता हूं कि तारों को पहली तस्वीर (एकाधिक तारों के साथ) के रूप में स्वरूपित किया जाए, लेकिन इसका कोई वास्तविक विचार नहीं है कि यह कैसे करें।

आपकी सहायता के लिए धन्यवाद।

+0

मैं स्ट्रिंग टेबल कैसे बना सकता हूं? क्या भरने के लिए कोई संरचना है? मैंने स्ट्रिंगटेबल और स्ट्रिंगफाइलइन्फो को देखा और कोशिश की लेकिन इसका कोई फायदा नहीं हुआ। – James

उत्तर

13

स्ट्रिंग संसाधन किसी भी अन्य संसाधन प्रारूप से अलग हैं। वे व्यक्तिगत प्रविष्टियों के रूप में संग्रहित नहीं होते हैं लेकिन प्रत्येक 16 तारों के समूहों में पैक किए जाते हैं। पहला समूह स्ट्रिंग्स 0 से 15 तक स्टोर करता है, दूसरा समूह 16 से 31 तारों को स्टोर करता है, और इसी तरह। समूहों के ऊपर आपके स्क्रीनशॉट में बाईं ओर के पेड़दृश्य में माता-पिता के नीचे पहले स्तर के रूप में प्रदर्शित किया जाता है।

स्ट्रिंग संसाधन भी अलग हैं कि वे शून्य-समाप्त सी-तारों के विपरीत गिनती यूनिकोड स्ट्रिंग्स (शून्य टर्मिनेटर के बिना) के रूप में संग्रहीत हैं। तो उदाहरण के लिए सी-स्ट्रिंग 'T' 'e' 's' 't' '\0'0004 0054 0065 0073 0074 के रूप में संग्रहीत किया जाएगा जहां पहले WORD लंबाई इंगित करता है और शेष 4 WORD एस यूनिकोड वर्णों का प्रतिनिधित्व करता है।

इस संसाधन प्रारूप का एक परिणाम यह है कि यदि समूह के भीतर स्ट्रिंग आईडी में अंतराल हैं तो लापता तारों को शून्य-लंबाई तारों के साथ जिम्मेदार माना जाना चाहिए, या बस संसाधन प्रारूप में 0000 बोलना होगा। इसलिए यदि आपके स्ट्रिंग तालिका आईडी 2 और 5 के साथ तार है 16 प्रविष्टियों के साथ एक समूह (1) होगा: 00000000<string 2>00000000<string 5>00000000 ... 0000

अभी भी UpdateResource पर कॉल में lpName पैरामीटर के लिए संसाधन संसाधन आईडी को पास करने के लिए कौन सा संसाधन आईडी है: चूंकि स्ट्रिंग संसाधन समूह को केवल संपूर्ण रूप से अपडेट किया जा सकता है, आपको समूह आईडी प्रदान करना होगा, जहां पहले समूह में आईडी 1 है।एक स्ट्रिंग आईडी से समूह आईडी की गणना groupID = (strID >> 4) + 1 के साथ की जाती है, जबकि समूह के भीतर सापेक्ष (शून्य-आधारित) ऑफ़सेट strOffset = strID % 16 है। आप MAKEINTRESOURCE(1) गुजर से उत्पादित परिणाम को देखें, तो अब आप देख सकते हैं क्यों यह सभी टुकड़ों को एक साथ लाना आप निम्नलिखित कोड का उपयोग कर एक स्ट्रिंग संसाधन अद्यतन कर सकते हैं 0.

की आईडी के साथ समूह 1 में समापन:

void ReplaceStringTable() { 

    HANDLE hRes = BeginUpdateResource(_T("Output.exe"), TRUE); 
    if (hRes != NULL) { 
     wstring data[] = { L"", // empty string to skip string ID 0 
          L"Raymond", 
          L"Chen", 
          L"is", 
          L"my", 
          L"Hero!", 
          // remaining strings to complete the group 
          L"", L"", L"", L"", L"", L"", L"", L"", L"", L"" 
         }; 

     vector<WORD> buffer; 
     for (size_t index = 0; 
       index < sizeof(data)/sizeof(data[ 0 ]); 
       ++index) { 

      size_t pos = buffer.size(); 
      buffer.resize(pos + data[ index ].size() + 1); 
      buffer[ pos++ ] = static_cast<WORD>(data[ index ].size()); 
      copy(data[ index ].begin(), data[ index ].end(), 
        buffer.begin() + pos); 
     } 
     UpdateResource(hRes, 
         RT_STRING, 
         MAKEINTRESOURCE(1), 
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
         reinterpret_cast< void* >(&buffer[ 0 ]), 
         buffer.size() * sizeof(WORD)); 

     EndUpdateResource(hRes, FALSE); 
    } 
}