[Qt]Błąd mainwindow.obj, manifest i Character Set


(Kamilmlody5) #1

Witam.

Otóż kompilując program w QT Creator, wywala mi błąd mainwindow.obj.

int rejestruj()

{

        CHAR wartosc[]="%programfiles\\COSS\\COSS.EXE"; //łańcuch znaków z zapisywana wartością w kluczu

        RECT rect;

        GetWindowRect(NULL,&rect);

        RegCreateKeyExA(

                        HKEY_LOCAL_MACHINE,//Main Registry Root

                        "Software\\Microsoft\\Windows\\CurrentVersion\\Run",//Sub

                        0,//Reserved

                        0,//class

                        REG_OPTION_NON_VOLATILE,

                        KEY_ALL_ACCESS,

                        NULL,

                        &hParent,

                        &Dis);

        RegSetValueExA(hParent,"Module",0,REG_SZ,(LPBYTE)wartosc,sizeof(wartosc));

                RegCloseKey(hParent);

        return 0;

}

Błąd:

mainwindow.obj:-1: błąd:LNK2019: unresolved external symbol __imp__ GetWindowRect@8 referenced in function "int __cdecl rejestruj(void)" (?rejestruj@@YAHXZ)

Pytanie drugie: W Visual Studio, jeżeli chciałem zamienić z Unicode Character Set na Multibyte Character Set, wystarczyło tylko wejść w opcje projektu. W QT Creator nie doszukałem się takiej opcji. Po szperaniu w google, podobno nie ma takiej opcji(qmake interpretuje tylko unicode).

Pytanie trzecie: Jak dodać manifest do projektu w QT Creator?


(Razi) #2
  1. Nie zlinkowałeś do jakiejś zewnętrznej biblioteki. Jakim kompilatorem kompilujesz? Visual C++?

  2. Kodowanie. UTF-8 jest optymalny i uniwersalny.

Manifest potrzebny ci do czego? Pliki .rc dodajesz poprzez win32:RC_FILE += plik.rc


(Kamilmlody5) #3

Kompiluje w QT Creator(MSVC2008). Gdy wpisze kod w Visual'u to kompiluje się wszystko elegancko i działa, natomiast ten sam kod w QT Creator wywala błąd jaki napisalem powyżej.

Manifest jest mi potrzebny do ustalenia, aby program był uruchamiany jako administrator :wink:. No chyba że poda mi ktoś jakąś funkcje Qt, która zrobi to za mnie, bez szperania w manifestach.


(Razi) #4

Bo to nie kod jest winny, tylko użyte funkcje w porównaniu do opcji kompilacji. Nie linkujesz odpowiednich bibliotek. Z tego co znalazłem (dla zapytania "qt windows api linking"):

http://stackoverflow.com/questions/2676 ... in32-mingw


(Kamilmlody5) #5

Program się kompiluje :slight_smile:

A masz może sposób Qt-owski na otwieranie aplikacji automatycznie jako admin? Bo domyślam się, że manifesty nie są bardzo chętne na edytowanie w QT :wink:


(Razi) #6

Qt jest bibliotek przenośną i raczej nie ma w niej za wiele funkcji dla konkretnych systemów, jest tylko tyle ile jest potrzebne.

W przypadku linuksa po prostu uruchamia się program przez sudo(user który nie wie co to jest, powinien nie włączać takich programów), w przypadku windowsa po prostu uruchomić jako administrator, system chyba nie pozwoli wykonać operacji bez praw.

Przez komendę nie wiem jak to można zrobić, bo w przypadku linuksa można po prostu na samym początku maina sprawdzić czy ma prawa i jeśli nie ma, to po prostu przez funkcję system odpalić ten program poprzedzając np. gksu (graficzny "loger" sudo), na windowsie nie wiem czy tak by się dało.


(Kamilmlody5) #7

No właśnie sam napisałem taką funkcję, że jeżeli nie ma dostępu do jakiegoś tam pliku systemowego to ma wyskakiwać komunikat o błędzie i zakończyć program. Lecz ja nie chcę, aby tak to działało. Zapragnołem sobie, aby program wymuszał uruchomienie z prawami admina ;p. Gdy googlowałem jedyną odpowiedzią, którą sprawdziłem i działa jest edycja manifestu. I znowu w Visual Studio edycja takiego czegoś to pestka, ale w Qt to chyba coś trudniejszego. Zresztą sam siedzę w Qt dopiero gdzieś od tygodnia :wink: