Delphi 无法读取我的资源(.res)文件

Delphi 无法读取我的资源(.res)文件,delphi,Delphi,我已经编写了一个简单的加载程序来安装我的程序及其帮助文件 unit PSInstaller; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Registry, Vcl.StdCtrls, HTMListB, HTMLabel, S

我已经编写了一个简单的加载程序来安装我的程序及其帮助文件

unit PSInstaller;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Registry, Vcl.StdCtrls, HTMListB,
  HTMLabel, System.Zip;

type
  TfmPDSInstaller = class(TForm)
    HTMLabel1: THTMLabel;
    HTMListBox1: THTMListBox;
    btnNext: TButton;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function InstallFile(ResID: integer; pName: String): Boolean;
  public
    { Public declarations }
  end;

var
  fmPDSInstaller: TfmPDSInstaller;

implementation

{$R 'ProtonStudio32.res' 'ProtonStudio32.rc'}
{$R *.dfm}

Var IDEDirectory: String;

Const APP = 100;
      HELP = 200;

procedure TfmPDSInstaller.btnNextClick(Sender: TObject);
begin
  HTMListBox1.AddItem('Copying Proton Studio to Proton IDE directory',nil);
  if InstallFile(APP, 'Studio Application') then begin
    HTMListBox1.AddItem('Copying Proton Studio Help to Proton IDE directory',nil);
    If InstallFile(HELP, 'Studio Help') then
      HTMListBox1.AddItem('Proton Studio Installed', nil);
  end;
end;

function TfmPDSInstaller.InstallFile(ResID: integer; pName: String): Boolean;
Var rs: TResourceStream;
    Zip: TZipFile;
    s: String;
begin
  Result := false;
  try
    Rs := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA);
    Zip := TZipFile.Create;
    try
      Zip.Open(Rs,zmRead);
      Zip.ExtractAll(IDEDirectory);
    finally
      Rs.Free;
      Zip.Free;
      Result := true;
    end;
  except
    on EFOpenError do
      s  := 'Unable to Open resource ' + pName;
    else
      s := 'Unable to Copy file from resource ' + pName;
  end;
  HTMListBox1.AddItem(s, nil);
end;

procedure TfmPDSInstaller.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TfmPDSInstaller.FormCreate(Sender: TObject);
Var Reg: TRegistry;
begin
  btnNext.Enabled := false;
  Reg := TRegistry.Create;
  HTMListBox1.AddItem('Checking for ProtonIDE',nil);
  if Reg.OpenKey('Software\MecaniqueUK\ProtonIDE\Install', false) then begin
    IDEDirectory := Reg.ReadString('IDE');
    Reg.CloseKey;
  end;
  Reg.Free;
end;

procedure TfmPDSInstaller.FormShow(Sender: TObject);
begin
  btnNext.Enabled := false;
  if DirectoryExists(IDEDirectory) then begin
    HTMListbox1.AddItem('Click Next to install Proton Studio in ' + IDEDirectory, nil);
    btnNext.Enabled := true;
  end
  else
    HTMListBox1.AddItem('Proton IDE must be installed first', nil);
end;    
end.
我已经创建了一个.rc脚本来加载我的程序和帮助

#100 RT_RCDATA "D:\Data\Documents\RAD Studio\Projects\ProtonNewIDE\Win32\Debug\ProtonNewIDE.zip"
#200 RT_RCDATA "D:\Data\Documents\RAD Studio\Projects\ProtonNewIDE\Win32\Debug\Proton Studio.zip"
我在Delphi Berlin 10.1中工作,生成了我的资源文件,我可以在我的资源编辑器中打开它,但当我尝试打开资源时:

Rs := TResourceStream.CreateFromID(Application.Handle, ResID, RT_RCDATA);
我收到地址冲突。它在系统中中断。此时的类:

  HResInfo := FindResource(Instance, Name, ResType);
并且Name和ResType都是空的


请给我一个指针,指出我做错了什么?

您传递的是窗口句柄而不是模块句柄。而是将句柄传递给包含此代码的模块

传递的是窗口句柄而不是模块句柄。而是将句柄传递给包含此代码的模块

我认为
应用程序.Handle
不是
TResourceStream.CreateFromID
的正确参数。来自:Instance参数是与包含资源的可执行或共享库关联的实例句柄。我认为来自
SysInit
HInstance
应该是正确的。这让我更进一步,我现在得到了一个Resource not found 100错误。我注意到RT\U数据没有被正确识别。当我将鼠标悬停在它上面时,我得到了RT_RCDATA-错误类型,当我在Classes.TResourceStream.CreateFromID中调试时,ResType是“立即排序的-RT_RCDATA必须是字符串Rs:=TResourceStream.CreateFromID(HInstance,ResID,'RT_RCDATA')RT_RCDATA应该可以。当然,它不是一个有效的字符串。这是一个哨兵价值观。是的,您可以使用字符串版本,但这不是惯用法。我认为
应用程序.Handle
不是
TResourceStream.CreateFromID
的正确参数。来自:Instance参数是与包含资源的可执行或共享库关联的实例句柄。我认为来自
SysInit
HInstance
应该是正确的。这让我更进一步,我现在得到了一个Resource not found 100错误。我注意到RT\U数据没有被正确识别。当我将鼠标悬停在它上面时,我得到了RT_RCDATA-错误类型,当我在Classes.TResourceStream.CreateFromID中调试时,ResType是“立即排序的-RT_RCDATA必须是字符串Rs:=TResourceStream.CreateFromID(HInstance,ResID,'RT_RCDATA')RT_RCDATA应该可以。当然,它不是一个有效的字符串。这是一个哨兵价值观。是的,您可以使用字符串版本,但这不是惯用法。