Tworzenie programu dla Windows (w c++)

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
cypiss
Piegowaty Guziec
Piegowaty Guziec
Posty: 13
Rejestracja: 11 maja 2007, 18:31
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Xfce
Architektura: x86_64

Tworzenie programu dla Windows (w c++)

Post autor: cypiss »

Czy jest możliwe aby w linuksie skompilować program, który będzie uruchamiał się w Windowsie?
Chodzi o c++.
Awatar użytkownika
Semutachi
Piegowaty Guziec
Piegowaty Guziec
Posty: 22
Rejestracja: 04 lip 2011, 11:01
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86_64

Re: Tworzenie programu dla Windows (w c++)

Post autor: Semutachi »

Tak, jest to możliwe.

Kod: Zaznacz cały

apt-get install mingw32 gcc-mingw32
Plik mingwtest.cpp

Kod: Zaznacz cały

#include <windows.h>
 
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 
// WYPEŁNIANIE STRUKTURY
 WNDCLASSEX wc;
 
 wc.cbSize = sizeof (WNDCLASSEX);
 wc.style = 0;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = NazwaKlasy;
 wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
 
// REJESTROWANIE KLASY OKNA
 if (!RegisterClassEx(&wc))
 {
  MessageBox (NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", 
   MB_ICONEXCLAMATION | MB_OK);
  return 1;
 }
 
// TWORZENIE OKNA
 HWND hwnd;
 
 hwnd = CreateWindowEx (WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW, 
  CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);
 
 if (hwnd == NULL)
 {
  MessageBox (NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION);
  return 1;
 }
 
 ShowWindow (hwnd, nCmdShow); // Pokaż okienko...
 UpdateWindow (hwnd);
 
// Pętla komunikatów
 while (GetMessage (&Komunikat, NULL, 0, 0))
 {
  TranslateMessage (&Komunikat);
  DispatchMessage (&Komunikat);
 }
 return Komunikat.wParam;
}
 
// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
  case WM_CLOSE:
   DestroyWindow (hwnd);
  break;
 
  case WM_DESTROY:
   PostQuitMessage (0);
  break;
 
  default:
   return DefWindowProc (hwnd, msg, wParam, lParam);
  }
 
 return 0;
}
Kod skopiowany z http://darkcult.nazwa.pl/wiki/index.php/Podstawy_WinAPI
Kompilacja

Kod: Zaznacz cały

i586-mingw32msvc-g++ mingwtest.cpp -o mingwtest.exe
Uruchomienie

Kod: Zaznacz cały

wine mingwtest.exe
Rezultat
Obrazek
Linux Akihabara 2.6.38-bpo.2-amd64 x86_64 GNU/Linux
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Tworzenie programu dla Windows (w c++)

Post autor: ethanak »

to nie lepiej użyć wxwidgets?
Awatar użytkownika
Semutachi
Piegowaty Guziec
Piegowaty Guziec
Posty: 22
Rejestracja: 04 lip 2011, 11:01
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86_64

Re: Tworzenie programu dla Windows (w c++)

Post autor: Semutachi »

@ethanak
Przykład, który podawałem miał na celu udowodnienie, że da się kompilować programy dla Windowsa na Linuksie. Wybrałem kod z WinAPI ponieważ najbardziej kojarzy się z Windowsem i C++.
Linux Akihabara 2.6.38-bpo.2-amd64 x86_64 GNU/Linux
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Tworzenie programu dla Windows (w c++)

Post autor: ethanak »

E... że co?
Pisałem parę programów pod Windowsa używając wxWidgets choćby z tego powodu, że nie musiałem zajmować się WinAPI. I nie bardzo rozumiem dlaczego przykład z WinAPI miałby być lepszy od takiego samego z wxWidgets. Możesz jakoś rozwinąć tę lepszość? Czy może ja czegoś ważnego nie wiem?
luzakwielki
Wytworny Kaczor
Wytworny Kaczor
Posty: 264
Rejestracja: 19 lis 2008, 11:42
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: Tworzenie programu dla Windows (w c++)

Post autor: luzakwielki »

ethanak pisze:E... że co?
Pisałem parę programów pod Windowsa używając wxWidgets choćby z tego powodu, że nie musiałem zajmować się WinAPI. I nie bardzo rozumiem dlaczego przykład z WinAPI miałby być lepszy od takiego samego z wxWidgets. Możesz jakoś rozwinąć tę lepszość? Czy może ja czegoś ważnego nie wiem?
Dlatego, że to był test czy kompiluje się na Windowsa, a WinAPI jest jak sama nazwa wskazuje Windows Only - wxWidgets jest niezależny od platformy podobnie jak Qt i taka kompilacja niczego by autorowi wątku nie pokazywała (bo kod równie dobrze można skompilować gcc linuksowym i odpalić).
Ogólnie z WinAPI to jest tak jak z Xlib - nikt poważny nie chce tego używać (poza grami, ale tam tworzy się najprostsze okienko, i więcej z WinAPI się nie bawi) i wykorzystuje się MFC/Qt/Wx , ale tu do pokazania, że da się kompilować pod windowsa z linuksa (czyli robić crosskompilację), WinAPI jak najbardziej się nadaje (do wielu więcej rzeczy nie podobnie jak Xlib ;p).
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości