Как проверить, что {raw-data} пользовательского ресурса является целым числом или строками из кода? - PullRequest
1 голос
/ 04 августа 2011

Я использую Delphi XE, у меня есть следующий файл rc:

DB.PREFIX     sql_db     { "ALPHA\0" }
DB.MAJOR      sql_db     { 1 }
DB.MINOR      sql_db     { 1 }

Мой вопрос заключается в том, как проверить, что "необработанные данные" определенного пользователем ресурса являются целыми числами или строками из кода?

1 Ответ

2 голосов
/ 04 августа 2011

Проблема проверки типа данных ресурса заключается в том, что необработанные данные можно интерпретировать как целое число или строку одновременно, в связи с чем необходимо использовать только функцию LockResource, которая только возвращает указатель на ресурс без дополнительной информации.

Проверьте следующий код, если вы измените тип RawData с PAnsiChar на PInteger, код также будет работать, интерпретируя данные как целое число.

{$APPTYPE CONSOLE}
{$R Test.RES}

uses
  Windows,
  SysUtils;

Procedure CheckResource(const ResourceName:string);
 var
   hResInfo  : THandle;
   hResData  : THandle;
   RawData   : PAnsiChar; //-> the resource is treated as an string
   //RawData: PInteger; //-> the resource is treated as an integer
 begin
  hResInfo := FindResource(HInstance, PChar(ResourceName), 'sql_db');
  if hResInfo <> 0 then
  begin
    hResData:=LoadResource(HInstance, hResInfo) ;
    try
      if hResData <> 0 then
      begin
        RawData:=LockResource(hResData) ;
        Writeln(RawData);
      end
    finally
      FreeResource(hResInfo) ;
    end;
  end;
 end;

begin
  try
    CheckResource('DBPREFIX');
    CheckResource('DBMAJOR');
    CheckResource('DBMINOR');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.

Когда вы определяете ресурс пользовательского типа, вы создаете конкретный тип и являетесь частью вашей работы с этим ресурсом. то, что вы делаете сейчас, не имеет особого смысла, потому что вы назначаете разные типы данных одному и тому же пользовательскому типу (sql_db), вместо этого вы должны создать разные типы для хранения строк и целых чисел, а затем создать функцию для обработки каждого типа .

...