我做了个小程序,知道怎样改注册表就可以把一类的扩展名的文件用这个文件打开,但怎样为这个程序传参数?
例如:
把*.abc用c:\1.exe打开,可已通过该注册表中的.abc项定义。但并不能告诉程序我要打开的那个文件,只能启动1.exe文件。
请问怎样解决?
谢谢!!!
例如:
把*.abc用c:\1.exe打开,可已通过该注册表中的.abc项定义。但并不能告诉程序我要打开的那个文件,只能启动1.exe文件。
请问怎样解决?
谢谢!!!
paramcount用于返回命令行参数的个数
paramstr数组用于存储命令行参数:if paramcount>1 then
showmessage('第1个命令行参数为:'+paramstr(1));//注:paramstr(0)返回的是应用程序的全名//你只需解析paramstr(1)以后就可以了。
(*注册文件类型关联*)
procedure RegisterFileType(ft,key,desc,icon,prg:string);
var MyReg : TRegIniFile;
ct : integer;
begin
ct := pos('.',ft);
while ct > 0 do begin
delete(ft,ct,1);
ct := pos('.',ft);
end;
if (ft = '') or (prg = '') then Exit;
ft := '.'+ft;
MyReg := TRegIniFile.Create('');
try
MyReg.RootKey := HKEY_CLASSES_ROOT;
if key = '' then key := Copy(ft,2,MaxInt)+'_auto_file';
MyReg.writestring(ft,'',key);
MyReg.writestring(key,'',desc);
if icon <> '' then MyReg.writestring(key+'\DefaultIcon','',icon);
MyReg.writestring(key+'\shell\open\command','',prg+' "%1"');
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
finally
MyReg.free;
end;
end;OnFormCreate:
if GetRunTimes = 1 then begin//如果第一次运行
RegisterFileType('.slib','SuperLib','SuperLib关联文件',ParamStr(0)+',0',ParamStr(0));
end;
if ParamCount<>0 then begin
OpenExpFile(ParamStr(1));//自定义过程;
end;
1、在你的源程序里通过判断ParamCount(参数个数)ParamStr(参数列表函数)进行解析,然后对解析出的文件*.abc进行处理。
2、注册你的程序。
(1)在注册表HKEY_CLASSES_ROOT下建立主键 .abc 将其默认的字符串值设置为你的应用程序类 比如:MyAbc
(2)在注册表HKEY_CLASSES_ROOT下建立主键MyAbc 建立如下主键
DefaultIcon 将默认字符串值设置为程序图标路径
shell-open-command 是3级主键 将command的默认字符串设置为““c:\1.exe”,“%1””
至于代码方面 我想你自己可以完成了吧?
for i := 1 to ParamCount do
begin
s := s + ParamStr(i) + ' ';
end;
if s <> '' then
begin
Memo1.Lines.LoadFromFile(s);
CurFile := s;
Caption := DefaultTitle + ' - ' + CurFile;
Application.Title := Trim(ExtractFileName(s)) + ' - ' + DefaultTitle;
SaveAlready := True;
Modified := False;
end;
就是你要的文件名