我想写一个文本编辑器并将txt文件分配给它。我的问题是,我想只有一个实例在运行,并且打开一个新文件以将文件名发送到已经运行的第一个应用程序...(我想使用互斥锁来执行此操作)。这里是一个小测试在一个应用程序中打开文本文件
DPR看起来像这样
uses
Windows, Messages, SysUtils,
Forms,
wndMain in 'wndMain.pas' {frmMain};
{$R *.res}
var
PrevWindow : HWND;
S : string;
CData : TCopyDataStruct;
begin
PrevWindow := 0;
if OpenMutex(MUTEX_ALL_ACCESS, False, 'MyMutex') <> 0 then
begin
repeat
PrevWindow:=FindWindow('TfrmMain', nil);
until PrevWindow<>Application.Handle;
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, 'MyMutex');
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
PAS:
type TfrmMain = class(TForm)
memo: TMemo;
private
procedure WMCopyData (var msg : TWMCopyData) ; message WM_COPYDATA;
public
procedure OpenFile(f : String);
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.WMCopyData (var msg : TWMCopyData) ;
var
f : String;
begin
f:=PChar(msg.CopyDataStruct.lpData);
//ShowMessage(f);
OpenFile(f);
end;
procedure TfrmMain.OpenFile(f : String);
begin
memo.Clear;
memo.Lines.LoadFromFile(f);
Caption:=f;
end;
这段代码应该没问题,但如果我想打开一个文本文件(从第二个应用程序)中,第一应用程序接收到一个消息是这样的:
alt text http://img218.imageshack.us/img218/2175/errorjd.jpg
THA nks
该互斥码错误。始终使用'CreateMutex',而不是'OpenMutex'。而且,'FindWindow'循环没有意义。如果你的应用程序的标题是“TfrmMain”,那么这个函数只会返回当前应用程序的窗口句柄,但你为什么要为你的应用程序命名呢?另外,如果'FindWindow' * *会返回你的应用程序的窗口句柄,那么重复的调用就不会给出不同的答案,因此循环将运行一次,否则它将永远运行。 – 2010-05-09 20:40:02