怎样实现在只启动一份程序时,将程序的参数传递给已经启动的实例?(100分)

  • 主题发起人 主题发起人 lvjun
  • 开始时间 开始时间
L

lvjun

Unregistered / Unconfirmed
GUEST, unregistred user!
问题的详细描述应该是这样:

我制作了一个多文档编辑器,当双击一种特定的文件时,我的编辑器回启
动,然后会打开该文件,可是当我在点击另一个同类型的文件时,我的编辑器
程序又启动了一份并打开了新文件,我只想启动一份,所以就使用了启动
单个实例的方法,将以前的启动的程序激活,可是我还想在被激活的程序
中新开一子窗口打开新文件,可是不知道怎样将文件的路径和名字传递给
已启动的程序,谢谢各位大侠指点!(但是最好别让我用文件传递参数)
 
呵呵, 正好用到以前说的在窗口之间通讯的方法:
您找到以前的实例的窗口,用WM_COPYDATA的消息把要打开的文件的全路径名字
传送过去,那个实例接收到了之后就把它打开,OK?
 
好象没有那么复杂吧,我想你可以用paramstr(1)来得到新打开的文件名。通常
paramcount为1(执行程序的文件路径),打开关联文件后paramcount将大于1。
 
还用我给你做个例子吗? -menxin急于得分地说 :)
 
pegasus的方法我先试试,Menxin说的得到文件名的方法我知道,但我发愁的是
怎样将文件名传递给已启动的实例!
Menxin若有时间,最好给俺个例子,谢谢!
 
先前没有看清题,对不起.既然pegasus给出常规方法,我就来一个非常规方法,意思一样-传递消息,不过用的全是wm_user!

主窗体中:(接收方)
...
procedure WMUser(var msg:TMessage);message wm_user;
...
var
Form1: TForm1;
str:String='';
flag:Boolean=false;
...
procedure Tform1.WMUser(var msg:TMessage);
begin
case msg.WParam of
-1:flag:=not flag;
1:Label1.Caption:=Label1.Caption+chr(msg.LParam);
end;
end;

工程中:(发送方)

var hand:HWND;
i:integer;

begin
hand:=FindWindow('TForm1','aaa');
if hand=0 then begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run
end else begin
if ParamCount>0 then begin
PostMessage(hand,wm_user,-1,0); //start post
for i:=0 to length(ParamStr(1)) do
PostMessage(hand,wm_user,1,ord(paramstr(1)));
PostMessage(hand,wm_user,-1,0); //Stop post
end;
end;
end.

确实不难!
 
请参考 <a href=DispQ.asp?LID=120862>防止程序被多次运行</a>。
 
请教Menxin:

您的意思我完全理解啦,是个很好的方法,可是我还有点心理没谱,
发送的一系列的消息,会不会中间有丢失的情况发生呢?这就引处了我
很早就想问的一个问题,Windows中应用程序之间互相发送的消息会不
会丢失,或者因为系统忙就给丢了,就象编写网络通讯程序一样,经常
有丢包的情况出现?

另外还想请教各位,如果用pegasus的方法,那么我的结构指针因该在
什么时机释放,会不会出现对方还没有来的及接受完毕,我就释放了?!

多谢各位的赐教!
 
抱歉,刚才还没有问完,应用程序之间的消息传递的效率如何,会不会很慢?
 
用postmessage应该不会发生丢失问题.我的程序里不是预备了一个标志(flag)吗?一般来说,中间不应该丢失,只能发生通讯中断.至于效率,感觉不出来,只发几个字符,也
谈不上什么效率.
 
避免您的程序被重复执行两次的非可视构件,当第二个程序被启动时能够传送叁数给前一个程序 ( 附源码 )
文件名可以通过参数传过去并打开
可参照下例:
http://vcl.vclxx.com/DELPHI/D32FREE/IMANAGER.ZIP
 
呀呀呀!!!!
Menxin大坏蛋呀!!!!!
仗着我这里连大富翁奇慢,居然抢先了!!!
呜..........
:~(
我这贴可反复送了不下5次才贴上去,没想到这之间.....
哇...呜........
;.....(
 
Warning!

使用PostMessage的时候一定要记住检查返回值!
因为消息队列满的时候PostMessage会失败,就有可能会丢失消息。

建议大家把Delphi中的一个编译选项关掉(Treat function as procedure),
这样强迫您在写程序的时候接受返回值,检查结果
 
多人接受答案了。
 
后退
顶部