Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pomysł na otwarcie pliku w już uruchomionym programie

14 Jun 2008 18:51 2604 12
  • Level 42  
    Za bardzo nie wiem, w jaki sposób szukać rozwiązania takiego zagadnienia

    Dwukrotne kliknięci pliku uruchamia program z parametrem, który nakazuje w programie otwarcie tego pliku. Wszystko ok, tylko jeśli aplikacja potrafi obsługiwać wiele plików równocześnie (np. Word, Photoshop itp.), to podwójne kliknięcie powinno otworzyć plik w już uruchomionej aplikacji a nie tworzyć nową instancje.

    O ile zablokowanie przed uruchomieniem drugiej instancji można wykonać na kilka sposobow (chyba najlepszym jest tu mechanizm mutexów), to kompletnie nie mam pomysłu, jak przekazać do uruchomionego programu polecenia, że ma otworzyć nowy plik.

    Ktoś może zderzył się z tym problemem i jego rozwiązaniem? Trudno mi nazwać to wszystko, więc google na niewiele się zdaje w takiej sytuacji.
  • Helpful post
    Level 35  
    W tym celu można wykorzystać mechanizmy DDE ( http://pl.wikipedia.org/wiki/DDE ) i wysłać do aplikacji polecenie otwarcia.
    Np dla Worda: WinWord | System | [FileOpen("%1")]
  • Level 42  
    A jak najprościej zidentyfikować otwartą aplikację? Bo w zasadzie chyba by można przesłać też jakiś window message, czy nie? Nie wiem, czy ja potrzebuje funkcjonalności aż DDE czy OLE...

    Niestety dla mnie programowanie rozproszone to już nie moja działka :)

    [Edit]
    Aha, chyba że piszesz o zmianie sposobu otwierania pliku przez Explorera? Coś mi świta, że tam były opcje związane z DDE.
  • Level 35  
    DDE można wykorzystać jak piszesz "do zmiany funkcjonalności explorera" i do przesyłania komend do programów takich jak otwieranie, zapis, drukowanie, odczyt stanu itd, itd, itd (wszystko zależy od tego jak daleko posunął się producent danego programu).
  • Level 42  
    W sumie to liczyłem na jakieś prostsze rozwiązanie, chyba, że tylko mi się wydaje, że jest trudne :) Trochę mało czasu zostało a i gruntowne zmiany nie wchodzą w grę za bardzo... Ale dzięki - już wiem, czego szukać :)
  • Level 17  
    hm, a nie da rady jakos w programie przechwycic windowsowego komunikatu otwierania innego programu? tak sobie tylko glosno mysle :)
  • Level 35  
    Komunikacja przez DDE może sprowadza się do wykorzystania trzech poleceń

    -połaczenia z DDE
    UdprocDdeConnect(app_name, topic_name)

    -wysłania rozkazu zapisu lub odczytu wartości
    UdprocDdePoke(item_name, control) lub UdprocDdeRequest(item_name, control)

    -rozłączenia się
    UdprocDdeDisConnect();

    Można tego dokonać w oparciu o bibliotekę Ddeaccess które dołączam.
    Została ona napisana przez Takebishi w programie DDETest ze strony http://www.faweb.net/us/ioserver/sample_vc.html . Jedyne czego to dokonałem to ograniczenie ilości funkcji do potrzebnych mi.
  • Level 42  
    Raczej wolałbym uruchomić program drugi, który odnajdzie pierwszy i wyśle dokładnie jemu komunikat, a następnie - nieładnie zabrzmi - się zamknie :)

    Zacząłem z DDE kombinować, ale jak narazie otwarcie pliku kończy się komunikatem o niemożności znalezienia pliku (Windows) a komponenty od serwera DDE w aplikacji dopiero rozgryzam... Nie wiem, jak do końca ustawić system - obecnie mam:
    Komunikat DDE: open("%1")
    Aplikacja: Dlawik (z czym w zasadzie powinna być skojarzona ta nazwa?)
    Nieuruchomiona aplikacja DDE: puste
    Temat: System

    Dodano po 8 [minuty]:

    Nie zauważyłem porzedniego psota... Ale generalnie - System jest klientem czy serwerem DDE? Bo jakoś nie potrafię załapać. Bo mnie pozostaje stworzenie jednej strony, prawda?

    Dodano po 1 [minuty]:

    Aha - mam do dyspozycji Delphi z jego komponentami ;) aż do API nie muszę sie cofać :) Tylko - jak z nich skorzystać? :P (szukam sobie po necie narazie)
  • Level 35  
    Aplikacja jest serwerem a Ty się z nią łączysz i robisz co chcesz (Explorer to tez aplikacja).
  • Level 42  
    No dobra, to teraz takie pytania - czemu Explorer mi uparcie twierdzi, że nie może znaleźć pliku, gdy mu określę jako akcję DDE: [open("%1")] ? i w parametrach uparcie mi wpisuje %1, choć jak podglądam dla Worda to tam nic takiego nie ma...

    Dodano po 3 [minuty]:

    I w ogóle opcja "Przeglądaj w tym samym oknie" we właściwościach typu pliku jest niedostępna :|
  • Level 35  
    Proponuje nie komunikować się z explorerem tylko:
    -sprawdzić czy aplikacja działa
    -jeśli nie wywołać "aplikacja plik_do_otwarcia"
    -jeśli tak przesłać do niej przez DDE open(plik_do_otwarcia)
  • Level 42  
    Ale całość rozchodzi się właśnie o podwójne kliknięcie na plik :)

    ---------

    To może pokombinujemy razem od początku?
    Wstawiam na główną formę aplikacji komponent DdeServerConv, nazywam go MojDDE i podpinam akcję:
    Code:
    procedure TMainForm.MojDDEExecuteMacro(Sender: TObject;
    
      Msg: TStrings);
    begin
       Application.MessageBox(PChar(Msg),'');
    end;
    Następnie rejestruję nowy typ wg następujących zasad:
    Pomysł na otwarcie pliku w już uruchomionym programie

    Następnie klikam na plik z rozszerzeniem i dostaję to:
    Pomysł na otwarcie pliku w już uruchomionym programie

    A aplikacja nie odbiera żadnej wiadomości na DDE. I otwierana jest za każdym razem nowa instancja aplikacji.

    Gdzie popełniam błąd?
  • Level 42  
    Skorzystałem z DDSpy i coś ruszyło. Już widzę, jak się rejestruje kanał i wreszie Explorer zaczął wysyłać... Choć nie wiem, jeszcze jak to działa, lae działa jakoś :P

    W polu "Temat" okazało się że nalezy dać jednak nazwę MojDDE, a nie System...