Tworzenie autorun.exe w Delphi 7

0

Witam serdecznie. Na początku chciałbym powiedzieć że nie jest dla mnie jasne w 100% korzystanie z tego programu jednakże chciałbym polepszyć swoje umiejętności a mam nadzieję że na tym forum znajdą się takie osoby, które zechcą mi pomóc. A więc przejdźmy do rzeczy.

Chciałbym stworzyć autorun o rozmiarach 640x480 i z samymi rozmiarami nie ma problemu natomiast chciałbym zrobić coś takiego, aby "tło" programiku nie było czytane z parametru "Picture" zaś z lokalizacji obok pliku autorun.exe dla przykładu: obrazy\background.bmp.

Kolejna sprawa to że chciałbym zrobić button z obrazka, który zmienia się podczas każdej akcji mam tu na myśli(aktywny obrazek, w użyciu np. przez program itd): _down, _on, _up. Obrazki do buttonu również powinny się znajdować w: obrazy*tutaj*.

Trzecią i ostatnią rzeczą jest to że chciałbym zablokować uruchomienie nie więcej niż jedno okienko autoruna, bawiąc się kompilowaniem zauważyłem że program można wywoływać nieskończoną ilość razy.

1
Eazy napisał(a):

Chciałbym stworzyć autorun o rozmiarach 640x480 […]

Plik wykonywalny nie musi się nazywać autorun.exe. To który plik zostanie uruchomiony po dwukliku na ikonę nośnika, definiuje się w pliku autorun.inf, w wartości open:

[autorun]
icon=myapp.exe,1
open=myapp.exe
label=my application name

Tak więc najpierw zrób program, a następnie przygotuj plik autorun.inf i uzupełnij go, korzystając oczywiście z dokumentacji, aby wszystko zrobić w należyty sposób.

[…] i z samymi rozmiarami nie ma problemu natomiast chciałbym zrobić coś takiego, aby "tło" programiku nie było czytane z parametru "Picture" zaś z lokalizacji obok pliku autorun.exe dla przykładu: obrazy\background.bmp.

Dodaj w zdarzeniu OnCreate formularza linijkę, ładującą grafikę z pliku. Przykład:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image.Picture.LoadFromFile('pictures\background.bmp');
end;

Kolejna sprawa to że chciałbym zrobić button z obrazka, który zmienia się podczas każdej akcji mam tu na myśli(aktywny obrazek, w użyciu np. przez program itd): _down, _on, _up. Obrazki do buttonu również powinny się znajdować w: obrazy*tutaj*.

W Delphi 7, standardowa paleta komponentów nie zawierała kontrolki z taką funkcjonalnością.

Trzecią i ostatnią rzeczą jest to że chciałbym zablokować uruchomienie nie więcej niż jedno okienko autoruna, bawiąc się kompilowaniem zauważyłem że program można wywoływać nieskończoną ilość razy.

Wystarczy obsługa mutex-ów – nadaje się idealnie i działa globalnie (w obrębie całego systemu).


Na marginesie – środowisko Delphi 7 jest stare i szkoda na nie czasu. Poza tym, nie jest to darmowe oprogramowanie, więc albo używasz wersji trial, która maksymalnie za 30 dni straci ważność i nie pozwoli się więcej uruchomić, albo używasz go niezgodnie z licencją (delikatnie mówiąc).

Dlatego też zostaw to środowisko i sięgnij po darmowego Lazarusa – też kod pisze się w obiektowym Pascalu. Poza tym posiada o wiele większą funkcjonalność, a pliki wykonywalne są kompatybilne ze wszystkimi wersjami Windowsa, od linii NT wzwyż.

0

Zainstalowałem Lazarusa i przykładowy plik po kompilacji waży aż 20MB to chyba aż za dużo gdzie przy Delphi było to zaledwie 1 MB.

0

@Eazy: może zanim zabierzesz się za pisanie czegokolwiek, najpierw zapoznaj się z dokumentacją.

Poczytaj czym jest plik wykonywalny, czym są tryby release i debug (i czym się od siebie różnią), czym jest debugger, czym jest RTL, czym VCL/LCL. Bo póki co nie dość że masz nikłą wiedzę na ten temat, to jeszcze błędne przekonania.

Eazy napisał(a):

Zainstalowałem Lazarusa i przykładowy plik po kompilacji waży aż 20MB […]

Bo zawiera informacje potrzebne debugger-owi do poprawnej analizy wykonywanego kodu i reagowania na zawarte w nim błędy. Dane te stanowią 90% objętości pliku wykonywalnego aplikacji okienkowej, kompilowanej przez FPC.

[…] to chyba aż za dużo […]

Nie, nie za dużo – patrz wyżej. Poza tym mamy 2017 rok, wielordzeniowe CPU, terabajtowe dyski i megabitowe łącza.

[…] gdzie przy Delphi było to zaledwie 1 MB.

Tak, pliki wykonywalne zajmowały o wiele mniej, dlatego że VCL 15 lat temu było o wiele uboższe od współczesnego, tak samo jak uboższa była składnia języka oraz środowisko. Jak chcesz cokolwiek porównywać to pobierz najnowszego Lazarusa i najnowszą wersję Delphi – czyli wersję Tokyo – i wtedy sobie porównaj.

0

Właśnie dlatego zwracam się z pomocą do fachowców, gdyż sam mam nikłe pojęcie na temat działania Lazarusa, Delphi. Czy jest szansa abym udostępnił przykładowy plik autorun.exe i byłby ktoś w stanie pokazać jak uzyskać podobny efekt? Pytam tak ponieważ nie wiem czy można udostępniać tu pliki innych wydawców(dodam że posiadam grę na oryginalnej płycie).

0
Eazy napisał(a):

Czy jest szansa abym udostępnił przykładowy plik autorun.exe i byłby ktoś w stanie pokazać jak uzyskać podobny efekt?

Mała szansa, że ktoś uruchomi u siebie plik wykonywalny nieznanej osoby. ;)

Poza tym, nawet gdybyś ten plik udostępnił (ten autorun.exe) i ktoś by go uruchomił, to bardzo możliwe, że posypałyby się liczne błędy, związane z brakującymi plikami. Programy tego typu często nie były w ogóle pod tym kątem zabezpieczane, dlatego że rozpowszechniane były na nośnikach CD – czyli jednokrotnego zapisu. Wystarczyło zadbać o to, aby na nośniku zawarte były wszystkie pliki i tyle – nikt nie mógł ich skasować, więc i dodatkowe zabezpieczenia nie były potrzebne.

Pytam tak ponieważ nie wiem czy można udostępniać tu pliki innych wydawców(dodam że posiadam grę na oryginalnej płycie).

Zapewne licencja tego oprogramowania nie zezwala na rozpowszechnianie poszczególnych plików – sprawdź opis drobnym drukiem na obrzeżu nośnika. Zresztą – jak chcesz nam pokazać jak ma Twój program wyglądać, to zrób zrzut ekranu i dodaj go do załączników posta.

Dobrze by było, gdybyś napisał wprost co potrzebujesz zrobić. Bo póki co wydaje mi się, że albo sam nie wiesz co chcesz uzyskać, albo nieco owijasz w bawełnę, celowo ukrywając pewne informacje (a przez to utrudniasz nam robotę).

0

Jeżeli chodzi o działalność tego menu, które dodałem w załączniku to jest tak:

  • wszystkie obrazki znajdują się w folderze autorun\tutaj obrazy - _focus, _up, _down, _disabled(chyba każdy wie o co chodzi)
  • menu jest zawsze na środku(nie jest cały czas na "top'ie" jednakże po dwukliku na pasku zadań nie można go zminimalizować)
  • menu zamienia 3 pozycje w momencie kiedy wykryje lokalizacje programu z "regedit.exe"
  • po kliknięciu w pozycje jest odtwarzany dźwięk z autorun\button.wav
  • autorun.exe waży 70 kb jednakże jest ono z 2004 więc rozmiar jest chyba zrozumiały.

Po prostu chciałbym uzyskać identyczny efekt do opisanego(może z wyjątkiem wagi pliku).

0
Eazy napisał(a):
  • wszystkie obrazki znajdują się w folderze autorun\tutaj obrazy - _focus, _up, _down, _disabled(chyba każdy wie o co chodzi)

Nie dziw się, że plik wykonywalny waży mało, skoro wszelkie wymagane zasoby są w osobnych plikach.

  • menu jest zawsze na środku(nie jest cały czas na "top'ie" jednakże po dwukliku na pasku zadań nie można go zminimalizować)

Kwestia ustawienia wartości poScreenCenter we właściwości Position formularza.

  • menu zamienia 3 pozycje w momencie kiedy wykryje lokalizacje programu z "regedit.exe"

regedit.exe to program umożliwiający wygodną edycję rejestru systemu – sam nie zawiera żadnych danych (a tym bardziej sam w sobie nie jest rejestrem). Jeśli o ten aspekt chodzi, to do dyspozycji jest klasa TRegistry, która zapewnia dostęp do rejestru i możliwość modyfikacji jego zawartości.

Skoro już o rejestrze mowa – dane dotyczące instalacji oprogramowania trzymane są w gałęzi HKLM. Aby móc modyfikować w niej dane, aplikacja musi posiadać stosowne uprawnienia (dla zapewnienia kompatybilności programu z systemami od Vista wzwyż i mechanizmem UAC). Sam odczyt danych można wykonać bez podwyższonych uprawnień.

Delphi 7 nie pozwala w łatwy sposób określić poziomu uprawnień – jest zbyt stare. Aby to zrobić, trzeba by ręcznie dołączyć stosowny plik tzw. manifestu do zasobów pliku wykonywalnego. Lazarus natomiast jest do tego przystosowany – uprawnienia można określić dwoma kliknięciami (w oknie ustawień projektu).

  • po kliknięciu w pozycje jest odtwarzany dźwięk z autorun\button.wav

Skoro to plik .wav, do odtworzenia dźwięku można wykorzystać systemową funkcję PlaySound (najlepiej z flagą SND_ASYNC, aby nie blokować wykonania dalszych instrukcji).

  • autorun.exe waży 70 kb jednakże jest ono z 2004 więc rozmiar jest chyba zrozumiały.

Całkiem możliwe, że do jego stworzenia nie była używana żadna biblioteka komponentów – po prostu gołe Win32 API i kod strukturalny. Ale te czasy już minęły – dziś taką apkę można wyklikać w 10 minut, zamiast mozolnego rzeźbienia kodu (bez designera i jego dobrodziejstw).

Po prostu chciałbym uzyskać identyczny efekt do opisanego(może z wyjątkiem wagi pliku).

Nie jest to trudne – wręcz przeciwnie. Co nie zmienia faktu, że trzeba posiadać choćby minimalną wiedzę z zakresu podstaw programowania i tworzenia aplikacji okienkowych.

0
  • Miałem na myśli samą wagę pliku "autorun.exe" i jest to dla mnie akurat zrozumiałe dlaczego tyle waży,

  • poScreenCenter, po dwukliku daje się zminimalizować a ja tego nie chce,

  • Czyli istnieje jakieś racjonalne rozwiązanie, które pozwoli zamieniać button na inny obrazek w zależności jak go wykorzystujemy? Chodzi mi tu o najechanie na niego, podczas gdy plik jest wykonywany itd, kiedy program jest zainstalowany itd.

"Nie jest to trudne" - więc czy mógłby mi ktoś wytłumaczyć krok po kroku co i jak? Ewentualnie dołączyć do tematu przykładowy projekt, abym mógł spojrzeć i lekko się podszkolić w tej dziedzinie?

Pozdrawiam.

0
Eazy napisał(a):
  • poScreenCenter, po dwukliku daje się zminimalizować a ja tego nie chce,

Chyba ”zmaksymalizować” – jeśli o tytułową belkę chodzi, bo dwuklik wewnątrz okna nie powoduje żadnej akcji.

Żeby rozmiar formularza był statyczny, należy ustawić właściwość BorderStyle na bsSingle, a jeśli tytułowa belka okna i całe jego obramowanie ma nie być widoczne (tak jak na zrzucie który dołączyłeś do wcześniejszego posta), należy wybrać wartość bsNone.

  • Czyli istnieje jakieś racjonalne rozwiązanie, które pozwoli zamieniać button na inny obrazek w zależności jak go wykorzystujemy? Chodzi mi tu o najechanie na niego, podczas gdy plik jest wykonywany itd, kiedy program jest zainstalowany itd.

Racjonalne rozwiązanie to poszukanie komponentu, który taką funkcjonalność posiada. Standardowe komponenty tego nie umożliwiają, dlatego że ich wygląd uzależniony jest od systemu i ustawionego w nim motywu. Ewentualnie można taki komponent napisać – to góra 100 linii kodu (dla kogoś, kto umie pisać własne kontrolki).

"Nie jest to trudne" - więc czy mógłby mi ktoś wytłumaczyć krok po kroku co i jak?

Tłumaczenie krok po kroku będzie niczym innym jak wykonaniem całości za Ciebie, tyle że znacznie bardziej czasochłonne. Może lepiej by było zlecić wykonanie tego projektu odpłatnie.

Ewentualnie dołączyć do tematu przykładowy projekt, abym mógł spojrzeć i lekko się podszkolić w tej dziedzinie?

Do szkolenia się w tej „dziedzinie” służy dokumentacja oraz liczne kursy i tutoriale w sieci. Forum przeznaczone jest dla pytań związanych z konkretnymi problemami, które można w kilku postach rozwiązać.

0

Nie, wiem co mówię. Chcę, aby okienko było cały czas na środku bez bordera i żeby się 'nie dało' tego zminimalizować nawet po dwukliku na pasku zadań.

0

No to Ci napisałem – ustaw Position na poScreenCenter i BorderStyle na bsNone.

0

Zrobiłem tak już wcześniej a i tak daje się minimalizować.

0

To co podałem ma usunąć ramkę okna oraz uniemożliwić zmianę jego rozmiaru.

Aby usunąć przycisk z paska zadań, aby okna nie dało się zminimalizować, można ustawić właściwość ShowInTaskBar na stNever. Problem w tym, że opcja ta jest zabugowana (co najmniej od sześciu lat!) i mimo wszystko tworzy przycisk aplikacji na pasku zadań. Ustawienie właściwości Application.MainFormOnTaskBar na False też nic nie daje.

Spróbuj przetestować u siebie – pod XP i 7 na pewno nie śmiga.

0

Dobra. Pozwole sobie udostępnić owe menu. Czy spoglądając na nie jest ktoś w stanie powiedzieć w czym zostało wykonane oraz ewentualnie jak uzyskać taki efekt w lazarusie itd?

0
Eazy napisał(a):

Czy spoglądając na nie jest ktoś w stanie powiedzieć w czym zostało wykonane […]

Żadna różnica w czym zostało to wykonane – na pewno bez użycia biblioteki komponentów, bo z nią rozmiar pliku wykonywalnego urósłby co najmniej do kilkuset kilobajtów. Taką apkę można napisać w czymkolwiek.

[…] oraz ewentualnie jak uzyskać taki efekt w lazarusie itd?

Od samego początku wątku podaję Ci informacje na ten temat. Czego jeszcze nie wiesz?


Przy okazji – program ten nie usuwa przycisku z paska zadań.

0

"Przy okazji – program ten nie usuwa przycisku z paska zadań." Próbowałem i tłumaczyłem bodajże 3 razy o co mi chodzi ale 'leciutko ujmując' nie dociera. Ikonka ma być na pasku, ale po dwukliku na nią okno ma się nie minimalizować tak jak w tym autorun co podałem. W delphi/lazarusie pomimo że nie ma borderów to przez ikonkę na pasku i tak można autorun zminimalizować(należy kliknąć szybko dwa razy).

Jeżeli taką apkę można napisać w czymkolwiek to jak zrobić coś takiego, że po zainstalowaniu programu, który utworzy klucz podajmy: HKLM\SOFTWARE\Company\Game" - to stworzone autorun wyczyta InstallDir z tego klucza i wtedy zamieni pozycję w autorun dajmy z Instaluj na Odinstaluj albo graj które było nieaktywne zrobiło się aktywne po instalacji gry. Jeżeli ktoś jest kompetenty i mi to wytłumaczy jak to zrobić to będę bardzo wdzięczny ponieważ wszyscy mówią że to bułka z masłem, ale nikt nie potrafi tego racjonalnie wytłumaczyć.

0
Eazy napisał(a):

Próbowałem i tłumaczyłem bodajże 3 razy o co mi chodzi ale 'leciutko ujmując' nie dociera.

Dociera, dociera – coś mi po drodze umknęło. Tyle że żaden dwuklik nie jest potrzebny – do minimalizacji wystarczy pojedyncze kliknięcie, od zawsze, w każdej wersji systemu.

Ikonka ma być na pasku, ale po dwukliku na nią okno ma się nie minimalizować tak jak w tym autorun co podałem.

Nie ikonka, a przycisk – to zasadnicza różnica. Da się zrobić, pytanie tylko po co? To nie jest standardowe zachowanie okien – wygląda jak bug powłoki.

W delphi/lazarusie pomimo że nie ma borderów to przez ikonkę na pasku i tak można autorun zminimalizować(należy kliknąć szybko dwa razy).

Obramowanie nie wpływa na zachowanie okna w taki sposób, w jaki sobie to wyobrażasz. To nie jest kwestia ustawień wyglądu formularza, a reakcji na próbę zminimalizowania i zabezpieczenie przed nią.

Jeżeli taką apkę można napisać w czymkolwiek to jak zrobić coś takiego, że po zainstalowaniu programu, który utworzy klucz podajmy: HKLM\SOFTWARE\Company\Game" - to stworzone autorun wyczyta InstallDir z tego klucza i wtedy zamieni pozycję w autorun dajmy z Instaluj na Odinstaluj albo graj które było nieaktywne zrobiło się aktywne po instalacji gry.

Pisałem Ci już – klasa TRegistry posiada metody umożliwiające odczytywanie danych z rejestru systemu (do modyfikacji też). Wystarczy otworzyć klucz na podstawie jego ścieżki oraz użyć metody odczytującej łańcuch znaków. Resztę – czyli ustawienia przycisków – należy oprogramować po operacjach na rejestrze.

Samo sprawdzenie czy klucz istnieje, a w nim wartość InitialDir nie wystarczy do określenia czy program jest zainstalowany, czy też nie jest. Potrzebujesz jeszcze sprawdzić, czy plik deinstalatora znajduje się na dysku.

Jeżeli ktoś jest kompetenty i mi to wytłumaczy jak to zrobić to będę bardzo wdzięczny […]

Twierdzisz, że brakuje mi kompetencji w tym temacie? ;)

[…] ponieważ wszyscy mówią że to bułka z masłem, ale nikt nie potrafi tego racjonalnie wytłumaczyć.

Nie, po prostu jako jedyny mam cierpliwość do Ciebie, czas i chęci na tłumaczenie podstaw programowania. Tu naprawdę nie brakuje użytkowników potrafiących stworzyć taką apkę, tym bardziej kompetentnych.

0

Rozumiem zaś że stworzenie takiego menu chociażby z jednym buttonem na sucho - wiąże się z płatnościami tak?

1

Tu nie chodzi o to, że na forum nie pomagamy i tylko żebrzemy o pieniądze. Każdy z nas udziela się tutaj dobrowolnie, nie oczekując żadnych profitów (co najwyżej darmowego plusika przy poście). Jednak co innego podpowiedzieć czy nakierować, a co innego wykonać całość za pytacza.

Podałem Ci wszystkie informacje potrzebne do przygotowania tego programu, ale dla Ciebie to za mało. Niektórych rzeczy nie zrobi się dwoma kliknięciami – trzeba poświęcić czas na wertowanie Google i próbowanie różnych rozwiązań.

Gdybym nie chciał Ci pomóc to bym nie znalazł tego kodu:

procedure TForm1.FormShow(Sender: TObject);
begin
  SetWindowLong(GetWindow(Self.Handle, GW_OWNER), GWL_STYLE, 0);
  SetWindowLong(GetWindow(Self.Handle, GW_OWNER), GWL_EXSTYLE, 0);
  Self.OnShow := nil;
end;

który rozwiązuje problem minimalizacji (testowałem jeszcze 10 innych kodów, ale nie działały prawidłowo).

Ty oczekujesz, że ktoś siądzie, trochę podłubie w wyszukiwarce, sprawdzi co działa a co nie i napisze gotowca, aby Ci dogodzić. A Ty sobie pobierzesz tego gotowca, zmienisz obrazki i tyle. Tymczasem to tak nie działa – to Ty musisz napisać ten program, w oparciu o wskazówki od bardziej doświadczonych w tym temacie. Ew. zlecić odpłatnie jego wykonanie.

0

Dodałem ten kod do edytora źródeł i dalej się minimalizuje.

0

O tym właśnie mówię – jeśli chcesz ten program zrobić sam (jak wspomniałeś) to najpierw musisz zaznajomić się z podstawami języka, a następnie z podstawami programowania aplikacji okienkowych. Bez tego ani rusz. Inaczej ktoś z nas będzie musiał odwalić całą robotę za Ciebie (choć połowę już odwaliłem).

Eazy napisał(a):

Dodałem ten kod do edytora źródeł i dalej się minimalizuje.

Pewnie że działa – zanim wrzuciłem go na forum, najpierw go przetestowałem (w Lazarusie).

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