All blog entries, ordered from most recent. Entry count: 1198.
# 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);
# 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.
# 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.

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:
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];
# 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:

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.