WinAPI - własny instalator

0

Witam,

Przeszukiwałem różne fora i googlowałem, ale nie mogę nigdzie znaleźć choćby odrobiny pomocy do mojego problemu.

Napisałem własną grę (coś na wzór reversi) przy użyciu Allegro w Dev-C++.
Teraz chciałbym zakodować WŁASNY instalator. Zapewne będę musiał skorzystać z WinAPI.
Tyle wiem, ale nie mam większego pojęcia jak miałby wyglądać taki kod.
Z WinAPI mam raczej małe doświadczenie.

Tylko proszę nie piszcie, że pisanie takiego instalatora jest bez sensu, że to strata czasu i
żebym poszukał gotowych aplikacji w stylu NSIS czy CreateInstall itp.

Potrzebuję napisać własny instalator, który spakuje moją grę wraz z plikami, stworzy okno instalacyjne, plik wykonywalny instalacji, w którym wybiorę ściężkę instalacji, który stworzy ikony w menu start itp. (jak Install Shield .. )

Czy dysponuje ktoś taką wiedzą, materiałami do nauki czy cuś?

Z góry dzięki za info.

0

Łatwiej ci będzie nie w WinAPI, tylko w czymś do szybkiego "trzaskania" okienek. Jakiś C++ Builder na przykład. Z narzędzi darmowych wiem że jest biblioteka Qt, ale nie znam.

0

C++ Builder?hmmm

Wolałbym jednak pozostać przy Dev-C++, nie chcę się znowu męczyć z instalacją nowego kompilatora.

Jeśli nie WinAPI to co?
A co na przykład ze stworzeniem ikon w menu start? To chyba sprawa rejestru i WinAPI? Czy się mylę?

0

Sciągasz coś to modelowania zasobów, np. ResEd i tworzysz tyle dialogów, ile stron/kroków ma mieć instalator. Wszystkie dialogi powinny być podobnego rozmiaru
Wynikowy plik .rc dodajesz do projektu w swom devie, w main'ie piszesz swojego inno'

int entrypoint()
{
	PROPSHEETPAGE page[NUMPAGES];
	ZeroMemory(&page, sizeof(page));

	static DLGPROC PageHandlers[] = {Page1DlgProc, Page2DlgProc ...};

	for (int n=0; n<NUMPAGES; n++)
	{
		PROPSHEETPAGE *pPage = &page[n];
		pPage->dwSize      = sizeof(PROPSHEETPAGE);
		pPage->dwFlags     = PSP_DEFAULT;
		pPage->hInstance   = hinstance;
		pPage->pszTemplate = IDD_PAGE1 + 100*n; // id pierwszego i kolejnych dialogów
		pPage->pfnDlgProc  = PageHandlers[n];
	}

	PROPSHEETHEADER sheet;
	ZeroMemory(&sheet, sizeof(sheet));
	sheet.dwSize      = sizeof(sheet);
	sheet.dwFlags     = PSH_USEICONID | PSH_WIZARD97 | PSH_USECALLBACK | PSH_PROPSHEETPAGE;
	sheet.hInstance   = hinstance;
	sheet.nPages      = NUMPAGES;
	sheet.pszIcon     = (TCHAR*)IDI_APPLICATION; // id ikonki
	sheet.ppsp        = &page;
	sheet.pfnCallback = AllPagesProc;

	PropertySheet(&sheet);
	return 0;
}
int CALLBACK AllPagesProc(HWND hwndDlg,UINT uMsg,LPARAM lParam)
{
	switch (uMsg)
	{
		case PSCB_INITIALIZED:
			// tylko tu hwndDlg nie jest zerem
			break;
		case PSCB_BUTTONPRESSED:
			//lParam: PSBTN_OK,PSBTN_CANCEL,PSBTN_APPLYNOW,PSBTN_FINISH
	}
	return 0;
}
int CALLBACK Page1DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
	switch (uMsg)
	{
		case WM_INITDIALOG: ...
		case WM_COMMAND: ...
	}
}

Jeden z typowych układów sheeta (6 kroków): powitanie, licencja, docelowa lokalizacja, wybór składników, podsumowanie, log instalacji.

0

8-O
dzięki!

właśnie czegoś podobnego było mi trzeba!

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