aggiornare una tabella di stringhe con UpdateResource

Ho posto la domanda qui – aggiornando STRING TABLE tramite UpdateResource (aggiungendo più stringhe)

E ora sto chiedendo di nuovo, poiché questa volta posso aggiungere molti più dettagli alla domanda.

Ho provato questo per il giorno passato o qualcosa senza alcun reale successo. Quello che voglio che il risultato sia è questo (ho aggiunto manualmente le stringhe in MSVS): Come puoi vedere, più voci, ed è “pulito” e può essere facilmente accessibile dal programma! inserisci la descrizione dell'immagine qui

In questo momento, la mia fonte:

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

produce: inserisci la descrizione dell'immagine qui

Il che è sbagliato, in quanto sembra aver aggiunto solo l’ultima stringa al tavolo, non le stringhe precedenti!

Quando provo a modificare il codice sorgente in modo che MAKEINTRESOURCE (1) sia ora “MAKEINTRESOURCE (i)”, il risultato è come mostrato in varie immagini: http://gyazo.com/5fa7a6682d5da2def4683227533b2755.pnghttp://gyazo.com/e77f6e90cb3dbfe21d07b3d55c931acb.pnghttp://gyazo.com/2e632768e2cdfcea8ab9cd08caea9cc8.pnghttp://gyazo.com/f9dcd68c671923d8faefce76877bc3be.png

Il successo nel fatto che ha aggiunto tutte le stringhe, ma sembra aver creato varie tabelle di stringhe che non è ciò che si desiderava. Anche se noto che gli ID sono aumentati di 16 in ogni immagine, il che potrebbe spiegare qualcosa. Fondamentalmente, voglio che le stringhe siano formattate come nella prima immagine (con le stringhe multiple), ma non hanno la vera idea di come farlo.

Grazie per il vostro aiuto.

Le risorse di stringa sono diverse da qualsiasi altro formato di risorsa. Non vengono memorizzati come singole voci ma raggruppati in gruppi di 16 stringhe ciascuno. Il primo gruppo memorizza le stringhe da 0 a 15, il secondo gruppo memorizza le stringhe dal 16 al 31 e così via. Nelle schermate sopra i gruppi vengono visualizzati come il primo livello sotto il genitore nella vista ad albero verso sinistra.

Anche le risorse di stringa sono diverse in quanto vengono memorizzate come stringhe Unicode conteggiate (senza un terminatore a zero) anziché come stringhe a C terminate da zero. Quindi, ad esempio, la stringa C 'T' 'e' 's' 't' '\0' verrà memorizzata come 0004 0054 0065 0073 0074 dove la prima WORD indica la lunghezza e le restanti 4 WORD rappresentano i caratteri Unicode.

Una conseguenza di questo formato di risorse è che se ci sono lacune negli ID di stringa all’interno di un gruppo le stringhe mancanti devono essere considerate con stringhe di lunghezza zero, o semplicemente 0000 in formato di risorse parlano. Quindi se la tua tabella di stringhe ha stringhe con ID 2 e 5, ci sarebbe un singolo gruppo (1) con 16 voci: 0000 0000 0000 0000 0000 00000000 .

C’è ancora lpName informazione richiesta, cioè quale ID di risorsa passare per il parametro lpName nella chiamata a UpdateResource : Poiché i gruppi di risorse stringa possono essere aggiornati solo nel loro insieme, è necessario fornire l’ID di gruppo, dove il primo gruppo ha l’ID 1. Il calcolo dell’ID di gruppo da un ID stringa viene eseguito con groupID = ( strID >> 4 ) + 1 , mentre l’offset relativo (a base zero) all’interno di un gruppo è strOffset = strID % 16 . Se guardi il risultato prodotto dal passaggio di MAKEINTRESOURCE(1) , ora puoi vedere perché è finito nel gruppo 1 con un ID di 0.

Mettendo insieme tutti i pezzi è ansible aggiornare una risorsa stringa usando il seguente codice:

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