2012-12-30 13 views
5

zadałem pytanie tutaj - updating STRING TABLE via UpdateResource (adding multiple strings)aktualizowania tabeli ciąg z UpdateResource

A teraz pytam jeszcze raz, jak ten czas mogę dodać dużo więcej szczegółów na pytanie.

Próbowałem tego przez ostatni dzień lub coś bezskutecznie. Chciałbym, aby wynik był taki (ręcznie dodałem ciągi w MSVS): Jak widać, wiele wpisów, i to "czyste" i mogą być łatwo dostępne przez program! enter image description here

Teraz moje źródło:

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); 

} 

Produkuje: enter image description here

Co jest źle, jak się wydaje tylko dodałem ostatni ciąg do stołu, nie struny przed nim !

przy próbie modyfikacji źródła tak MAKEINTRESOURCE (1) jest teraz "MAKEINTRESOURCE (I)", rezultat jest ten, jak pokazano na różnych zdjęciach: http://gyazo.com/5fa7a6682d5da2def4683227533b2755.png http://gyazo.com/e77f6e90cb3dbfe21d07b3d55c931acb.png http://gyazo.com/2e632768e2cdfcea8ab9cd08caea9cc8.png http://gyazo.com/f9dcd68c671923d8faefce76877bc3be.png

sukces w rzeczywistości dodano wszystkie łańcuchy, ale wydaje się, że utworzono różne tabele strun, które nie są zgodne z oczekiwaniami. Chociaż zauważam, że liczba ID wzrosła o 16 na każdym zdjęciu, co mogłoby wyjaśnić coś. Zasadniczo chcę, aby łańcuchy były sformatowane jak na pierwszym obrazie (z wieloma ciągami znaków), ale nie mam pojęcia, jak to zrobić.

Dziękuję za pomoc.

+0

Jak zbudować tabelę ciągów? Czy istnieje struktura do wypełnienia? Sprawdziłem i spróbowałem StringTable i StringFileInfo, ale bez skutku. – James

Odpowiedz

13

Zasoby ciągów różnią się od innych formatów zasobów. Nie są one zapisywane jako pojedyncze wpisy, lecz pakowane w grupy po 16 ciągów. Pierwsza grupa przechowuje łańcuchy od 0 do 15, druga grupa przechowuje łańcuchy od 16 do 31 i tak dalej. Na powyższych zrzutach ekranu grupy są wyświetlane jako pierwszy poziom pod elementem nadrzędnym w widoku drzewa po lewej stronie.

Zasoby ciągów są również różne, ponieważ są przechowywane jako zliczane ciągi Unicode (bez zerowania zer) w przeciwieństwie do zakończonych znakiem zero łańcuchów C. Na przykład ciąg znaków C 'T' 'e' 's' 't' '\0' zostanie zapisany jako 0004 0054 0065 0073 0074, gdzie pierwszy WORD wskazuje długość, a pozostałe 4 WORD s oznaczają znaki Unicode.

Konsekwencją tego formatu zasobów jest to, że jeśli istnieją luki w identyfikatorach ciągów w grupie, brakujące ciągi muszą być uwzględnione w łańcuchach o zerowej długości lub po prostu 0000 w formacie zasobów mówić. Więc jeśli ma ciąg tabeli ciągów z identyfikatorami 2 i 5 nie będzie pojedyncza grupa (1) z 16 wpisów: 00000000<string 2>00000000<string 5>00000000 ... 0000.

Jest jeszcze jedna informacja wymagana, mianowicie który zasób ID przekazać jako parametr w wywołaniu lpName do UpdateResource: Ponieważ grupy zasobów ciąg może być aktualizowana tylko jako całość, musisz podać identyfikator grupy, w których pierwsza grupa ma ID 1.Obliczanie identyfikatora grupy z identyfikatora ciągu odbywa się za pomocą groupID = (strID >> 4) + 1, natomiast względne (zerowe) przesunięcie w grupie to strOffset = strID % 16. Jeśli spojrzeć na skutek wytworzonej z przechodzącej MAKEINTRESOURCE(1) można teraz zrozumieć, dlaczego ona zlikwidowana w grupie 1 z identyfikatorem 0.

umieszczenie wszystkich elementów razem można zaktualizować zasobu ciąg stosując następujący kod:

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); 
    } 
} 
Powiązane problemy