@@@ 220 分 @@@请教exe关联问题!!!

heart007 2004-11-22 11:07:39
我做了一个监控程序,让它关联了exe文件
但启动之后就无法关机,无法注销,连控制面板也失效
对于关机,我想的是关机时截获关机消息,然后让它自己取消exe关联
以便关机,可关联exe的程序截获不到关机消息,也就无法关机了
注销应该和关机差不多,而控制面板更没法解决了
问题: 怎么解决关联exe文件后的关机、注销及控制面板等问题?
请各位高手出招指点!!谢谢!
由于分数限制,所以,我只好将220分分到三个帖子里
另外,要在98和win2000都能通过哦
请大家帮忙,谢谢!!!!
...全文
371 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
heart007 2004-12-07
  • 打赏
  • 举报
回复
三帖最终得分记录:
gyf (20)、
bee2518 (5)、 aiirii (5)、 ly_liuyang (3)、 pressman (3)、 tongyuja (3)、 extcsdn (1)、 smilelhh (1)、 Shikari (170)、 tongyuja (1)、 longtusoft (1)、 nisazhixin (1)、
zwb666 (1)、 cnhgj (4)、 psp2003 (1)、
由于分数分散在三个帖子,分配不易,这一帖回帖的多,可只有20分,所以没得分的不要介意,分得到少的也不要在意,
在此感谢所有朋友的帮忙
尤其是gyf和Shikari,谢谢你们!
Shikari 2004-12-06
  • 打赏
  • 举报
回复
呵呵,不客气,谢谢你的祝福!
heart007 2004-12-06
  • 打赏
  • 举报
回复
To:Shikari(很久不来)
你真的好厉害啊,有的网站给; 一大段代码都没解决的问题(太多又没注释,看不懂),你一句就ok了,谢谢你!!祝你天天交好运!一切顺利!!
heart007 2004-12-06
  • 打赏
  • 举报
回复
To:Shikari(很久不来)
请到标题为‘@@@ 220 分@@@ 请教一个问题!! ’那里回一帖,要不我不好给分
等着你哦
heart007 2004-12-06
  • 打赏
  • 举报
回复
To:Shikari(很久不来)
呵呵,不要客气,该我说谢谢的!再次祝你好运!马上结帖了:)
Shikari 2004-12-03
  • 打赏
  • 举报
回复
隐藏文件:
SetFileAttributes('C:\ok.txt',FILE_ATTRIBUTE_HIDDEN);
heart007 2004-12-02
  • 打赏
  • 举报
回复
To :Shikari(很久不来)
是啊,我也觉得我的思路太乱了,糊里糊涂的,对很多函数啊什么的只大概知道其最终作用,不清楚其实现的原理,谢谢你这么久以来的耐心指点!现在已可以运行了!
对了,程序中怎么控制生成exe文件的属性?比如我想让它置于隐藏状态,该怎么实现?
我的问题已提的太多了,你不觉得烦,我也觉得不好意思了,所以最后一问难的话就先不解了。
总之很感谢你!

heart007 2004-12-01
  • 打赏
  • 举报
回复
再没人来就只好结帖了,本来早想结了
但为此三帖我花光了所有的分,只到现在也没什么分可再发帖了
结帖之后就没法继续想大家请教、学习了
不过,还是得准备结帖,不想开那么久,没人继续帮忙,留者也没什么意思
在此谢谢所有帮忙以及帮顶的朋友,谢谢你们!!!!
Shikari 2004-12-01
  • 打赏
  • 举报
回复
问: 想了想,有点似懂非懂的感觉,‘将WINDIR路径下的程序写到注册,然后将程序拷贝到WINDIR’,这是怎么实现?没看懂啊,这对你来说是太简单了,可对我这初学者来说就有些糊涂了,理不清思路了。
答:例如你程序在任意路径(D:\),当运行你程序的时候,就将自身复制到C:\windows\system32\YouApp.exe,然后将注册表中exe文件关联到C:\windows\system32\YouApp.exe。这样,一旦有任意EXE运行,你的程序自动就被加载了,所以你D:\的程序及时丢失了也没有关系。

问:‘程序启动的时候加一个参数,类似于“C:\windows\system32\youapp.exe /new”’你的意思是不是说给程序的某个过程定一个参数?比如说本程序的是0,而我程序中那个拷贝过程参数为另外某个值。想了想又有点像是说:设置一个参数,这个参数表示程序的执行是因本程序内部发出的命令而不是由关联别的程序引起的二次运行。
答:因为你使用了互斥,那么你的程序只能运行一个实例。避免这样的现象可以启动的时候传递给C:\windows\system32\YouApp.exe一个参数,类似于YouApp.exe /New,你在程序中判断,如果接收到New这个参数,那么不执行互斥,所以你的程序就能运行起来,而你调用的程序此时也可以中止了,明白了吗?

问:if FileExists(pchar(Getwindir+'sss.exe'))=false then//如果文件已经删除
begin
copyfile(pchar(application.exename), pchar(GetWindir + 'sss.exe'), False);//自定义拷贝资源文件过程
winexec(pchar(Getwindir+'sss.exe'),sw_hide);
end;
感觉这段代码没起什么作用,好象与我前面提到的那个拷贝过程功能一样
这段代码本应该是:假如我的程序被删除了,就拷贝一个到指定位置,可是既然全都删除了,又该去哪拷啊,语句‘copyfile(pchar(application.exename), pchar(GetWindir + 'sss.exe'), False);’应该是写错了,我该怎么写呢?先问这么多吧,请指点,谢谢!!!
答:这段代码是当System32\YuoApp.exe被删除后,如果该程序在其他地方被运行了,那么自动会拷贝本身到System32下,这样总是保证系统目录下有你的程序存在。不过,我判断执行该代码的程序一定是驻留在后台的,或者在某一个条件下会执行的。

感觉你的思路比较混乱,理清头绪后这些问题相信你能想明白。
heart007 2004-11-30
  • 打赏
  • 举报
回复
请继续帮忙,谢谢!!
heart007 2004-11-30
  • 打赏
  • 举报
回复
再等等,期盼大家继续指点,谢谢!!
heart007 2004-11-29
  • 打赏
  • 举报
回复
To : Shikari(很久不来)
想了想,有点似懂非懂的感觉,‘将WINDIR路径下的程序写到注册,然后将程序拷贝到WINDIR’,这是怎么实现?没看懂啊,这对你来说是太简单了,可对我这初学者来说就有些糊涂了,理不清思路了
‘程序启动的时候加一个参数,类似于“C:\windows\system32\youapp.exe /new”’你的意思是不是说给程序的某个过程定一个参数?比如说本程序的是0,而我程序中那个拷贝过程参数为另外某个值。想了想又有点像是说:设置一个参数,这个参数表示程序的执行是因本程序内部发出的命令而不是由关联别的程序引起的二次运行。总之是不懂啊,请详细解答一下,最好能给个例子,这么麻烦你真不好意思啊,再次谢谢你了
对了,程序中有段代码:
if FileExists(pchar(Getwindir+'sss.exe'))=false then//如果文件已经删除
begin
copyfile(pchar(application.exename), pchar(GetWindir + 'sss.exe'), False);//自定义拷贝资源文件过程
winexec(pchar(Getwindir+'sss.exe'),sw_hide);
end;
感觉这段代码没起什么作用,好象与我前面提到的那个拷贝过程功能一样
这段代码本应该是:假如我的程序被删除了,就拷贝一个到指定位置,可是既然全都删除了,又该去哪拷啊,语句‘copyfile(pchar(application.exename), pchar(GetWindir + 'sss.exe'), False);’应该是写错了,我该怎么写呢?先问这么多吧,请指点,谢谢!!!

nisazhixin 2004-11-29
  • 打赏
  • 举报
回复
终于找到这类帖了,可惜问题好象还没解决
关注ing
Shikari 2004-11-27
  • 打赏
  • 举报
回复
第一个问题:估计是你的程序的事情,仔细检查不合理的地方。
第二个问题:有几种做法,你可以在你程序里写注册表关联的时候,将WINDIR路径下的程序写到注册表,然后将程序拷贝到WINDIR,然后你当然可以退出了,当用户运行EXE文件的时候,你的WINDIR程序自动就运行了,根本就不用你干预。
或者你可以在你自己程序启动的时候加一个参数,类似于“C:\windows\system32\youapp.exe /new”,这样当你程序接受到这个参数后,就不执行互斥语句,就可以启动了,总之方法多多,你可以再扩展的想一想。
heart007 2004-11-26
  • 打赏
  • 举报
回复
To : Shikari(很久不来)
想不说谢谢你都不行了,看你这么详细的解说,我有信心多了,xp下可以啊,那就太好了,就差2000没试了,呵呵,我差点就要放弃了,连点击‘属性’都要那么久的反映时间,想起来就头疼,还好有你相助,我再去试试
BTW:说得对,大家互相帮助才是重要的!真希望和你交个朋友!
Shikari 2004-11-26
  • 打赏
  • 举报
回复
我就是在XP Pro SP2下测试的。
你的意思是让自己的程序只运行一个实例吗?如果是这样,你可以采用互斥对象,代码如下:
在你的工程文件(也就是Project.dpr)下,uses部分别忘记加入Windows,SysUtils
program Project1;

uses
Forms,Windows,SysUtils
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
I: integer;
MyParam: string;
begin
for I := 1 to ParamCount do
MyParam := MyParam + ' ' + ParamStr(I);//获取调用的参数

WinExec(Pchar(TrimLeft(MyParam)),1);//如果你不阻止该程序或者对该程序进行处理的话,
//什么都别做,立即执行,避免你说的启动慢的问题

CreateMutex(nil,False,'MySelf');//MySelf是你的互斥名,你可以自己更改
if GetLastError = ERROR_ALREADY_EXISTS then Exit;//如果自己的程序已经在运行那么就中止
//执行,而在这个时候
//其他程序你已经执行起来了,所以不会
//干扰其他程序执行
Application.Initialize;//程序初始化,在初始化之前将别的程序启动起来
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

至于你说的你的程序比较大,执行的比较慢,那也没有关系。我看你启动其他程序的代码是写在Form Create里的,这样显然要比写在我写的这个位置要慢的多,程序只要刚执行,就立刻先将其他程序启动起来,而这个时候自己的程序主FORM还没有创建,相比之下,应该是块很多。只这样还不够,如果真的想非常快速的话,建议你还是不要用FORM,或者尽量在程序里少用控件和代码,减小EXE的尺寸(切不可用加壳软件压缩)可以扩展成DLL,然后调用。

BTW:分数不重要,大家能够互相帮助才是最重要的!
heart007 2004-11-26
  • 打赏
  • 举报
回复
To:Shikari(很久不来)
现在可以了,感觉天空的乌云似乎散得差不多了:),只是我的程序有点大,影响别程序的启动速度,能不能使我的程序比别的exe后启动?那样就不容易感觉慢了,要不燃点一个‘属性’都要等半天也挺郁闷的,不管怎样,真是太感谢了!!果然是传说中的高手啊
不知道在2000/xp下是否能通过,现在用的是98,回去用2000试试,假如2000/xp也可,那即可结帖了。 另外,请问怎么让程序只运行一次?我在本站查了些这方面的资料,可全不行,有的什么效果没有,有的是程序一次也运行不了,有一种方法,可防止二次运行,但我的监控程序在运行后不久就消失了,这就没法监控了,请耐心指点,谢谢了!
当然,不管最后一问是否解决,都可结帖,不会刁难大家的。能解决自然再好不过了,为发此三帖,我已倾其所有了
先再次谢谢所有朋友的帮忙,请大家继续帮忙解答!Thanks!
heart007 2004-11-26
  • 打赏
  • 举报
回复
To : Shikari(很久不来)
98下,经多次测试,终于成功,工作的效果很好,就想你说的那样:不再干扰别的程序
不过测试过程中出现了一个莫名其妙的错误:当第一个exe运行时,正常,而当再运行一个
时就出现提示,说没足够内存运行该程序,有一次还提示说系统资源不足,注销之后也一样
可当我重起之后就什么问题也没了(程序编译时提示大概是‘..call os ..failed...',以前也遇到过类似错误,重起就好了,可这次,第一次重起出现那么多问题,第二第三次重起就一切正常了)真是搞不懂啊
另外,还有一点问题:我的程序有以下语句
var
myname: string;
begin
myname := ExtractFilename(Application.Exename); //获得文件名
if application.Exename <> GetWindir + myname then //如果文件不是在Windows\System\那么..
begin
copyfile(pchar(application.Exename), pchar(GetWindir + myname), False);{将自己拷贝到 Windows\System\下}
Winexec(pchar(GetWindir + myname), sw_hide);//运行Windows\System\下的新文件
application.Terminate;//退出
end;
end;
我想你能看懂我的目的,由于采用的互斥,导致\system\下的新文件无法运行,同时本程序因执行application.Terminate而退出,结果二者均不运行
请再帮我想想,谢谢!:)
Shikari 2004-11-25
  • 打赏
  • 举报
回复
我又看了一下你上面的代码,我发现可能是你关联的问题,这样你的程序接受参数不完整,这样就导致了“丢失项目”等错误。
HKEY_CLASSES_ROOT\exefile\shell\open\command
在写键值的时候,你是这么写的:
RootKey := HKEY_CLASSES_ROOT;
OpenKey( kK, TRUE );
WriteString( '', application.ExeName+' "%1" ');

我认为应该这么写
RootKey := HKEY_CLASSES_ROOT;
OpenKey( kK, TRUE );
WriteString( '', application.ExeName+' "%1"' + ' "%*"');
也就是说,在command的命令行里,应该是类似于:"C:\windows\yourapp.exe" "%1" "%*"
你的参数中少了一个 "%*"
这样你的程序才能接受到完整的命令参数,而我也是这么做的,根本没有出现你所说的问题。
heart007 2004-11-24
  • 打赏
  • 举报
回复
TO:cnhgj(戏子) (一个人睡)
刚试了几次,还是不行,请继续想想,谢谢!
加载更多回复(24)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧