给你源码看看 //----------------读注册表-------------------- function reg_init():string; var ff:boolean; sqlstr,DBServerName,DBName,DBID,DBPwd:string; reg:TRegistry; begin try Reg:= TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE ; if Reg.OpenKey('\Software\Microsoft\.NETFramework', false) then begin if Reg.ValueExists('InstallRoot')then begin DBServerName:=Reg.ReadString('InstallRoot'); end; Reg.CloseKey; end; finally Reg.Free; end; result:=DBServerName; except on e:exception do showmessage(E.message); end; result:=DBServerName; end;
//遍历文件夹,查找'mscorlib.dll' function EnumFileInQueue(path:PChar):boolean; var searchRec:TSearchRec; found:Integer; tmpStr:String; curDir:PChar; dirs:TQueue; f:boolean; i:Integer; begin i:=0;//查找结果(文件数) f:=false; dirs:=TQueue.Create;//创建目录队列 dirs.Push(path);//将起始搜索路径入队 curDir:=dirs.Pop;//出队 {开始遍历,直至队列为空(即没有目录需要遍历)} while (curDir<> nil) do begin //加上搜索后缀,得到类似'c:\*.*' 、'c:\windows\*.*'的搜索路径 tmpStr:=StrPas(curDir)+'\*.*'; //在当前目录查找第一个文件、子目录 found:=FindFirst(tmpStr,faAnyFile,searchRec); while found=0 do //找到了一个文件或目录后 begin //如果找到的是个目录 if (searchRec.Attr and faDirectory)<>0 then begin {在搜索非根目录(C:\、D:\)下的子目录时会出现'.','..'的"虚拟目录" 大概是表示上层目录和下层目录吧要过滤掉才可以} if (searchRec.Name <> '.') and (searchRec.Name <> '..') then begin {由于查找到的子目录只有个目录名,所以要添上上层目录的路径 searchRec.Name = 'Windows'; tmpStr:='c:\Windows'; 加个断点就一清二楚了 } tmpStr:=StrPas(curDir)+'\'+searchRec.Name; {将搜索到的目录入队。让它先晾着。 因为TQueue里面的数据只能是指针,所以要把string转换为PChar 同时使用StrNew函数重新申请一个空间存入数据,否则会使已经进 入队列的指针指向不存在或不正确的数据(tmpStr是局部变量)。} dirs.Push(StrNew(PChar(tmpStr))); end; end //如果找到的是个文件 else begin {Result记录着搜索到的文件数。可是我是用CreateThread创建线程 来调用函数的,不知道怎么得到这个返回值我不想用全局变量} i:=i+1; //把找到的文件加到Memo控件 if searchRec.Name = 'mscorlib.dll' then f:=true; //Form1.Label1.Caption := StrPas(curDir)+''+searchRec.Name; end; //查找下一个文件或目录 found:=FindNext(searchRec); end; {当前目录找到后,如果队列中没有数据,则表示全部找到了; 否则就是还有子目录未查找,取一个出来继续查找。} if dirs.Count > 0 then curDir:=dirs.Pop else curDir:=nil; end; //释放资源 dirs.Free; FindClose(searchRec); result:=f; end;
创建窗口之前进行判断 Application.Initialize; path:=reg_init()+'v1.1.4322\'; ff:= EnumFileInQueue(PChar(path)); if ff = true then begin open_exe(); Application.Terminate; end else begin Application.CreateForm(TForm1, Form1); Application.Run; end;
如果存在就认为是已经安装:
\LocalMachine\software\microsoft\.NetFrameWork
下面的
InstallRoot(=C:\WINDOWS\Microsoft.NET\Framework\)存放安装目录,不同的版本安装在不同的目录下.
Policy\v1.0\有版本信息.
同时,微软网站
http://www.microsoft.com/china/community/article.asp?oBODY=TechZone/TechArticle/TechDoc/deployNETApp&oXSLT=TechZone/TechArticle/TechContent
也有一篇关于使用C++来检测的文章,不过这篇文章在论坛中有些争议,你自己看看.
//----------------读注册表--------------------
function reg_init():string;
var ff:boolean;
sqlstr,DBServerName,DBName,DBID,DBPwd:string;
reg:TRegistry;
begin
try
Reg:= TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE ;
if Reg.OpenKey('\Software\Microsoft\.NETFramework', false) then
begin
if Reg.ValueExists('InstallRoot')then
begin
DBServerName:=Reg.ReadString('InstallRoot');
end;
Reg.CloseKey;
end;
finally
Reg.Free;
end;
result:=DBServerName;
except on e:exception do
showmessage(E.message);
end;
result:=DBServerName;
end;
function EnumFileInQueue(path:PChar):boolean;
var
searchRec:TSearchRec;
found:Integer;
tmpStr:String;
curDir:PChar;
dirs:TQueue;
f:boolean;
i:Integer;
begin
i:=0;//查找结果(文件数)
f:=false;
dirs:=TQueue.Create;//创建目录队列
dirs.Push(path);//将起始搜索路径入队
curDir:=dirs.Pop;//出队
{开始遍历,直至队列为空(即没有目录需要遍历)}
while (curDir<> nil) do
begin
//加上搜索后缀,得到类似'c:\*.*' 、'c:\windows\*.*'的搜索路径
tmpStr:=StrPas(curDir)+'\*.*';
//在当前目录查找第一个文件、子目录
found:=FindFirst(tmpStr,faAnyFile,searchRec);
while found=0 do
//找到了一个文件或目录后
begin
//如果找到的是个目录
if (searchRec.Attr and faDirectory)<>0 then
begin
{在搜索非根目录(C:\、D:\)下的子目录时会出现'.','..'的"虚拟目录"
大概是表示上层目录和下层目录吧要过滤掉才可以}
if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
begin
{由于查找到的子目录只有个目录名,所以要添上上层目录的路径
searchRec.Name = 'Windows';
tmpStr:='c:\Windows';
加个断点就一清二楚了
}
tmpStr:=StrPas(curDir)+'\'+searchRec.Name;
{将搜索到的目录入队。让它先晾着。
因为TQueue里面的数据只能是指针,所以要把string转换为PChar
同时使用StrNew函数重新申请一个空间存入数据,否则会使已经进
入队列的指针指向不存在或不正确的数据(tmpStr是局部变量)。}
dirs.Push(StrNew(PChar(tmpStr)));
end;
end
//如果找到的是个文件
else begin
{Result记录着搜索到的文件数。可是我是用CreateThread创建线程
来调用函数的,不知道怎么得到这个返回值我不想用全局变量}
i:=i+1;
//把找到的文件加到Memo控件
if searchRec.Name = 'mscorlib.dll' then
f:=true;
//Form1.Label1.Caption := StrPas(curDir)+''+searchRec.Name; end;
//查找下一个文件或目录
found:=FindNext(searchRec);
end;
{当前目录找到后,如果队列中没有数据,则表示全部找到了;
否则就是还有子目录未查找,取一个出来继续查找。}
if dirs.Count > 0 then
curDir:=dirs.Pop
else
curDir:=nil;
end;
//释放资源
dirs.Free;
FindClose(searchRec);
result:=f;
end;
Application.Initialize;
path:=reg_init()+'v1.1.4322\';
ff:= EnumFileInQueue(PChar(path));
if ff = true then
begin
open_exe();
Application.Terminate;
end
else
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end;