2012-12-30 36 views
5

Tôi hỏi những câu dưới đây - updating STRING TABLE via UpdateResource (adding multiple strings)cập nhật một bảng chuỗi với UpdateResource

Và bây giờ tôi đang hỏi một lần nữa, như thời gian này tôi có thể thêm chi tiết rất nhiều cho câu hỏi.

Tôi đã thử điều này trong một ngày qua hoặc một thứ gì đó không có kết quả thực sự. Điều tôi muốn kết quả là như thế này (tôi đã thêm chuỗi bằng MSVS theo cách thủ công): Như bạn có thể thấy, nhiều mục nhập, và nó "sạch" và có thể dễ dàng truy cập bằng chương trình! enter image description here

Ngay bây giờ, nguồn của tôi:

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

} 

Tạo: enter image description here

Đó là sai, vì nó dường như chỉ có thêm chuỗi cuối cùng để bàn, không phải là chuỗi trước khi nó !

Khi tôi cố gắng sửa đổi mã nguồn để MAKEINTRESOURCE (1) được bây giờ "MAKEINTRESOURCE (i)", kết quả là thế này như thể hiện trong hình ảnh khác nhau: http://gyazo.com/5fa7a6682d5da2def4683227533b2755.png http://gyazo.com/e77f6e90cb3dbfe21d07b3d55c931acb.png http://gyazo.com/2e632768e2cdfcea8ab9cd08caea9cc8.png http://gyazo.com/f9dcd68c671923d8faefce76877bc3be.png

thành công trong thực tế nó đã thêm tất cả các chuỗi, nhưng nó dường như đã tạo ra các bảng chuỗi khác nhau mà không phải là những gì đã được mong muốn. Mặc dù tôi nhận thấy ID đã tăng lên 16 trong mỗi bức ảnh có thể giải thích được điều gì đó. Về cơ bản, tôi muốn các chuỗi được định dạng như trong hình ảnh đầu tiên (với nhiều chuỗi), nhưng không có ý tưởng thực sự làm thế nào để làm điều này.

Cảm ơn sự hỗ trợ của bạn.

+0

Làm cách nào để tạo bảng chuỗi? Có cấu trúc để điền vào không? Tôi đã xem xét và cố gắng StringTable, và StringFileInfo nhưng vô ích. – James

Trả lời

13

Tài nguyên chuỗi khác với bất kỳ định dạng tài nguyên nào khác. Chúng không được lưu trữ dưới dạng các mục riêng lẻ mà được đóng gói thành các nhóm gồm 16 chuỗi. Nhóm đầu tiên lưu các chuỗi từ 0 đến 15, nhóm thứ hai lưu các chuỗi từ 16 đến 31, v.v. Trong ảnh chụp màn hình của bạn ở trên, các nhóm được hiển thị dưới dạng cấp độ đầu tiên bên dưới phụ huynh trong thanh bên phải về phía bên trái.

Tài nguyên chuỗi cũng khác nhau ở chỗ chúng được lưu trữ dưới dạng chuỗi Unicode được tính (không có dấu ngắt 0) trái ngược với chuỗi C không bị chấm dứt. Vì vậy, ví dụ: C-string 'T' 'e' 's' 't' '\0' sẽ được lưu trữ dưới dạng 0004 0054 0065 0073 0074 trong đó WORD đầu tiên cho biết độ dài và 4 WORD s còn lại đại diện cho các ký tự Unicode.

Hậu quả của định dạng tài nguyên này là nếu có khoảng trống trong chuỗi ID trong một nhóm, các chuỗi bị thiếu phải được tính bằng chuỗi có độ dài bằng không hoặc đơn giản là 0000 trong định dạng tài nguyên. Vì vậy, nếu bảng chuỗi của bạn có dây với ID 2 và 5 sẽ có một nhóm duy nhất (1) với 16 mục: 00000000<string 2>00000000<string 5>00000000 ... 0000.

Vẫn còn một phần thông tin cần thiết, cụ thể là ID tài nguyên nào để chuyển cho tham số lpName trong cuộc gọi tới UpdateResource: Vì nhóm tài nguyên chuỗi chỉ có thể được cập nhật thành toàn bộ, bạn phải cung cấp ID nhóm, nhóm đầu tiên có ID 1.Tính toán ID nhóm từ ID chuỗi được thực hiện với groupID = (strID >> 4) + 1, trong khi chênh lệch tương đối (không dựa trên) trong một nhóm là strOffset = strID % 16. Nếu bạn nhìn vào kết quả sản xuất từ ​​đi qua MAKEINTRESOURCE(1) bây giờ bạn có thể thấy tại sao nó lên vết thương ở nhóm 1 với một ID của 0.

Đưa tất cả các mảnh lại với nhau, bạn có thể cập nhật một nguồn tài nguyên chuỗi bằng cách sử dụng đoạn mã sau:

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); 
    } 
} 
Các vấn đề liên quan