如何检查用户定义资源的{raw-data}是整数还是代码中的字符串?

时间:2011-08-04 06:47:38

标签: delphi resources delphi-xe

我使用Delphi XE,我有以下rc文件:

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

我的问题是如何检查用户定义资源的“原始数据”是整数还是代码中的字符串?

1 个答案:

答案 0 :(得分:2)

检查资源的数据类型的问题是Raw-Data可以在同一时间被解释为整数或字符串,因此您必须使用仅返回指针的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)分配不同的数据类型,而你必须创建不同的类型来存储字符串和整数,然后创建一个函数来处理每个类型