2009-10-26 42 views
2

我写一个MDI文本编辑器,我想知道我怎样可以打开我的应用程序中的所有文本文件。 (如果我TE * .TXT到我的应用程序相关联的我想是一个txt文件,每次有人双击在我的应用程序打开它,在一个新的子窗口)如何打开其他文件到一个已经运行的应用程序

感谢

+0

重复:http://stackoverflow.com/questions/600490/how-to-open-multiple-files-with-delphi-program-invoked-via-shell-open – 2009-10-26 21:11:26

+0

不完全重复的,这任务是询问如何将其他文件打开到已经运行的应用程序中。 – skamradt 2009-10-26 21:40:22

+0

在已运行的应用程序中打开附加文件是我想要的 – 2009-10-26 21:42:24

回答

2

我现在有这样做的以下实现:

在主单元我们处理WM_COPYDATA消息.dpr文件

var 
    PrevWindow : HWND; 
    S : string; 
    CData : TCopyDataStruct; 

begin 
    PrevWindow := 0; 
    if OpenMutex(MUTEX_ALL_ACCESS, False, 'YourUniqueStringHere') <> 0 then 
    begin 
     PrevWindow:=FindWindow('TYourMainFormClassName', nil); 

     if IsWindow(PrevWindow) then 
     begin 
     SendMessage(PrevWindow, WM_SYSCOMMAND, SC_RESTORE, 0); 
     BringWindowToTop(PrevWindow); 
     SetForegroundWindow(PrevWindow); 

     if FileExists(ParamStr(1)) then 
     begin 
      S:=ParamStr(1); 
      CData.dwData:=0; 
      CData.lpData:=PChar(S); 
      CData.cbData:=1+Length(S); 

      SendMessage(PrevWindow, WM_COPYDATA, 0, DWORD(@CData)); 
     end; 
     end; 
    end 
    else 
    CreateMutex(nil, False, 'YourUniqueStringHere'); 

我们声明的消息处理程序

procedure ReceiveData_Handler (var msg : TWMCopyData) ; message WM_COPYDATA; 


procedure TForm1.ReceiveData_Handler(var msg: TWMCopyData); 
begin 
    // Your file name is in the msg.CopyDataStruct.lpData 
    // Cast it to PChar(); 
end; 

希望它为你工作。

+1

您的代码包含一个竞争条件,应该始终调用'CreateMutex()',并检查是否'GetLastError函数()''返回ERROR_ALREADY_EXISTS'。请参阅http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx。我发现一般缺乏对错误处理的干扰...... – mghie 2009-10-27 13:26:35

0

我不知道你正在使用的Delphi的版本,但在Delphi 7的examples文件夹中,你会看到一个MDI文本编辑器的例子。

4

解决这个也是不允许多个应用程序在同一时间运行的解决方案。你想要做的是首先检测程序是否已经运行,然后将参数传递给正在运行的应用程序并关闭。

several methods,以确定您的应用程序已经运行。一旦选择适合您的编程偏好的文件,下一步就是将文件提供给正在运行的程序。这可以通过命名管道,消息来完成(虽然消息并在Vista/Win7的,如果您的应用程序在另一个安全上下文中运行失败),或IPC任何其他方法。

+0

好点,但您有多大可能有不同的安全priveliges运行相同的应用程序用户的两个实例? :P – 2009-10-27 01:01:37

+0

只需要第一个副本“以管理员身份”运行然后将消息发送到第一应用程序分开所有后来的“双击”。 – skamradt 2009-10-27 18:13:53

1

退房的Windows DDE documentation。我修改了注册表中的DDEExec选项,这样shell就能正确地将打开的文件指向我现有的应用程序实例。以下代码使注册表更改成为必需。将“AppName”替换为您的应用程序名称(并删除括号)。

 // add the ddeexec key 
    if not reg.OpenKey('\Software\Classes\<AppName>.file\shell\open\ddeexec', true) then 
     raise Exception.Create('Error setting ddeexec key'); 

    try 
     reg.WriteString('', 'FileOpen("""%1""")'); 
    finally 
     reg.CloseKey; 
    end; 

    // modify the command key to not include the parameter, as we don't use it 
    if not reg.OpenKey('\Software\Classes\<AppName>.file\shell\Open\command', true) then 
     raise Exception.Create('Error opening command key.'); 

    try 
     strTemp := reg.ReadString(''); 

     strTemp := StringReplace(strTemp, '"%1"', '', []); 
     reg.WriteString('', strTemp); 

    finally 
     reg.CloseKey; 
    end; 
相关问题