首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

碰到两个小疑点,一个是关于在电脑上做记录,一个是关于在DLL里关闭主程序.多谢

2012-02-12 
碰到两个小问题,一个是关于在电脑上做记录,一个是关于在DLL里关闭主程序.谢谢我最近在做一个程序,在电脑上

碰到两个小问题,一个是关于在电脑上做记录,一个是关于在DLL里关闭主程序.谢谢
我最近在做一个程序,在电脑上运行要能记录使用情况,现在的关键在怎么来判断是不是第一次运行这个程序.我目前是通过在C盘和注册表里都写入记录来判断.可是这有一个缺陷,就是很多杀毒软件都能检测到往C盘或注册表里写入的东西,这样如果用户把写进去的东西删了,就会又以为是第一次运行了..
还有一个问题是,我做了个DLL,要通过这个DLL关闭主程序,我现在是先让主程序在调用DLL时告诉DLL主程序的句柄,然后用PostMessage(句柄,WM_CLOSE,0,0)来关闭主程序.可是我们头说调用时还要告诉DLL句柄太麻烦了,大家能不能帮我想想没有没什么其他方法不用句柄来关闭或是让DLL自动找到主程序的句柄呢??

[解决办法]
把dll注入其它进程.再关闭主程序
判断是不是第一次运行你可以在非C盘写一个标识文件吧
最好是写注册表
[解决办法]
1.CreateMutex创建一个互斥变量!
2.最好是自己自定义一个消息,要关闭时发这个自定义的消息给主程序,
主程序接受后就会进行一些处理,例如一些连接的关闭啊,资源的释放(例如DLL),
最后才去调用Application.Terminate; 这样就合理了!

[解决办法]
program Project1;

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

{$R *.RES}

begin
CreateMutex(nil,False, '{EC5F94F0-5BD7-4FDF-AFB2-855ED3911C98} ');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage( '程序已经在运行 ');
Exit;
end;

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

2.不知道你想做什么?
[解决办法]
看来要满足你的要求的确是有点痛苦。
帮助别人的时候,也在惹烦自己。。。
[解决办法]
说说我的一些想法:
第一个问题:
1)向系统文件夹下写文件,属性中加上只读/隐藏/系统,这样一般人不会发现。程序运行时以独占方式打开,拒绝修改/删除。
2)向程序自身写数据,将程序运行的次数加密后写到自己的尾部。不过这个比较麻烦。每次运行时读取这个值。

第二个问题:
不知道你是多线程还是单线程的。
1) 如果是单线程,可以先GetCurrentProcessId,然后TerminateProcess。哈哈,还是别这样做。馊主意。
2) 要不就枚举所有的窗体,然后调用GetWindowThreadProcessId,看是否等于GetCurrentProcessId,等于,发送消息关闭。好麻烦,还不如直接将句柄传递过来。
3) 要不就自定义消息,然后,PostThreadMessage(GetCurrentProcessId, WM_MYMessage,..),处理这个自定义消息,关闭主窗体。这个没试过,不知道可不可以。 ^_^

呵呵,发现我的馊主意挺多的!嘿嘿....

热点排行