Jeżeli zależy ci na jak najmniejszym rozmiarze pliku wykonywalnego i nie chcesz cudować z nieużywaniem biblioteki standardowej C to zastanów się nad użyciem Windows Driver Kit. Jest to toolkit (zestaw nagłówków, bibliotek, narzędzi, w tym kompilatora), całkiem podobny do tego w Visual Studio. Jedną z różnic pomiędzy nimi jest właśnie biblioteka standardowa C. W przypadku Visual Studio, z każdą jego nową wersją, wydawana jest nowa wersja biblioteki standardowej. Aktualna (wewnętrzna) wersja Visual Studio to 10 i tak mamy msvcr100
. W uproszczeniu mówiąc, każdy program, który używa biblioteki standardowej C, skompilowany przy użyciu domyślnego toolkitu w Visual Studio będzie wymagał tej biblioteki. Może ona być zlinkowana statycznie, wtedy nie trzeba dostarczać żadnych dodatkowych plików, ale rośnie nam waga pliku wykonywalnego - do ok. 50kb. No i statyczne linkowanie biblioteki standardowej nie jest polecane (gdyby wykryto w niej błąd i Microsoft wypuściłby poprawkę, twój program dalej by korzystał ze starej wersji). Jeżeli byłaby zlinkowana dynamicznie i w systemie nikt wcześniej by nie zainstalował "Visual Studio 2010 Runtime", aplikacja nie uruchomiłaby się.
Ale jest też "inna" biblioteka standardowa C, wydawana z każdą nową wersją systemu operacyjnego, nazywa się po prostu msvcrt
i w każdym systemie ona jest, bo korzysta z niej właściwie każda aplikacja napisana przez Microsoft i prawie każdy sterownik. I właśnie aplikacja zbudowana przy pomocy WinDDK będzie korzystać właśnie z tej wersji biblioteki.
Przykładowy program:
#include <Windows.h>
#include <tchar.h>
int __cdecl main()
{
TCHAR szFileName[] = _T("nazwapliku.txt");
TCHAR szExecutablePath[MAX_PATH] = { 0 }, szPath[MAX_PATH] = { 0 };
GetModuleFileName(NULL, szExecutablePath, MAX_PATH);
LPTSTR lpszLastSlash = _tcsrchr(szExecutablePath, _T('\\'));
if(lpszLastSlash == NULL)
return 1;
_tcsncat_s(szPath, szExecutablePath, lpszLastSlash - szExecutablePath + 1);
_tcscat_s(szPath, szFileName);
_tcprintf(_T("Nowa sciezka:\n%s\n"), szPath);
return 0;
}
Jest to wyjątkowo nieprzenośna wersja C (C++ tak naprawdę), dedykowana tylko i wyłącznie na Windows, ale napisana z dość ścisłymi wytycznymi dla pisania kodu sterowników (stąd np. sprawdzenie czy w ścieżce znajduje się slash - niby powinien, ale powinniśmy sprawdzać wszystko).
I małe porównanie.
Toolkit |
Visual Studio 2011 |
Visual Studio 2010 |
WinDDK dla XP, Visty i 7 |
WinDDK dla 7 (na XP nie zadziała) |
47.5 KB |
43 KB |
8.5 KB |
5.5 KB |
|
z upx |
22 KB |
21.5 KB |
6.5 KB |
4.5 KB |