CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z AutoRun

Problem z AutoRun

dział ogólny

Problem z AutoRun

Nowy postprzez brando » czwartek, 21 kwietnia 2011, 23:37

Witam
Od razu mówię, że nie jestem zbyt dobry z C++, dopiero zaczynam z nim przygodę, więc proszę o wyrozumienie. Robię AutoRun do swojego pendrive, na którym są programy, a AutoRun przechowuje je w odpowiednich kategoriach. Więc tak: mam folder "Kategorie Programów", w tym folderze znajdują się odpowiednie kategorie, a w tych kategoriach odpowiednie programy. Więc najpierw wyszukuje kategorii w folderze "Kategorie Programów" i dodaje je do ListBoxa. I teraz po kliknięciu na ListBox, wybierając odpowiednią kategorię chcę, aby wyświetlały się programy, ale 1 program = 1xTPanel, 1xTLabel i kilka TButton (do instalacji itp.). A te programy znajdują się na ScrollBoxie. I teraz nie wiem jak się za to zbytnio zabrać. Najlepiej chyba będzie zrobić tablicę z lokalizacjami do programów i tablicę z obiektami. Coś próbowałem robić, ale nie za bardzo mi to wychodzi:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 TSearchRec Search;
TForm1 *Form1;
//---------------------------------------------------------------------------

// Wyswietlenie Kategorii
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Form1->ListBox1->Items->Clear();

  if (FindFirst(".\\Kategorie Programów\\*.*", faDirectory, Search) == 0)
     {
      do{
         if(((Search.Attr & faDirectory) > 0) & (Search.Name != ".") & (Search.Name != ".."))
            Form1->ListBox1->Items->Add(Search.Name);
        }
        while(FindNext(Search) == 0);
        FindClose(Search);
     }
}

// Wyswietlenie Programów

//---------------------------------------------------------------------------

void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
String tab[100];

int i;


for (i=0;i<=ilosc_programów;i++)  //skąd wziąć ilosc_programów?
{

TPanel *Panel_Programu;
  Panel_Programu = new TPanel(this);
  Panel_Programu->Parent=ScrollBox1;
  Panel_Programu->Top = 8;
  Panel_Programu->Left = 8;
  Panel_Programu->Width = 665;
  Panel_Programu->Height = 73;
  Panel_Programu->Visible = true;

TLabel *Nazwa_Programu = new TLabel(this);
  Nazwa_Programu->Parent=Panel_Programu;
  Nazwa_Programu->Top =8;
  Nazwa_Programu->Left = 0;
  Nazwa_Programu->Width = 665;
  Nazwa_Programu->Height = 25;
  Nazwa_Programu->Visible = true;
  Nazwa_Programu->Font->Name = "Calibri";
  Nazwa_Programu->Font->Size = 16;
  Nazwa_Programu->Alignment = taCenter;
  Nazwa_Programu->Align = alTop;

for(int i=1;i<=6;i++)
{
  TButton *Przycisk_Programu = new TButton(this);
  Przycisk_Programu->Parent=Panel_Programu;
  Przycisk_Programu->Top = 48;
  Przycisk_Programu->Left = 12 + (i*110);
  Przycisk_Programu->Width = 105;
  Przycisk_Programu->Height = 25;
  Przycisk_Programu->Visible = true;
  Przycisk_Programu->Caption="napis_na_przycisku";         // Jak odwołać się do tych przycisków osobno, aby można było nadać im inne napisy??
  }
}  

if (FindFirst(".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\*.*", faDirectory, Search) == 0)
     {
      do{
         if(((Search.Attr & faDirectory) > 0) & (Search.Name != ".") & (Search.Name != ".."))
         {

for (i=0;i<=100;i++)
  {
tab[i]=".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Search.Name + "\\*.*";
Form1->ListBox3->Items->Add(tab[i]);
          }
          }
        }
        while(FindNext(Search) == 0);
        FindClose(Search);
     }
}
//---------------------------------------------------------------------------
 


Z góry dziękuje za pomoc.
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » piątek, 22 kwietnia 2011, 11:44

Większość tego kodu jest niepoprawna, chociażby dlatego, że tworzysz panele jako obiekty lokalne. Na domiar wszystkiego tworzysz obiekty w pętli, czyli lokalne lokalnie, poza pętlą nie istnieją, pojawia się tutaj masa wycieków. Tworzysz wiele obiektów o identycznych nazwach, w efekcie wychodzi jeden pozostałe są gubione. Trzeba by tutaj zastosować jakąś tablicę, a najlepiej posłużyć się kontenerami:

Tworzenie dynamiczne komponentów o nieznanej jeszcze liczbie

Trudno cokolwiek doradzić, przy takim kodzie.

Zanim zaczniesz dalej tworzyć ten program poczytaj o obiektach tworzonych dynamicznie. Zaopatrz się w odpowiednia literaturę. Możesz też poczytać w serwisie Cyfrowy Baron, dział: teoria

  • Tworzenie klas
  • Funkcje
  • Rzutowanie typów, przypisanie polimorficzne

dział: porady -> różne -> Dynamiczne tworzenie obiektów.
dział: porady -> różne -> Dołączanie zdarzeń do dynamicznie tworzonych obiektów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez brando » sobota, 23 kwietnia 2011, 00:04

Witam
Dzięki Cyfrowy Baron. Zabrałem się do czytania. Na razie zająłem się obiektami. Pojawi się ich tyle ile jest elementów w Listboxie3. Po kliknięciu w daną kategorię w listboxie1 przekazuje nazwy programów do listboxa3. We forze tworze te obiekty, one mi się pojawiają i jest ok. W tym forze przed ich utworzeniem usuwam je przez polecenie delete, tak, żeby po kliknięciu danej kategorii te obiekty nie zakrywały się tylko znikały. I tu pojawia się problem, gdy pierwszy raz kliknę kategorię obiekty pojawiają się i jest ok, lecz gdy kliknę 2 raz to jest błąd.

KOD cpp:     UKRYJ  
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
int i;

Form1->ListBox3->Items->Clear();

if (FindFirst(".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\*.*", faDirectory, Search) == 0)
     {
      do{
         if(((Search.Attr & faDirectory) > 0) & (Search.Name != ".") & (Search.Name != ".."))
         {
Form1->ListBox3->Items->Add(Search.Name);
}
        }
        while(FindNext(Search) == 0);
        FindClose(Search);
     }


for (i=0;i<=ListBox3->Items->Count-1;i++)
{

delete Panel_Programu[i];
delete Nazwa_Programu[i];
delete Przycisk_Zainstaluj[i];


  Panel_Programu[i] = new TPanel(this);
  Panel_Programu[i]->Parent=ScrollBox1;
  Panel_Programu[i]->Top = 8 + (i*85);
  Panel_Programu[i]->Left = 8;
  Panel_Programu[i]->Width = 428;
  Panel_Programu[i]->Height = 73;
  Panel_Programu[i]->Visible = true;

  Nazwa_Programu[i] = new TLabel(this);
  Nazwa_Programu[i]->Parent=Panel_Programu[i];
  Nazwa_Programu[i]->Top =8;
  Nazwa_Programu[i]->Left = 0;
  Nazwa_Programu[i]->Width = 428;
  Nazwa_Programu[i]->Height = 25;
  Nazwa_Programu[i]->Visible = true;
  Nazwa_Programu[i]->Font->Name = "Calibri";
  Nazwa_Programu[i]->Font->Size = 16;
  Nazwa_Programu[i]->Alignment = taCenter;
  Nazwa_Programu[i]->Align = alTop;
  Nazwa_Programu[i]->Caption="Nazwa Programu";

Przycisk_Zainstaluj[i] = new TButton(this);
Przycisk_Zainstaluj[i]->Parent=Panel_Programu[i];
Przycisk_Zainstaluj[i]->Top=40;
Przycisk_Zainstaluj[i]->Left = 8;
Przycisk_Zainstaluj[i]->Width = 57;
Przycisk_Zainstaluj[i]->Height = 25;
Przycisk_Zainstaluj[i]->Visible = true;
Przycisk_Zainstaluj[i]->Caption="Zainstaluj";
Przycisk_Zainstaluj[i]->OnClick = Zainstaluj;

 }
}
 


Błąd, który wyskakuje:
Obrazek
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » sobota, 23 kwietnia 2011, 09:00

Prawdopodobnie błąd związane jest z przepełnieniem stosu pamięci. Tworzysz obiekty dynamicznie wewnątrz pętli w liczbie określonej przez ListBox3->Items->Count-1. Pytanie jaką masz deklarację tych obiektów, czyli:

KOD cpp:     UKRYJ  
TPanel *Panel_Programu[X];
TLabel *Nazwa_Programu[X];
TButton *Przycisk_Zainstaluj[X];


Jaki rozmiar tablicy zadeklarowałeś dla tych obiektów. Pytanie, czy ListBox3->Items->Count-1 nie jest większe od rozmiaru zadeklarowanej tablicy, bo jeżeli jest to tworzysz obiekty poza stosem pamięci.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez polymorphism » sobota, 23 kwietnia 2011, 16:13

Uuu, coś posty wcięło :o
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » sobota, 23 kwietnia 2011, 16:33

To przez jakąś awarię w cal.pl. Tylko dlaczego zginęły posty z bazy danych???
Nie będę tego wszystkiego pisał od początku, gdyż problem został rozwiązany. Problemem było kasowanie obiektów w niewłaściwej kolejności.

Podaję prawidłowy kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::CreateNewObjects(int c, String sAppName)
{
  Panel_Programu[c] = new TPanel(this);
  Panel_Programu[c]->Parent=ScrollBox1;
  Panel_Programu[c]->Top = 8 + (i*85);
  Panel_Programu[c]->Left = 8;
  Panel_Programu[c]->Width = 428;
  Panel_Programu[c]->Height = 73;
  Panel_Programu[c]->Visible = true;

  Nazwa_Programu[c] = new TLabel(this);
  Nazwa_Programu[c]->Parent=Panel_Programu[i];
  Nazwa_Programu[c]->Top =8;
  Nazwa_Programu[c]->Left = 0;
  Nazwa_Programu[c]->Width = 428;
  Nazwa_Programu[c]->Height = 25;
  Nazwa_Programu[c]->Visible = true;
  Nazwa_Programu[c]->Font->Name = "Calibri";
  Nazwa_Programu[c]->Font->Size = 16;
  Nazwa_Programu[c]->Alignment = taCenter;
  Nazwa_Programu[c]->Align = alTop;
  Nazwa_Programu[c]->Caption=sAppName;

  Przycisk_Zainstaluj[c] = new TButton(this);
  Przycisk_Zainstaluj[c]->Parent=Panel_Programu[i];
  Przycisk_Zainstaluj[c]->Top=40;
  Przycisk_Zainstaluj[c]->Left = 8;
  Przycisk_Zainstaluj[c]->Width = 57;
  Przycisk_Zainstaluj[c]->Height = 25;
  Przycisk_Zainstaluj[c]->Visible = true;
  Przycisk_Zainstaluj[c]->Caption="Zainstaluj";
  Przycisk_Zainstaluj[c]->OnClick = Zainstaluj;  
}
//------------------------------------------------------
void __fastcall TForm1::DeleteOldObjects(int count)
{
  for(int i = 0; i <= count; i++) delete Przycisk_Zainstaluj[i];
}
//------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
 static int count = 0;
 
 if(count != 0)
 {
   DeleteOldObjects(count);
   
   count = 0;
 }

 Form1->ListBox3->Items->Clear();

 if (FindFirst(".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\*.*", faDirectory, Search) == 0)
     {
      do{
         if(((Search.Attr & faDirectory) > 0) & (Search.Name != ".") & (Search.Name != ".."))
         {
           Form1->ListBox3->Items->Add(Search.Name);
                   CreateNewObjects(count, ExpandFileName(Search.Name);
                   count++;
         }
        }
        while(FindNext(Search) == 0);
        FindClose(Search);
   }
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
brando
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez brando » sobota, 23 kwietnia 2011, 17:41

Ok, dzięki Cyfrowy Baron. Jednak twój kod źródłowy jest o wiele, wiele lepszy. Chciałem wcześniej napisać, ale przez tą awarię nie mogłem. Znalazłem tylko 2 błędy:
KOD cpp:     UKRYJ  
//Zamiast
for(int i = 0; i <= count; i++) delete Przycisk_Zainstaluj[i];
//zrobiłem
for(int i = 0; i < count; i++) delete Przycisk_Zainstaluj[i]; /*ponieważ wywalało błąd po którymś kliknięciu w ListBox1 */


i

KOD cpp:     UKRYJ  
//zamiast i:

Nazwa_Programu[c]->Parent=Panel_Programu[i];
Przycisk_Zainstaluj[c]->Parent=Panel_Programu[i];

//powinno być c:

Nazwa_Programu[c]->Parent=Panel_Programu[c];
Przycisk_Zainstaluj[c]->Parent=Panel_Programu[c];
Ale poza tym naprawdę wielkie dzięki!!! Masz plusa. W razie kolejnych problemów napiszę.
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez brando » sobota, 23 kwietnia 2011, 18:39

Ehh... kolejny problem. Otóż stworzyłem już wszystkie potrzebne przyciski, dołączyłem również te do programów z wersjami X86 i X64. I teraz chciałbym je uruchamiać, więc zrobiłem zdarzenie OnClick w tworzeniu obiektów, a potem w tej funkcji mam zmienną Szukane, która odpowiada za szukany plik .exe. Dalej mam funkcje Uruchom i pętlę zależną od ilości elementów w ListBox3. W pętli, aby otwierać aplikacje stosuje WinExec. I tu się pojawia problem. Wyskakuje taki błąd:

Obrazek


Rozumiem, że chodzi o typ danych. Jak konwertować typ String na Char?

I kod źródłowy:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Uruchom(String Szukane)
{
for (int i=0;i<ListBox3->Items->Count;i++)
{
WinExec(".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Nazwa_Programu[i]->Caption + Szukane, SW_SHOW);
}
}


void __fastcall TForm1::Zainstaluj_X86(TObject *Sender)
{
Szukane="*X86*.*";
Uruchom(Szukane);
}
 
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » sobota, 23 kwietnia 2011, 19:55

Masz błąd ponieważ funkcja WinExec oczekuje argumentu typu char, a ty jej przekazujesz typ AnsiString - niewłaściwa zmienna. Trzeba dokonać konwersji zmiennej AnsiString na char za pomocą funkcji .c_str(). Powinno być tak:

KOD cpp:     UKRYJ  
WinExec( ".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Nazwa_Programu[i]->Caption + Szukane).c_str(), SW_SHOW);


WinExec to nie jest najlepsza funkcja do uruchamiania programów, gdyż jest kompatybilna tylko z okienkami 16-bitowymi. Lepiej użyć ShellExecute lub CreateProcess:

► patrz serwis: Cyfrowy Baron dział: porady -> API:
   Uruchamianie programu z wybranym do edycji plikiem - sposób trudniejszy.
   Uruchamianie pliku w domyślnym programie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez brando » sobota, 23 kwietnia 2011, 23:22

A jak wskazać lokalizację programu, który robię?? Pytam się, ponieważ stosując zmienne nic nie działało. W końcu wpisałem ręcznie lokalizację do jednego z programów i wyskakuje mi błąd:

Kod: Zaznacz cały
[C++ Error] Unit1.cpp(68): E2294 Structure required on left side of . or .*


Wskazuje niby na kropkę, która znajduje się przed Kategorie Programów w lokalizacji, więc pomyślałem, żeby po prostu podać lokalizację tego Autoruna, ale która funkcja zwróci mi tą ścieżkę?
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » niedziela, 24 kwietnia 2011, 08:12

Pokaż kod, który wywołuje błąd!

brando napisał(a):A jak wskazać lokalizację programu, który robię??


W moim poprzednim przykładzie był błąd. Zabrakło nawiasu otwierającego.

KOD cpp:     UKRYJ  
WinExec( (".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Nazwa_Programu[i]->Caption + Szukane).c_str(), SW_SHOW);


Konwersję stosujesz tylko wtedy, gdy dodajesz do siebie wartości i zmienne jak wyżej, jeżeli podajesz pełną ścieżkę:

KOD cpp:     UKRYJ  
WinExec( "C:\\Program Files\\Cyfbar\\myprogam.exe", SW_SHOW);


nie stosujesz konwersji, gdyż jest to łańcuch znaków typu char.

  kod niepoprawny
  
KOD cpp:     UKRYJ  
".\\Kategorie Programów\\"
  


To nie jest żadna ścieżka. Takiej lokalizacji program nie rozpozna. Kropka dla programu nic nie znaczy. Gdzie znajduje się Katalog Programów?

KOD text:     UKRYJ  
Nazwa_Programu[i]->Caption + Szukane


Co zawiera Caption i co zawiera szukane, czy nie powinno być przypadkiem tak:

KOD text:     UKRYJ  
Nazwa_Programu[i]->Caption + "\\" + Szukane
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez brando » niedziela, 24 kwietnia 2011, 11:01

Ok, po usunięciu .c_str() błędu nie ma, lecz po naciśnięciu przycisku programy się nie uruchamiają. Folder Kategorie Programów znajduje się w katalogu z moim programem, dlatego zamiast kropki chciałbym wstawić funkcję, która wywoła katalog z programem, a później Kategorie Programów i tak dalej. Caption zawierają nazwy programów, czyli nazwy tych poszczególnych folderów, które są tworzone przy tworzeniu obiektów.

KOD cpp:     UKRYJ  
/*  Ogólny schemat katalogów:  Katalog Programu\Kategorie Programów\Nazwa Kategorii\Nazwa Programu\Plik *.exe; */
//  Więc robię tak:  
Szukane = "*.exe";                                          
".\\Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Nazwa_Programu[i]->Caption + "\\" + Szukane;


EDIT:

Udało mi się zrobić tak, że uruchamia się przynajmniej folder programu. Usunąłem zmienną Szukane. Tylko, że jest tak, że jak nacisnę przycisk to powinien otworzyć się folder tylko tego programu, a otwierają się foldery wszystkich programów z danej kategorii.
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » niedziela, 24 kwietnia 2011, 17:35

Jeżeli katalog do którego się odwołujesz jest podkatalogiem programu, to trzeba pobrać ścieżkę dostępu do tego programu za pomocą funkcji ExtractFilePath i PamamStr(0), lub Application->ExeName:

KOD cpp:     UKRYJ  
String sAppDir = ExtractFilePath( ParamStr(0) );

WinExec( ( sAppDir + "Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Nazwa_Programu[i]->Caption + Szukane ).c_str(), SW_SHOW);


brando napisał(a):Caption zawierają nazwy programów, czyli nazwy tych poszczególnych folderów, które są tworzone przy tworzeniu obiektów.


Nazwy programów, czy nazwy poszczególnych folderów - zdecyduj się. Musisz podać nazwę do konkretnego pliku programu, czyli nazwa_katalogu_w_którym_plik_się_znajduje + nazwa_pliku + kropka + rozszerzenie.

brando napisał(a):Udało mi się zrobić tak, że uruchamia się przynajmniej folder programu. Usunąłem zmienną Szukane. Tylko, że jest tak, że jak nacisnę przycisk to powinien otworzyć się folder tylko tego programu, a otwierają się foldery wszystkich programów z danej kategorii.


Nie pojmuję! To nie na mój rozum... :roll:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » niedziela, 24 kwietnia 2011, 18:04

Do poprzedniego postu wkradł się drobny błąd w kodzie, który poprawiłem.

Wyjaśnię jak działają funkcje:

ParamStr( X ) - zwraca argumenty linii komend programu więcej o tym w serwisie Cyfrowy Baron w dziale: porady -> różne -> Przekazywanie do programu argumentów z linii komend.
Jeżeli jako argument przekażemy funkcji ParamStr wartość 0, to zwróci ona ścieżkę dostępu do programu wraz z nazwą programu, np. program znajduje się w lokalizacji: c:\Program Files\Adobe\Adobe Photoshop CS3\Photoshop.exe, po wywołaniu tej funkcji z argumentem 0:

KOD cpp:     UKRYJ  
String sAppFile = ParamStr(0);


Zmienna sAppFile będzie przechowywać wartość: c:\Program Files\Adobe\Adobe Photoshop CS3\Photoshop.exe.

Application->ExeName zwraca dokładnie taką samą wartość jak funkcja ParamStr(0), czyli jak ParamStr ale tylko z argumentem 0. Te funkcje nie są sobie równe:

KOD cpp:     UKRYJ  
String sAppFile = Application->ExeName;


Zmienna sAppFile będzie przechowywać wartość: c:\Program Files\Adobe\Adobe Photoshop CS3\Photoshop.exe.

ExtractFilePath wyodrębnia ścieżkę dostępu do pliku, który został przekazany jako argument funkcji, np:

KOD cpp:     UKRYJ  
String sFile = "c:\\Program Files\\Adobe\\Adobe Photoshop CS3\\Photoshop.exe";
String sFileDir = ExtractFilePath( sFile );


Zmienna sFileDir będzie przechowywać wartość: c:\Program Files\Adobe\Adobe Photoshop CS3\.

Z ukośnikiem na końcu. Podobną funkcją jest ExtractFileDir, z tym że ta funkcja zwraca wartość bez ukośnika na końcu ścieżki:

KOD cpp:     UKRYJ  
String sFile = "c:\\Program Files\\Adobe\\Adobe Photoshop CS3\\Photoshop.exe";
String sFileDir = ExtractFileDir( sFile );


Zmienna sFileDir będzie przechowywać wartość: c:\Program Files\Adobe\Adobe Photoshop CS3. Bez ukośnika na końcu.

Jeżeli połączymy funkcję ExtractFilePath z funckją ParamStr(0) lub Application->ExeName to zawsze otrzymamy ścieżkę dostępu do katalogu z którego program został uruchomiony, niezależnie od tego gdzie ten program się aktualnie znajduje, ścieżka zawsze będzie wskazywać katalog programu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z AutoRun

Nowy postprzez brando » niedziela, 24 kwietnia 2011, 18:36

Dzięki za wytłumaczenie. Wiem, trochę namieszałem. Nazwy programów = nazwy poszczególnych folderów, które znajdują się w Katalog_Główny_Programu\Kategorie_Programów\Kategoria\ i tu te foldery.
Chodzi mi o to, żeby w funkcji kliknięcia w przycisk Zainstaluj lokalizacje przypisywały się po kolei do tych przycisków np Przycisk_Zainstaluj[0] ma lokalizację do pierwszego programu z danej kategorii i uruchamia go. Mi na razie udało się zrobić tak, że przypisują się wszystkie programy. Niestety uruchamiają się nadal foldery, a pliki *.exe nie chcą się uruchamiać.

KOD cpp:     UKRYJ  
Przycisk_Zainstaluj[c]->OnClick = Zainstaluj;   //deklaracja zdarzenia w funkcji CreateNewObjects

//.......

void __fastcall TForm1::Zainstaluj(TObject *Sender)
{
int i;
Szukane = "*.exe";
for (i=0;i<ListBox3->Items->Count;i++)
{
ShellExecute(Form1->Handle, NULL , (sAppDir + "Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Nazwa_Programu[i] + "\\" + Szukane).c_str(), "", "", SW_SHOWNORMAL);
}
}
 


Ehhh.. już nie wiem co robię źle.
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości