Otwieranie w innej aplikacji.

0

Dzięki kodowi:

var

   hM : HDC;
begin
 Application.Initialize;
 hM:=CreateFileMapping(THANDLE($FFFFFFFF),nil,
 PAGE_READONLY,0,32,'ZajebistyProgram');
   if GetLastError=ERROR_ALREADY_EXISTS then
   begin
        Application.Terminate;
        CloseHandle(hM);
   end;

mogę zablokować uruchamianie się zbędnej kopi programu. Jednak mam problem ponieważ chcę wiedzieć czy program otwierał jakiś plik(paramCount, ParamStr(1)) i chciałbym aby ten plik otworzyła główna kopia programu.

0

Też miałem problem ale ktoś napisał na grupie dyskusyjnej czy coś w tym stylu.
W głównym kodzie programu:
najpierw

const
  WM_OPENFILE = WM_USER + coś;

póżniej
procedure WMOpenFile(var Message : TMessage); message WM_OPENFILE;

procedure TForm1.WMOpenFile(var Message: TMessage);
var
  Param : PChar;
begin
  GetMem(Param, Message.lParam);
  GlobalGetAtomName(Message.wParam, Param, Message.lParam);
  Param - ścieżka do pliku
  FreeMem(Param);
end;

a w pliku *.dpr

const
  WM_OPENFILE = WM_USER + to co wyżej;
var
  MemHwnd : THandle;
  Hwnd : THandle;
  i : integer;
  Atom : Word;

/\/\/\/\/\/\/\/\/\/\/\/

    begin
    Hwnd:=FindWindow('nazwa progsa', nil);
    if ParamCount > 0 then
      for i:=1 to ParamCount do
      begin
        Atom:=GlobalAddAtom(PChar(ParamStr(i)));
        if Atom <> 0 then
        begin
          SendMessage(Hwnd, WM_OPENFILE, Atom, Length(ParamStr(i))+1);
          GlobalDeleteAtom(Atom);
        end;
      end;
    SetForegroundWindow(Hwnd);
  end;

jak się <ort>niepomyliłem </ort>to powinno dzialać

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0