Tworzenie instalki (c++, WinApi, MS Visual Studio Community 2015)

0

Witam!
Tworze program pod Windows XP z interfejsem graficznym opartym na WinApi, pracuję na MS Visual Community 2015 na systemie Windows 7. Aplikacja ma być do użytku w firmie także staram się pracować tylko na otwartym oprogramowaniu i bibliotekach, nie mam funduszy na opłacanie licencji. Mam parę pytań a propos tego tematu:

  • Jak utworzyć instalke pod Windowsa XP? Pobierać jakiś dodatkowy program, czy może Visual 2015 ma coś takiego wbudowane?
    Nie mam zielonego pojęcia jak się do tego zabrać, wyczytałem gdzieś że trzeba doinstalować i ustawić odpowiedni zestaw narzędzi pod platformę docelową (zainstalowałem Windows XP (v140_xp))

  • Czy aplikacja stworzona na Win7 64 ruszy na WinXP 32? O tyle o ile nie używam funkcji które mogłyby sprawić problem, to zastanawiam się czy XP w ogóle obsługuje C11?

  • Czy warto ewentualnie przerzucić się na inne IDE?

Z góry dzięki za pomoc :)

1
Jaqb123 napisał(a):
  • Jak utworzyć instalke pod Windowsa XP? Pobierać jakiś dodatkowy program, czy może Visual 2015 ma coś takiego wbudowane?
    Nie mam zielonego pojęcia jak się do tego zabrać, wyczytałem gdzieś że trzeba doinstalować i ustawić odpowiedni zestaw narzędzi pod platformę docelową (zainstalowałem Windows XP (v140_xp))
    Osobiście do tworzenia instalatorów używam darmowego Inno Setup. Bardzo fajne narzędzie.
Jaqb123 napisał(a):

Czy aplikacja stworzona na Win7 64 ruszy na WinXP 32? O tyle o ile nie używam funkcji które mogłyby sprawić problem, to zastanawiam się czy XP w ogóle obsługuje C11?
To nie system operacyjny obsługuje standard języka, ale kompilator. Jak nie używasz funkcji z WinAPI które są dostępne w Windows dopiero od Visty, albo 7-ki nie powinno być problemów. Ewentualnie problem może być jak program skompilujesz jako 64 bitowy exek.

Jaqb123 napisał(a):

Czy warto ewentualnie przerzucić się na inne IDE?
Moim zdaniem nie zmieniaj. Oczywiście jeśli pisanie tylko na Windows Ci odpowiada. Jeśli chciałbyś pisać aplikacje przenośne między to musiałbyś zmienić IDE.

0

Super, dzieki za odpowiedz. Jeszcze jesli chodzi o ten standard jezyka, jesli na xp to tez powinno dzialac to jaki kompilator powinienem zainstalowac? Z winapi nie powinno byc problemu, ustawilem dubug na x86 wiec wyrzucilby mi bledy architektury juz na win7. Przynajmniej tak mi sie wydaje xD

1
Jaqb123 napisał(a):

Jeszcze jesli chodzi o ten standard jezyka, jesli na xp to tez powinno dzialac to jaki kompilator powinienem zainstalowac?
Ale instalując Visuala masz już zainstalowany kompilator, więc niczego więcej Ci nie trzeba.

Jaqb123 napisał(a):

ustawilem dubug na x86 wiec wyrzucilby mi bledy architektury juz na win7. Przynajmniej tak mi sie wydaje xD
Ale wiesz, że dla klienta warto robić wersje release? Po co mają być dodatkowe informacje w execu, jeszcze kogoś będzie kusiło debudować i będzie miał ułatwione zadanie.

0

Dobra dzieki za uwage, tak zrobie. Jest gdzies dostepna jakas dokumentacja na temat zmian w WinApi pomiedzy 32 a 64?

0

Z tego co kojarzę to raczej różnic nie ma jako takich. Jedyne różnice moim zdaniem wynikają np. z obsługi większej ilości pamięci. Sam często sięgam do dokumentacji WinAPI i żadnych różnic nie kojarzę.

1

jeśli w opcjach projektu ustawisz "Platform Toolset" na v140_xp oraz nie użyjesz żadnej funkcji której nie ma w XP to na XP program będzie działał.

Visual domyślnie generuje w projekcie plik targetver.h. Zmień jego zawartość na taką:

#include <winsdkver.h>
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>

ten #define wyłączy ci niektóre definicje funkcji i stałych, których nie ma w XP, w ten sposób będzie ci trudniej przypadkiem użyć funkcji która weszła w Win8 na przykład.

Jest gdzies dostepna jakas dokumentacja na temat zmian w WinApi pomiedzy 32 a 64?
Większość zmian wynika z faktu, że rozmiar wskaźnika nie jest równy rozmiarowi inta. Przykładowo, funkcja GetWindowLong służyła do pobierania zarówno intów, jak i wskaźników z parametrów okna. W architekturze x64 funkcja nie mogła zostać w tej postaci. Dlatego powstała funkcja GetWindowLongPtr, która w x64 przyjmuje 64-bitowy wskaźnik, a w 32-bitowej jest tylko #define'em na GetWindowLong i przyjmuje wartość 32-bitową. Używać się powinno GetWindowLongPtr, dzięki temu jeden kod prawidłowo zadziała na obu architekturach.

Inna różnica wynika z innego (wewnętrznie) mechanizmu obsługi wyjątków, za czym stoi niemożność złapania wyjątku w niektórych przypadkach, np. jeśli CreateWindow jest wewnątrz bloku try, a w zdarzeniu WM_CREATE jest rzucony wyjątek, to pod 64-bitowym Windowsem nie da się go złapać (zależnie od wersji systemu - wyjątek zniknie albo wywali program). Jest to ograniczenie 64-bitowego systemu, i dotyczy zarówno 32- jak i 64-bitowych programów, i niezależne jest od użytego języka programowania. Pod 32-bitową windą taki wyjątek da się złapać bez problemu.

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