Проблема проверки типа данных ресурса заключается в том, что необработанные данные можно интерпретировать как целое число или строку одновременно, в связи с чем необходимо использовать только функцию 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), вместо этого вы должны создать разные типы для хранения строк и целых чисел, а затем создать функцию для обработки каждого типа .