用自己的程序关联EXE文件,可以启动自己的程序,也可以监视启动的程序,可是问题来了。。。
在注册表里改EXE的关联 "%1" %* 为 MyApp "%1" %*
取将自己的程序程序的参数 paramstr(1) + paramstr(2) + ....
可是,但用户点控制面板时,就不能打开部分程序了。因为有的CPL 调用是有参数的。
就算我读完 paramcount 也不能取得最后的参数。怎么办?
问题点数:50、回复次数:29Top
1 楼rlpcdk()回复于 2003-12-03 08:42:29 得分 0
关注Top
2 楼jxc163(一寒)回复于 2003-12-03 08:48:04 得分 0
黑客程序,关注Top
3 楼mentalpatient(按时吃药)回复于 2003-12-03 11:51:00 得分 0
我靠 我试了一下 还真有这个问题 以前都没注意到!
我认为参数取不全 是不是和 "%1" %* 格式有关
是不是在加一些符号,就能得到其余的参数。
有问题我们可以探讨一下。
Top
4 楼keyb(不信风情)回复于 2003-12-04 23:13:53 得分 0
关于这个问题,我继续试了下去,发现它居然会使各种版本的WINDOWS无法关机。
我想原因是因为MYAPP接管了RUNDLL32.EXE的运行后却又无法正确传递所有的参数给它。
有什么办法呢?期待先生们的指点 :)
另:
TO:mentalpatient
一般我会这样写:
for i := 1 to paramcount - 1 do
begin
....
end;
尤其有趣的是:
这次我调烦了,写了个 paramcount + 100 ,嘿嘿,系统居然没让我去死,仍旧照常运行。
看来只有绕看这个办法了,那我怎么才能知道用户要运行RUNDLL32.EXE,然后立即解除关联呢? 天啊!我可不想为了这个去把“冰河”反汇编一次。
Top
5 楼angelface(§<@#$&^%$>§)回复于 2003-12-07 18:48:07 得分 0
修改注册表就行了
function GetAssociation(const DocFileName: String): String;
var
FileClass: String;
Reg: TRegistry;
begin
Result := '';
Reg := TRegistry.Create(KEY_EXECUTE);
Reg.RootKey := HKEY_CLASSES_ROOT;
FileClass := '';
if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then
begin
FileClass := Reg.ReadString('');
Reg.CloseKey;
end;
if FileClass <> '' then
begin
if Reg.OpenKeyReadOnly(FileClass + '\Shell\Open\Command') then
begin
Result := Reg.ReadString('');
Reg.CloseKey;
end;
end;
Reg.Free;
end;Top
6 楼liyangyao970(纳兰容若)回复于 2003-12-07 19:05:07 得分 0
upTop
7 楼keyb(不信风情)回复于 2003-12-07 19:22:51 得分 0
to angelface
非常感谢您能这么详细的贴出一段文件关联的代码,可你自己试试,当您关联了EXE后出问题不?Top
8 楼smalltalk(老徐)回复于 2003-12-07 20:41:25 得分 0
关键是你这个MyApp写的好不好,对与大多数程序,你应该将参数在完全传递到后面的exe中。应该用CreateProcess来创建新的进程。Top
9 楼zhuxud(圣东方)回复于 2003-12-07 20:50:21 得分 0
markTop
10 楼keyb(不信风情)回复于 2003-12-09 20:50:54 得分 0
正是因为我的MyApp传不全所有参数,我才有此一问的呀
望能赐教Top
11 楼keyb(不信风情)回复于 2003-12-13 21:29:49 得分 0
各位,麻烦发表一下自己的看法吧。Top
12 楼hsgrass37301(零点)回复于 2003-12-14 23:44:52 得分 0
upTop
13 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2003-12-15 00:51:20 得分 0
参数有空的话要用“号包起来的
例如”参数 1“Top
14 楼ekin(风语者)回复于 2003-12-16 22:33:55 得分 0
var
lphKey: HKEY;
sKeyName: string;
sKeyValue: string;
begin
sKeyName := ′myfile′;
sKeyValue := ′我的文档′;
RegCreateKey(HKEY—CLASSES—ROOT,
pchar(sKeyName), lphKey);
RegSetValue(lphKey, ′′, REG—SZ,
pchar(sKeyValue), 0);
sKeyName := ′.xyz′;
sKeyValue := ′myfile′;
RegCreateKey(HKEY—CLASSES—ROOT,
pchar(sKeyName), lphKey);
RegSetValue(lphKey, ′′, REG—SZ,
pchar(sKeyValue), 0);
sKeyName := ′myfile′;
sKeyValue := ′c:\Windows\NotePad.exe %1′;
RegCreateKey(HKEY—CLASSES—ROOT,
pchar(sKeyName), lphKey);
RegSetValue(lphKey, ′shell\open\command′, REG—SZ,
pchar(sKeyValue), MAX—PATH);
end;
Top
15 楼redlegend_126_com(redlegend)回复于 2003-12-17 11:02:45 得分 0
对呀,每次都修改注册表,一旦运行的时候,传递进程序名称,然后修改注册表,然后在运行那个程序,然后再该回去,就这样就没有问题了!Top
16 楼keyb(不信风情)回复于 2003-12-18 19:48:37 得分 0
我再次说明一下,我的问题不是如何关联EXE文件,请各位老兄不要再贴这样的代码了。
同时,我也知道启动EXE之前要把改动的关联修改还原,完毕以后再改成我自己的关联。
我的问题是如何将启动EXE的参数传递完全。 或者是说启动CPL控制面板的。
希望真正做过这样改动的朋友赐教,谢谢!!
~~~~~~~~
to mentalpatient(按时吃药) 朋友:
谢谢你能自己亲自这样试验一下才回复我,谢谢!Top
17 楼mentalpatient(按时吃药)回复于 2003-12-19 16:49:29 得分 0
TO:keyb(不信风情)
关于开关机的问题,我试了一下,没有问题。
你开关机出现问题,我估计是命令行格式问题。
也就是在运行命令行时,包括文件名的部分要用" "将文件路径河文件名括进去。
至于参数不全的问题,我也没能解决,我怀疑和参数个数有关,因为我试了一下,只要参数
小于等于4,就没有问题,否则参数会不全。Top
18 楼keyb(不信风情)回复于 2003-12-19 20:27:50 得分 0
to 按时吃药
帖子是我先发的,关机是因为一开始我只传递了一个参数过去,嘿嘿,当然关不了,不过
后来我解决了。但是这个参数问题一直困惑着我。烦啊。!!!!
另:你做程序很用心吗?
因为看了半天就你一个人亲自实践了这个问题,前面的几位老兄也太想当然了。嘿嘿Top
19 楼Gide(一针见血说实话)回复于 2003-12-19 21:41:44 得分 0
markupTop
20 楼lx47(离心)回复于 2003-12-21 11:15:46 得分 0
markTop
21 楼mentalpatient(按时吃药)回复于 2003-12-22 13:46:40 得分 0
TO:keyb(不信风情)兄
你是不是想做一个类似木马的程序,我们可以一起探讨一下。
我的MSN xuyinghot@hotmail.com.Top
22 楼TempterX(兄弟)回复于 2003-12-22 19:10:47 得分 0
请把你传递参数的完整代码贴出来.Top
23 楼jinjiajun(洛林)回复于 2003-12-22 21:29:44 得分 0
关注Top
24 楼keyb(不信风情)回复于 2003-12-24 17:15:57 得分 0
to mentalpatient(按时吃药)
My chinese input doesn't work.
My QQ is 5590538. please add my name.
Top
25 楼keyb(不信风情)回复于 2003-12-25 19:43:58 得分 0
我的QQ是48890959
约个时间,聊聊吧Top
26 楼mentalpatient(按时吃药)回复于 2003-12-26 14:01:33 得分 0
呵呵~~~~~~~~~~~~~~
不好意思,我没有QQ,只有UC和MSN
你能不能用这两个,或注册一个。
Top
27 楼keyb(不信风情)回复于 2003-12-28 13:43:03 得分 0
我的UC是:48930548 聊聊吧
Top
28 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-12-28 14:19:44 得分 50
GetCommandLine();传给CreateProcess的第二个参数就可以了Top
29 楼keyb(不信风情)回复于 2004-01-02 18:58:44 得分 0
终于看到正确答案了,谢谢你 Eastunfail(浴血雏龙)==(恶鱼杀手) (Top




