par pitanja:
1. kako detektirat OS na kojem se vrti program
2. ako su windowsi, kako dobit ime trenutnog usera
3. kako dobit path do start menua
par pitanja:
1. kako detektirat OS na kojem se vrti program
2. ako su windowsi, kako dobit ime trenutnog usera
3. kako dobit path do start menua
par pitanja:
1. kako detektirat OS na kojem se vrti program
...Ovisi koji kompajler koristis, svaki ima neke svoje makroe, evo recimo ovdje mozes naci popis preddefiniranih makroa za kompajlere.
EDIT: Za gcc bi islo nekako ovako:
#ifdef _WIN64
// Windows (64-bit)
#elif _WIN32
// Windows (32-bit)
#elif __linux
// Linux
#elif __unix
// Unix
#elif __posix
// POSIX
#endif
par pitanja:
1. kako detektirat OS na kojem se vrti program
Pa to u pravilu ne moraš, jer klasične izvršne datoteke za neki operacijski sustav nisu kompatibilne sa ostalim operacijskim sustavima. Npr. *nix ELF datoteke se ne mogu izvršavati na Windowsima, dok se Windows PE datoteke ne mogu samo tako izvršavati na Linuxu.
Tako da ti runtime provjera u biti i nije potrebna, osim ako te zanima točna verzija operacijskog sustava (npr znaš da si na windowsima ali te zanima je li XP, Sedmica ili neki drugi).
Možeš recimo koristiti uvjetno kompajliranje, tako da se neki kod iskompajlira samo za određene operacijske sustave.
npr GCC kompajler definira razne makroe ovisno o operacijskom sustavu:
#ifdef WIN32
//učini nešto specifično za windows
#endif
#ifdef unix
//učini nešto specifično za unix
#endif
Za detaljno runtime ispitivanje verzija operacijskog sustava trebaš koristiti API dotičnog. Recimo na windowsima bi to bilo pomoću GetVersionEx
treba mi pomoc oko jednog zadatka :::
ovako, treba napisati program u jeziku "C" koji bi provjerio stanje najmanje opterecenoga bita u varijebli X. kada je bit postavljen, postavi drugi najmanje opterecen bit u varijabli Y na 1, inace je 0. promjenjenu varijablu Y zapisi u heksadecimalnom(šestnajstnickom) obliku . X i Y su tipa unsigned int, a Y je na pocetku 0.
pomoc ako moze ................
Koji ti je vrag "najmanje opterećeni" bit? Misliš na najmanje bitan bit (least significant bit)?
ako da onda evo:
#include <stdio.h>
void print_binary(int number)
{
unsigned int n, mask=0x80000000;
for (n=0; n<32; n++)
{
if (number&mask)
printf("1");
else
printf("0");
mask>>=1;
}
}
int main()
{
unsigned int x=1, y=0, n;
printf("X=%d ", x);
print_binary(x);
printf("\n");
if (x&0x00000001u)
y|=0x00000002u;
printf("Y=%d ", y);
print_binary(y);
printf("\n");
getchar();
return 0;
}
To je u biti samo kompliciran način za napraviti slijedeće:
if (x==1)
{
y=2;
}
ma tako mi je covjece prevvelo nije bilo na nasem jeziku ,, al havla
Naišao sam problem s "hakerima" na jednom projektu na kojem radim.
Dakle da pojednostavim stvari imam jedan string recimo
char[32]="www.bug.hr";
i kad ja to skompaliram netko može otvorit moj program u HEX editoru i tamo samo promjeni taj string, program i dalje normalno radi.
Razmišljao sam da u samom kodu držim stringove enkriptirane, ali to mi dosta snižava čitljivost koda. Postoji neki lakši način da exe bude čisti raw, i da mi ljudi ne mjenjaju ono što nebi smijeli?
Spremi negdje hash exe datoteke i provjeravaj ga svaki put kad se aplikacija pokrene. Ukoliko se promjenio znači da je netko mijenjao exe i tad jednostavno izbaci poruku "corrupted file" ili sl. i prekini program. To će spriječiti ljude da petljaju po exe-u. Jasno, nije niti ovo neka posebno dobra zaštita protiv onih koji imaju dosta iskustva, no za većinu "hakera" će biti dosta.
Napravio sam poseban thread koji cijelo vrijeme provjerava hash svih važnijih stringova. No u samom programu ja moram napisat te hashove kolko iznose, a za to sam malo lijen. ima netko ideju za pojednostavit stvari?
if(hash(text)==75) exit(0);
Pozz, zapeo sam na ovom zadatku, trebam u prograu dodati novi vektor imena revVec i u njega pohraniti sadrzaj vec u obrnutom smjeru i ispisati sadrzaj vec revVec, napravio sam ovako ali mi se program odmah zatvori iako sam dodao system("PAUSE") a kod build-a mi pise successful.
#include <iostream>
// predložak tvector - otvoriti za detalje
#include "tvector.h"
using namespace std;
int main()
{
// deklaracija objekta vec kao spremnika tipa tvector
tvector<double> vec;
tvector<double> revVec;
double val;
cout << "Unos proizvoljnog niza brojeva u vektor." << endl;
cout << "Unos zavrsava kada se otkuca neko slovo!" << endl;
// punjenje vektora
while (cin >> val)
{
vec.push_back(val);
}
// nakon završenog unosa računamo sumu i srednju vrijednost
double sum = 0;
for (int i=0; i<vec.size(); i++) {
// pojedinom članu vektora pristupamo slično kao i članu polja
sum += vec[i];
}
double avg =sum /vec.size();
cout <<"Suma od "<<vec.size()
<<" elemenata: "<< sum
<<". Srednja vrijednost: "<< avg << endl;
for(int n=vec.size();n>=0;n--)
{
revVec.push_back(vec[n-1]);
cout<<vec[n-1]<<endl;
}
system("PAUSE");
return 0;
}
Naišao sam problem s "hakerima" na jednom projektu na kojem radim.
Dakle da pojednostavim stvari imam jedan string recimo
char[32]="www.bug.hr";
i kad ja to skompaliram netko može otvorit moj program u HEX editoru i tamo samo promjeni taj string, program i dalje normalno radi.
Razmišljao sam da u samom kodu držim stringove enkriptirane, ali to mi dosta snižava čitljivost koda. Postoji neki lakši način da exe bude čisti raw, i da mi ljudi ne mjenjaju ono što nebi smijeli?
Na žalost ne možeš ograničit program na nešto što ljudi nebi smjeli. Reverse engineering će uvijek biti tvoj neprijatelj ili prijatelj (zavisi na kojoj se strani nalazis :)
Ne moraš nužno enkriptirat stringove, možda će XOR biti dovoljan da netko ne može pronaći tvoj string u HEX editoru, ali ipak sve zavisi koliko je važno tu informaciju sakriti.
Drugo što mi pada na pamet je da sve te stringove enkriptiraš u odvojenoj datoteci. Tako ćeš pri samom startup-u svog progama morat otvorit tu datoteku, dekriptirat stringove i držat ih takve u memoriji.
Što znači "tvector.h" ?
Isprobao sam kod, ali mi tu javlja gresku.
I kolko sam shvatio, tebi je zadatak učitati niz brojeva, i obrnuto ih ispisati? Ako je, mislim da je to najlakše sa stackom.
Poz
pitanje u vezi checkboxova....
tek se mičem od konzolnog programiranja
dakle gledao sam ovaj kid http://www.cplusplus.com/forum/windows/40147/
i nije mi jasno kako napravit dva checkboxa da normalno funkcioniraju, uvijek mi se dogodi da kad jednog stisnem oba se checkiraju
pitanje u vezi checkboxova....
i nije mi jasno kako napravit dva checkboxa da normalno funkcioniraju, uvijek mi se dogodi da kad jednog stisnem oba se checkiraju
Vjerojatno koristiš isti identifier za oba.
Evo ti malo da analiziraš:
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
char szClassName[]="Test window";
HINSTANCE instance;
#define CHECKBOX_1 5000
#define CHECKBOX_2 5001
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
if (!RegisterClassEx(&wincl))
return 0;
instance=hThisInstance;
hwnd=CreateWindowEx(0, szClassName, "Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 150, HWND_DESKTOP, NULL, hThisInstance, NULL);
ShowWindow(hwnd, SW_SHOW);
while (GetMessage(&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
//napravimo dva checkboxa prvi nije automatski, drugi jest
CreateWindow(WC_BUTTON, "Test 1", WS_VISIBLE|WS_CHILD|BS_CHECKBOX, 10, 10, 80, 13, hwnd, (HMENU)CHECKBOX_1, instance, NULL);
CreateWindow(WC_BUTTON, "Test 2", WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX, 10, 40, 80, 13, hwnd, (HMENU)CHECKBOX_2, instance, NULL);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case CHECKBOX_1:
//korisnik je kliknuo na prvi checkbox.
//ovo nije automatski checkbox što znači da sami moramo
//uklanjati i postavljati kvačicu
if (IsDlgButtonChecked(hwnd, CHECKBOX_1)==BST_CHECKED)
CheckDlgButton(hwnd, CHECKBOX_1, BST_UNCHECKED);
else
CheckDlgButton(hwnd, CHECKBOX_1, BST_CHECKED);
break;
case CHECKBOX_2:
//korisnik je kliknuo na drugi checkbox
//ovaj checkbox je automatiziran pa tu ne moramo nišra raditi
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
Već sam uspio nekak skužit kak to radi, no svejedno hvala :D
Jedna stvar što me muči je kako napravit da cijeli window bude u jednoj boji? recimo sada mi je window nekako sivi, a checkboxovi i okolo teksta checkboxa je bijelo.
Dodao sam i neke buttone, no svi su tako kockasti :/ kako da dobim one standardne u windowsima (7)
Mislim da će ti biti lakše sa visual c++/c#.
To ti ima veze s common controls bibliotekom. Trebaš napraviti manifest, i inicijalizirati noviju verziju common controls biblioteke kako bi dobio kontrole sa novim temama.
http://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/
http://stackoverflow.com/questions/4403458/how-do-i-use-the-default-gui-theme-on-windows
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775697%28v=vs.85%29.aspx
btw. manifest može a i ne mora biti embeddan u izvršnu datoteku, ali tada mora imati ime u formatu "imeaplikacije.exe.manifest" i nalaziti se u istom folderu sa izvršnom datotekom.
Ako ćeš ga ipak strpati u izvršnu datoteku onda napraviš resource skriptu u koju staviš slijedeće:
1 RT_MANIFEST "nekimanifest.manifest"
i samo dodaš tu resource skriptu u postojeći projekt.
Evo, navali.
Pozz, da li mi mozete objasniti kod preopterećenja operatora što mi ovo konkretno znači const SimpleCircle& temp, za što mi služi pokazivač this?
Ovo boldano je razlicito za ostale operatore npr << ili == pa me zanima imaju li igdje pravila kako se pise koji?
SimpleCircle& SimpleCircle::operator=(const SimpleCircle& temp) {
m_radius = temp.m_radius;
return *this;
}
const SimpleCircle& temp znači da se sa desne strane operatora = nalazi nekakav objekt tipa SimpleCircle. Npr:
SimpleCircle obj1, obj2;
obj1 = obj2;
Oznaka const služi tome da se taj objekt ne može mijenjati u operatorskoj funkciji = pošto je predan kao referenca. A što se tiče povratne vrijednosti, *this predstavlja trenutni objekt (njegovu vrijednost). Npr. gornji slučaj smo mogli napisati ovako:
obj1.operator = (obj2);
Drugim riječima, objekt obj1 je taj koji poziva operator = pa se kao rezultat operacije = vraća upravo taj isti objekt obj1 tj. *this.
A što se tiče reference kao povratne vrijednosti operatorske funkcije, to se koristi kod ulančavanja operatora. Npr;
SimpleCircle a = b = c = ...
ili kod operatora <<, >> itd..
Hvala, zanima me jos samo zasto je kod ovog boldanog sa lijeve strane c1.x1 a ne s desne napisano x1=c1.tempX1 tj. mislio sam da se ne moze pisati c1 sa lijeve strane ?
istream& operator >> (istream& s, Pravokutnik& c1)
{
int tempX1, tempY1, tempX2, tempY2;
if( s>>tempX1>>tempY1>>tempX2>>tempY2)
{
c1.x1=tempX1;
c1.y1=tempY1;
c1.x2=tempX2;
c1.y2=tempY2;
}
return s;
}
U ovom slučaju riječ je o operatoru >> koji treba nešto učitati (spremiti) u varijablu. Npr:
Pravokutnik p;
cin >> p; //unos spremi u varijablu p
Stoga se poziva operatorska funkcija >> kojoj se predaje ta varijabla tj.
cin.operator >> (p); // cin >> p
Zato argument nije tipa const, već mora biti bez toga da bi se u njega moglo pisati. S druge strane operator za čitanje bi izgledao ovako:
ostream& operator << (ostream& izlaz, const Pravokutnik& p);
moze pomoc??
imam kod za zbrajanje neparnih cijelih brojeva do 20..ali mi nije bas najjasnije dal on zbraja parne ili neparne brojeve
#include<iostream>
using namespace std;
int main()
{
int sum=0;
for( int counter=0; counter<=20; counter++ )
{
if((counter%2)==0) continue ; //uvjet za parne brojeve???
sum+=counter;
}
cout<<sum;
system("PAUSE");
return 0;
}
hvala :D
Ovaj continue ti ne treba tu, taj tvoj program ti racuna sumu parnih brojeva dok ako promjenis u iz == u != racuna sumu neparnih brojeva.
ponudena su mi 4 koda...umjesto continua, mi je ponuden isti kod ali sa break...ali mi ne vrti counter kad stavim break..ali taj dio koda di mi je ==0 mora ostati isti...
{
int counter, sum;
for(counter=1; sum=0; counter<=20)
{
if((counter%2)==0) break;
sum+=counter;
counter++;
}
ili ovako
{
int counter, sum;
for(counter=0; sum=0; counter<20)
{
counter++;
if((counter%2)==0) break;
sum+=counter;
}
Sorri tocan je kod koji si prvi postao i on ti daje sumu neparnih brojeva jer kada program naleti na continue ako je zadovoljen uvijet coutner%2==0 preskače se tj. taj broj se nece uracunati u sumu probaj izvrstiti program sa pritiskom tipke F10 i izvrsavati korak po korak da ti bude jasnije.
sad razumijem, nije mi bila bas jasna uloga contionua...sad mi ima smisla..hvala ti...:D
Kako da u MFC-u napravim da lijevim klikom miša zapamtim kordinate i drugim klikom miša zapamti koordinate te da mi se između te dvije koordinate nacrta linija, ja ovdje imam kod gdje se crta linija u dijagonali.
Zanima me kako da klikom miša zapamtim koordinate? Nisam bas nasao primjera za ovo moje pa ako mi mozete pomoci da ovo rijesim dati neke upute, hvala.
void CFesbView::OnDraw(CDC* pDC)
{
CFesbDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//ispisi text
pDC->SetTextColor(m_txtColor);
pDC->TextOut(pDoc->m_pos.x,pDoc->m_pos.y,pDoc->m_text);
//nacrtaj liniju dijagonalno preko cijelog prikaza
CRect r;
GetClientRect(&r);
CPen pen;
pen.CreatePen(PS_SOLID,1,m_penColor);
CPen *oldpen= pDC->SelectObject(&pen);
pDC->MoveTo(r.left,r.bottom);
pDC->LineTo(r.right,r.top);
pDC->SelectObject(oldpen); // vrati staro stanje
}
Ne sjećam se baš previše dobro MFC-a ali za dobivanje koordinata miša možeš koristiti POINT strukturu:
POINT coord;
GetCursorPos(&coord);
i sad koordinate dohvatiš preko članica x i y (coord.x i coord.y).
Kada stavim x i y javi mi da x i y trebaju imati tip klase pa me zanima gdje ih postavljam kao objekte i šta da dodam za klik miša kod ovog koda dolje?
void CFesbView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
}
Nemam instaliran VS pa ti nažalost ne mogu detaljnije pomoći. Googlaj malo glede POINT strukture pa će ti već nešto izaći.
Tak sam se napalila na CreateWindowEx();
Već sam sve lijepo složio, jedno 10 gumbiča, par progress bara, checkboxovi, textboxovi, ... čak se i disejblaju gumbi kad ih nema smisla stiskat... :D
Dakle par pitanja... :D
1. Kako najjednostavnije dodat background sliku?
negdje sam iskopao ovaj kod:
HBITMAP logoImage;
logoImage = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_LOGO), IMAGE_BITMAP, 59, 65, LR_DEFAULTCOLOR);
logo = CreateWindow(WC_STATIC, NULL, SS_BITMAP | WS_CHILD | WS_VISIBLE, 300, 100, 200, 100, hwnd, NULL, NULL, NULL);
SendMessage(logo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)logoImage);
no baš me i ne sluša.... kompajliranje ide,, ali nema slike
2. Kako mijenjat ime labele? (mogu sada napravit jedan window preko toga, no to i nije baš kak bi se trebalo... :D )
3. Kako mijenjat ime gumba? (pretpostavljam slično kao i za labele, samo što nemogu nigdje na netu to iskopat)
Presretan sam :D