Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pomysł na otwarcie pliku w już uruchomionym programie

Dżyszla 14 Cze 2008 18:51 2472 12
  • #1 14 Cze 2008 18:51
    Dżyszla
    Poziom 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.

    0 12
  • Pomocny post
    #2 14 Cze 2008 18:57
    mietekn
    Poziom 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")]

    0
  • #3 14 Cze 2008 19:41
    Dżyszla
    Poziom 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.

    0
  • #4 14 Cze 2008 19:56
    mietekn
    Poziom 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).

    0
  • #5 14 Cze 2008 19:59
    Dżyszla
    Poziom 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ć :)

    0
  • #6 14 Cze 2008 20:09
    JIIIS
    Poziom 17  

    hm, a nie da rady jakos w programie przechwycic windowsowego komunikatu otwierania innego programu? tak sobie tylko glosno mysle :)

    0
  • #7 14 Cze 2008 20:17
    mietekn
    Poziom 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.

    0
    Załączniki:
  • #8 14 Cze 2008 20:28
    Dżyszla
    Poziom 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)

    0
  • #9 14 Cze 2008 20:30
    mietekn
    Poziom 35  

    Aplikacja jest serwerem a Ty się z nią łączysz i robisz co chcesz (Explorer to tez aplikacja).

    0
  • #10 14 Cze 2008 20:46
    Dżyszla
    Poziom 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 :|

    0
  • #11 14 Cze 2008 20:46
    mietekn
    Poziom 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)

    0
  • #12 14 Cze 2008 20:51
    Dżyszla
    Poziom 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?

    0
  • #13 15 Cze 2008 15:10
    Dżyszla
    Poziom 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...

    0