高分求解关于安装程序的两个问题:1。反安装如何删除自身 2。如何判断ActiveX或Dll的版本(160分)

  • 主题发起人 主题发起人 tecelent
  • 开始时间 开始时间
T

tecelent

Unregistered / Unconfirmed
GUEST, unregistred user!
1。用Delphi写安装程序,假设注册了反安装程序为C:/programe files/mysoft/Uninstall.exe
,那么Uninstall运行完毕了,如何将自身及所在地Mysoft安装目录删除
2。注册Dll和Ocx前如何判断电脑上是否原有此Dll,以及其版本号是否比我要安装的更新

 
一个大概的答复:
1。可以利用Wininit程序(windows目录下),它在Windows启动时通过读取一个ini文件(忘
了叫什么名字了)的内容实现对运行中的dll等文件的更新或删除,当然可以用来删除你的
反安装程序了,这也是为什么很多程序要求你在安装或反安装后重启动Windows的原因。
格式如下(了解ini文件的格式吧):
Tag Value
target filename = source filename //替换
target filename = //删除

2。可以读取注册表中的相应键值,这个看一看关于注册表方面的书就可以了。
 
谢谢yyzyf,不过winInit到底用的是哪个ini呀,我搜索了整个注册表也没有找到一个使用wininit
的例子,你能找到吗;问题2是读HKey_Root_class/名称/Curver吗
 
这个东西是很久以前看一本98年的杂志上说的,所以也记不太清楚了,实在不行,我给你
出一个笨主意,就是找一个需要重启动系统的软件一装,让你重启动时不理它,然后搜索
windows或者windows/system目录下的新ini文件,看是哪一个就行了,与注册表应该无关。
至于问题2,很不好意思,我也只是根据印象猜测而已,如果你能找到,那就好,找不到
我暂时也帮不上。
 
参考这个吧

Windows包含这样的机制,可以在下次启动时替换到现在正在使用的文件。因此,我们的程序只需要做以下工作:

a) 将更新文件以另外一个文件名保存,最好是在应用程序的上当下(源文件和目标文件需要在同一个卷上)。
b) If Win32Platform = VER_PLATFORM_WIN32_NT Then
MoveFileEx( Pchar( tempFilenameWithPath ),
Pchar( realfilenamewithpath ),
MOVEFILE_REPLACE_EXISTING or MOVEFILE_DELAY_UNTIL_REBOOT )
Else
WritePrivateProfileString(
'rename',
Pchar( realfilenamewithpath),
Pchar( tempFilenameWithPath ),
'wininit.ini' );

注意:wininit文件需要使用短文件名(DOS 8.3),你必须将长文件名替换为短文件名。
 
以前有这样的答案, 你检索一下吧
 
问题1:
你可以写一个批处里文件
在批处里文件中删除要卸载的文件
然后删除批处里文件(批处里文件是可以删除自身的)
 
wininit.ini就是放在Windows目录下面的一个Ini文件!格式如下:
[rename]
FilleName1=FileName2
....

如果要删除一个文件应该这样:
Nul=D:/Test/Uninstall.exe
如果要替换一个文件
c:/windows/explorer.exe=D:/Test/abc.exe
就是这个样子了.
 
procedure TForm1.My_DeleteMe; //程序自杀
var
BatchFile: TextFile;
BatchFileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
{By Lovejingtao.http://Lovejingtao.126.com,Lovejingtao@21cn.com}
BatchFileName := ExtractFilePath(ParamStr(0)) + '$$a.bat';
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile, ':try');
Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
Writeln(BatchFile,
'if exist "' + ParamStr(0) + '"' + ' goto try');
Writeln(BatchFile, 'del "' + BatchFileName + '"');
Writeln(BatchFile, 'cls');
CloseFile(BatchFile);
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(BatchFileName), nil, nil,
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
Application.Terminate;
end;
 
谢谢各位兄弟,这个问题都好久了,我还以为没有人回答了呢,不好意思,总共只有160分,
如有分配不公,请勿介意
 
后退
顶部