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应该可以。当然,它不是一个有效的字符串。这是一个哨兵价值观。是的,您可以使用字符串版本,但这不是惯用法。