Tôi đang sử dụng tài nguyên cho chương trình cập nhật của mình. tôi đã được biên dịch tài nguyên với brcc32 hơn so với chương trình updater biên dịch. khi chương trình updater chạy tự kiểm tra mọi thứ và viết hoặc cập nhật với những cái mới. nhưng về quá trình này, bạn phải viết đúng, xóa các đặc quyền tại nơi chương trình của bạn chạy.
tôi đang thêm mã mẫu vào bên dưới.
tập tin exe.rc
newprog RCDATA Application.exe
tập tin makeres.bat
brcc32 exe.rc
tập tin updater.dpr
{$R exe.res}
tập tin đơn vị và thủ tục
procedure ExtractRes(resname,fname,ext:string);
var
rStream:TResourceStream;
fStream:TFileStream;
fNamex:string;
begin
fNamex:=ExtractFilePath(Application.ExeName)+fname+'.'+ext;
if not fileExists(fnamex) then
begin
try
rStream:=tresourcestream.Create(hinstance,ResName,RT_rcDATA);
fStream := TFileStream.Create(fnamex, fmCreate);
fStream.CopyFrom(rStream, 0);
finally
rStream.Free;
fstream.Free;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
apath:string;
begin
if Timer1.Enabled then
Timer1.Enabled:=false;
apath:=ExtractFilePath(Application.ExeName);
lblMesg.Caption:='Backup old version';
Application.ProcessMessages;
if FileExists(apath+'Application_old.bak') then
DeleteFile(apath+'Application_old.bak') ;
while FileExists(apath+'Application.exe') do
begin
RenameFile(apath + 'Application.exe', apath + 'Application_old.bak');
sleep(1);
if FileExists(apath+'Application.exe') then
begin
lblMesg.Caption:='It seems application still running. Waiting for end';
if FileExists(apath+'Application_old.bak') then
DeleteFile(apath+'Application_old.bak');
DeleteFile(apath+'Application.exe');
end;
Application.ProcessMessages;
end;
lblMesg.Caption:='Creating New Version..';
Application.ProcessMessages;
ExtractRes('Application','Application','exe');
lblMesg.Caption:='Running New Version...';
Application.ProcessMessages;
WinExec(pchar(apath+'Application.exe'),sw_show);
Application.ProcessMessages;
Halt;
end;
tôi nghĩ rằng điều này có thể giúp câu hỏi 1,2,3 của bạn. Đối với 4 bạn có thể mở rộng mã.
Nguồn
2010-04-27 00:03:24
Xin chào! 1, tôi cần phải giải nén tập tin vào một thư mục tạm thời và chạy chương trình của tôi ở đó. Một số dll cần phải ở trong cùng thư mục với chương trình và nếu chương trình được chạy mà không có quyền quản trị, nó không thể sử dụng thư mục cơ sở để trích xuất các tệp. 2, Chương trình của tôi sử dụng dll để kết nối với cơ sở dữ liệu. Nếu tôi cố gắng xóa dll sau khi bị ngắt kết nối, nó vẫn đang được sử dụng bởi các thành phần DB. Vì vậy, tôi cần phải gọi một chương trình riêng biệt chỉ để xóa các tập tin gây ra tất cả các loại vấn đề – Steve
tôi hiểu. bạn cần độ cao cho vista và 7. nhưng đối với người dùng giới hạn xp standart bạn cần nhắc người dùng chạy với tư cách quản trị viên. Tôi không biết xp soluiton, nhưng tôi biết bạn phải chạy quá trình từ bên trong mã của bạn một lần nữa với shellexecuteex. nếu bạn google nó bạn tìm thấy ví dụ tốt. nhưng đối với độ cao, tôi có thể gửi dự án mẫu. –
Vì vậy, đây là giải pháp cuối cùng và của bạn là gần nhất: Tôi đã quyết định viết chương trình vắt của riêng tôi. Các bước: 1, chương trình Extractor trích xuất các tệp từ tài nguyên 2, chương trình Extractor khởi chạy trình cập nhật chính bằng ShellExecuteEx 3, Khi trình cập nhật hoàn tất, chương trình trình trích xuất sẽ xóa các tệp khỏi thư mục temp. Điều này hóa ra lại là giải pháp tốt nhất thay vì sử dụng sự nhảm nhí của bên thứ 3. Cảm ơn! – Steve