2015-08-24 2 views
2

Я использовал мастер DLL-ресурсов в Delphi 2010 для генерации только DLL-ресурсов для моей программы. Когда я смотрю на них с помощью Notepad ++, кажется, что они используют кодировку ANSI. Есть ли какие-то настройки, которые я пропустил? Кажется, что unicode-программа должна хранить свои ресурсы в ANSI специально для азиатских языков.Почему мой DLL-файл ресурса Delphi 2010 ANSI Encoded

Я смотрел конкретно на запись TABOUTBOX RT_RCDATA. Я пытался загрузить его, используя следующий код,

procedure LoadFromResFile(const FileName: string); 
var 
    LibHandle: THandle; 
    ResourceLocation: HRSRC; 
    ResourceSize: dword; 
    ResourceHandle: THandle; 
    ResourcePointer: pointer; 
    ResStr: string; 
begin 
    LibHandle := LoadLibraryEx(PWideChar(FileName), 0, LOAD_LIBRARY_AS_DATAFILE or LOAD_LIBRARY_AS_IMAGE_RESOURCE); 
    if LibHandle > 0 then 
    begin 
    ResourceLocation := FindResource(LibHandle, 'TABOUTBOX', RT_RCDATA); 
    ResourceSize := SizeofResource(LibHandle, ResourceLocation); 
    ResourceHandle := LoadResource(LibHandle, ResourceLocation); 
    ResourcePointer := LockResource(ResourceHandle); 
    if ResourcePointer <> nil then 
    begin 
     SetLength(ResStr, ResourceSize); 
     CopyMemory(@ResStr[1], ResourcePointer, ResourceSize); 
     FreeResource(ResourceHandle); 
    end; 
    FreeLibrary(LibHandle); 
    end else 
    begin 
    ResStr := SysErrorMessage(GetLastError); 
    ShowMessage(ResStr); 
    end; 

я получил мусор, но когда я изменил тип ResStr к AnsiString, он показал, правильно. Открыв файл в Notepad ++, я вижу, что ресурсы диалога выглядят как ansi, включая титры ярлыков.

+0

Строковые ресурсы всегда хранятся в Unicode (см [Формат строки ресурсов] (http://blogs.msdn.com/b/oldnewthing/archive/2004/01/30/65013. ASPX)). Это часть спецификации. Что заставляет вас думать, что они ANSI? –

+0

@Remy - эта статья Old New Thing специально посвящена ресурсам RT_STRING. В этом случае ресурс представляет собой RT_RCDATA (приложение определено). – Deltics

+0

Этот ресурс представляет собой двоичный ресурс DFM, а не ресурс строки. –

ответ

8

Мастер DLL ресурсов создает ресурсы RCDATA для локализованных DFM. Ресурс RCDATA с именем TABOUTBOX является двоичным ресурсом DFM. Значения строк, хранящиеся в DFM (имена компонентов, титры и т. Д.), Кодируются с использованием UTF8 в современных версиях Delphi, включая 2010 год. Но данные DFM сами по себе носят двоичный характер и представляют собой полную структуру сериализованных компонентов. Это не само данные Unicode, поэтому вы не можете загрузить его как-есть в UnicodeString (он «работает», когда вы меняете ResStr на AnsiString, но только из-за его 8-битной природы). Ресурсы DFM предназначены для TForm/TDataModule/TFrame -распределенных классов (в данном случае TAboutBox) для загрузки и де-сериализации во время выполнения.

Если вы хотите просмотреть ресурс DFM как удобный для чтения текст, вы должны использовать функцию или ObjectResourceToText() для ее декодирования. Например:

var 
    LibHandle: THandle; 
    ResStrm: TResourceStream; 
    StrStrm: TStringStream; 
    ResStr: string; 
begin 
    LibHandle := LoadLibraryEx(PChar(FileName), 0, LOAD_LIBRARY_AS_DATAFILE or LOAD_LIBRARY_AS_IMAGE_RESOURCE); 
    if LibHandle > 0 then 
    begin 
    try 
     ResStrm := TResourceStream.Create(LibHandle, 'TABOUTBOX', RT_RCDATA); 
     try 
     StrStrm := TStringStream.Create; 
     try 
      ObjectBinaryToText(ResStrm, StrStrm); 
      StrStrm.Position := 0; 
      ResStr := StrmStrm.DataString; 
     finally 
      StrStrm.Free; 
     end; 
     finally 
     ResStrm.Free; 
     end; 
    finally 
     FreeLibrary(LibHandle); 
    end; 
    end else 
    begin 
    ResStr := SysErrorMessage(GetLastError); 
    end; 
    ShowMessage(ResStr); 
end; 
+0

После изменения «ObjectResourceToText» на «ObjectBinaryToText» и «ResStrm.DataString» на «StrStrm.DataString» он работает так, как ожидалось. – user1998520