嗨,我有一个程序,当加载按钮时,在应用程序本身中手动创建资源(在本例中是图像),然后读取资源以在 timage 中显示。El 的问题是,它似乎创建了资源很好,但是当我想加载资源时却说在你寻找时找不到它。
代码。
procedure StringtoRes(const FileName: string; Inputstream: TMemoryStream);
var
hUpdate: THandle;
begin
hUpdate := BeginUpdateResource(PChar(FileName), True);
try
UpdateResource(hUpdate, RT_RCDATA, 'ID', LANG_NEUTRAL, Inputstream.Memory,
Inputstream.Size);
finally
EndUpdateResource(hUpdate, False);
end;
end;
procedure TForm1.btnTestClick(Sender: TObject);
var
MemStr: TMemoryStream;
FileName: string;
var
RStream: TResourceStream;
JPEGImage: TJPEGImage;
begin
FileName := 'c:/test/test.jpg';
MemStr := TMemoryStream.Create;
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
StringtoRes(paramstr(0), MemStr);
MemStr.Free;
Sleep(3000);
RStream := TResourceStream.Create(HInstance, 'ID', RT_RCDATA);
JPEGImage := TJPEGImage.Create;
JPEGImage.LoadFromStream(RStream);
Image1.Picture.Graphic := JPEGImage;
JPEGImage.Free;
RStream.Free;
end;
当我解决这个问题时?
最佳答案
通常,正在运行的进程无法更新自己的资源,因为其可执行文件被锁定且不可写。要执行您正在尝试的操作,您应该将资源移动到单独的 DLL,然后您可以在需要加载其资源时通过 LoadLibrary()
动态加载 DLL,并通过 卸载它FreeLibrary()
当您需要更新其资源时。
var
hResLib: THandle = 0;
procedure TForm1.btnTestClick(Sender: TObject);
var
ResFileName: string;
MemStr: TMemoryStream;
RStream: TResourceStream;
JPEGImage: TJPEGImage;
begin
ResFileName := ExtractFilePath(ParamStr(0)) + 'myres.dll';
if hResLib <> 0 then
begin
FreeLibrary(hResLib);
hResLib := 0;
end;
MemStr := TMemoryStream.Create;
try
MemStr.LoadFromFile('c:/test/test.jpg');
MemStr.Position := 0;
StringtoRes(ResFileName, MemStr);
finally
MemStr.Free;
end;
Sleep(3000);
hResLib := LoadLibrary(ResFileName);
Win32Check(hResLib <> 0);
RStream := TResourceStream.Create(hResLib, 'ID', RT_RCDATA);
try
JPEGImage := TJPEGImage.Create;
try
JPEGImage.LoadFromStream(RStream);
Image1.Picture.Graphic := JPEGImage;
finally
JPEGImage.Free;
end;
finally
RStream.Free;
end;
end;
此外,在调用 UpdateResource()
之前,您不会检查 BeginUpdateResource()
的返回值以确保它确实成功。
procedure StringtoRes(const FileName: string; Inputstream: TMemoryStream);
var
hUpdate: THandle;
bDiscard: BOOL;
begin
hUpdate := BeginUpdateResource(PChar(FileName), True);
Win32Check(hUpdate <> 0); // <-- ADD THIS!
bDiscard := True;
try
Win32Check(UpdateResource(hUpdate, RT_RCDATA, 'ID', LANG_NEUTRAL, Inputstream.Memory, Inputstream.Size));
bDiscard := False;
finally
EndUpdateResource(hUpdate, bDiscard);
end;
end;
关于delphi - 在 Delphi 中创建和加载资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36140564/