텍스트 편집기를 작성하고 txt 파일을 지정하려고합니다. 내 문제는 하나의 인스턴스를 실행하고 이미 실행중인 첫 번째 응용 프로그램에 파일 이름을 보내도록 새 파일을 열 때 ... (뮤텍스를 사용하여이 작업을 수행하려고합니다). 여기하나의 응용 프로그램에서 텍스트 파일 열기
조선 민주주의 인민 공화국이
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
그쪽 nks
해당 뮤텍스 코드가 잘못되었습니다. 'OpenMutex'가 아닌'CreateMutex'를 항상 사용하십시오. 또한,'FindWindow' 루프는 무의미합니다. 이 함수는 응용 프로그램의 제목이 "TfrmMain"인 경우에만 현재 응용 프로그램의 창 핸들을 반환하지만 응용 프로그램의 이름을 지정하는 이유는 무엇입니까? 게다가'FindWindow' *가 응용 프로그램의 윈도우 핸들을 반환하면 반복 호출은 다른 응답을주지 않으므로 루프는 정확히 한 번 실행되거나 영원히 실행됩니다. –