All Blog Entries

All blog entries, ordered from most recent. Entry count: 1198.

Uwaga! Informacje na tej stronie mają ponad 6 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

Pages: > 1 ... 75 76 77 78 79 ... 150 >

# Odpalić program i poczekać

Thu
07
Aug 2008

Jak uruchomić z poziomu swojego programu inny program i zaczekać na jego zakończenie? Funkcji do uruchamiania programów jest wiele. Najprostsza, ale posiadająca małe możliwości jest funkcja system z biblioteki standardowej C, która pozwala uruchomić dowolne polecenie systemowe. Prosta jest też funkcja WinExec, ale ona jest przestarzała i niezalecana.

Pośród tych potężnych zostają dwie, z których każda ma swoje wady i zalety. ShellExecute i ShellExecuteEx pozwala "uruchomić" dowolny plik lub wykonać na nim inną akcję powłoki (np. "open", "edit", "print"). W przypadku plików EXE to będzie uruchomienie, a dla różnych dokumentów, ich otwarcie w domyślnej aplikacji skojarzonej z rozszerzeniem. Z kolei funkcja CreateProcess pozwala uruchomić plik wykonywalny podając przy tym m.in. własne zmienne środowiskowe czy też uchwyty przechwytujące konsolowe wejście-wyjście. Zwraca natomiast uchwyt do utworzonego procesu.

Ostatnio wyczytałem, że funkcja ShellExecuteEx też potrafi zwrócić uchwyt do utworzonego procesu. Wystarczy w strukturze SHELLEXECUTEINFO ustawić pole fMask na flagę SEE_MASK_NOCLOSEPROCESS. Wówczas pole hProcess zostanie wypełnione uchwytem. Potem wystarczy już tylko poczekać na zakończenie programu takim wywołaniem:

WaitForSingleObject(shell_execute_info.hProcess, INFINITE);

Comments | #winapi Share

# Odpalanie TortoiseSVN ze swojego programu

Tue
05
Aug 2008

Pisząc zaawansowane narzędzie wygodnie byłoby zintegrować je z systemem kontroli wersji SVN. Jak odpalić funkcję SVN z poziomu programu? Można uruchomić konsolowy SVN z odpowiednim parametrami, ale konsolowy program ma konsolowe wyjście i jest konsolowo niewygodny. Dużo fajniej byłoby uruchomić jakoś TortoiseSVN, tak jakby to użytkownik wybrał z menu kontekstowego danego pliku czy katalogu polecenie otwierające odpowiednie okienko, np. Update, Commit.

Okazuje się, że da się to zrobić bardzo prosto. Szczegóły można znaleźć w helpie TortoiseSVN, pod hasłem "Automating TortoiseSVN". Pisząc w skrócie, trzeba uruchomić program TortoiseProc.exe. Pełną ścieżkę do niego można znaleźć w rejestrze, w HKEY_LOCAL_MACHINE\SOFTWARE\TortoiseSVN\ProcPath. Jako parametry trzeba podać /notempfile, /command:commit (gdzie zamiast "commit" mogą być różne polecenia, np. "update" albo "repostatus") oraz /path:"..." ze ścieżką do danego katalogu. Można dodać /closeonend:2, aby okienko samo się zamknęło po zakończeniu operacji, jeśli nie było błędów.

Comments | #tools Share

# Asercja - int 3

Sat
26
Jul 2008

Ciekawostka: Instrukcja asemblerowa wywołująca przerwanie int 3 może posłużyć jako asercja. Działa tak: Jeśli program jest uruchomiony z poziomu debuggera, przerywa jego wykonywanie tak, jakby w tym miejscu w kodzie postawiony był Breakpoint ("Program.exe has triggered a breakpoint"). Można podglądać stos wywołań programu czy wartości zmiennych. Potem można go kontynuować. Jeśli natomiast uruchomiony jest bez debuggera, wysypuje się z błędem krytcznym. Można sobie napisać na przykład takie makro:

#ifdef _DEBUG
#define MY_ASSERT(x) { if ((x) == 0) { _asm { int 3 } } }
#else
#define MY_ASSERT(x) { }
#endif

Comments | #c++ #visual studio Share

# Fajny błąd Visual C++

Fri
25
Jul 2008

Visual C++ to świetne środowisko programistyczne, moim zdaniem najlepsze. Ale nawet w nim zdarzają się błędy. Czasami bardzo śmieszne.

Error C2471 Cannot update program database

Clean Solution i rekompilacja nie pomogła. Na szczęście restart programu pomógł :)

Comments | #visual studio Share

# Konfiguracja Visual C++ dla AssistX

Thu
24
Jul 2008

Visual AssistX jest fajny, o czym już pisałem. Po jego zainstalowaniu warto zrobić małą konfigurację swojego Visual C++ (mówię o wersji 2005, nie wiem jak jest z 2008).

Po pierwsze, wyłączamy Navigation bar, bo nad polem z kodem wystarczy nowy pasek AssistX, niepotrzebne są dwa. W tym celu trzeba wejść do Tools > Options... > Text Editor > C/C++ > General i oznaczyć pole Navigation bar.

Po drugie, warto wyłączyć Visualowy IntelliSense. Ten szwankujący mechanizm podpowiadania jest całkowicie zastąpiony przez lepszy od niego AssistX, a to on podobno zamula środowisko bardziej, niż ten dodatek. Niestety nie ma sposobu, żeby wyłączyć go w opcjach. Trzeba się uciec do sztuczki - skasować lub zmienić nazwę pliku VC\vcpackages\feacp.dll leżącego w katalogu z zainstalowanym Visualem. (Dowiedziałem się o tym dzisiaj - pozdro KriS :)

Comments | #c++ #visual studio #tools Share

# Aqua Fish 2 - moja gra dla firmy Play

Sun
20
Jul 2008

Ukazała się oficjalna zapowiedź gry Aqua Fish 2, którą pisałem przez ostatnie miesiące. Konkretnie to ja byłem programistą, grafikę stworzył gemGreg, muzykę i dźwięki Mimper, a wydawcą jest firma Play. Gra wkrótce będzie dostępna w sklepach, zapewne w przystępnej cenie :D Ma niskie wymagania sprzętowe (nie używa shaderów). Jest adresowana dla dzieci. Właściwie należy do gatunku Pacmana :) Gracz steruje rybką, która pływa między przeszkodami, zbiera punkty i dodatkowe przedmioty, a unika wrogich stworów (albo je niszczy). Grafika jest trójwymiarowa i kolorowa. Gra toczy się w 6 różnych titlesetach.

Na YouTube jest do obejrzenia filmik z gry:


Link

Comments | #games #productions #video Share

# std::vector wszędzie zamiast tablic

Thu
17
Jul 2008

Początkujący w C++ uczą się najpierw o wskaźnikach i dynamicznej alokacji pamięci, w tym tablic operatorem new[]. Dopiero potem poznają bibliotekę STL. Tymczasem klasy std::vector warto używać zawsze zamiast dynamicznych tablic. Ma wiele zalet: [+] sama zwalnia pamięć, nie grozi wyciekiem pamięci, [+] pamięta swój rozmiar, [+] potrafi się sama rozszerzać, [+] ma wygodne metody m.in. do wstawiania (insert) i usuwania (erase) ze środka. Wcale nie jest przy tym wolniejsza niż zwykłe tablice, o ile używa się jej prawidłowo. Na przykład tak:

class MojaKlasa {
private:
  std::vector m_Wektor;
public:
  MojaKlasa() :
  // Rozmiar od razu na 128
  m_Wektor(128)
  {
    // Wypełniam elementy, a nie dodaję
    for (int i = 0; i < 128; i++)
      m_Wektor[i] = i;
  }
};

Najlepsze jest to, że wektor zawsze jest trzymany w pamięci jako zwykła tablica i można uzyskać do niej wskaźnik pobierając adres pierwszego elementu:

int *Tablica = &m_Wektor[0];

Comments | #c++ #stl Share

# Samurize - mój config

Tue
15
Jul 2008

Samurize to darmowy programik, który potrafi w panelu przyklejonym do pulpitu albo pokazywanym zawsze na wierzchu przedstawiać różne statystyki z pracy komputera. Jest bardzo elastyczny i prosty w obsłudze dzięki graficznemu edytorowi konfiguracji. Do zaprojektowanego przez siebie panelu można wstawiać różnego rodzaju mierniki, w szczególności dowolny systemowy Performance Counter. Konfig, z którym ja nie rozstaję się już od ponad 3 lat, wygląda tak:

Samurize - mój config

Siedzi sobie w prawym górnym rogu ekranu i mierzy kolejno:

Dzięki temu zawsze jeden rzut oka wystarcza, żeby wiedzieć, co się dzieje w komputerze. Na przykład na pokazanym obrazku przed chwilą pracował procesor, a obecnie coś ściąga się z Internetu. Jeśli też chcesz mieć taki miernik, możesz ściągnąć ten mój: Samurize - Config by Reg.ini.

Comments | #software Share

Pages: > 1 ... 75 76 77 78 79 ... 150 >

[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2026