VS2013: Aufruf von Win32 API calls bringen Compilerfehler
-
Hallo,
meine Versuche, ZeroMemory und InitCommonControls zu benutzen scheitern ledier immer mit Compilerfehler und ich komme selbst mit Google nicht wirkiich weiter.ZeroMemory(tbb, sizeof(tbb)); Debug Win32: ------------ Fehler 1 error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen? i:\projects\visual c++\Win32_Test\winbase\main.c 466 1 winbase Release Win32: -------------- Fehler 1 error LNK2001: Nicht aufgelöstes externes Symbol "_memset". i:\Projects\Visual C++\Win32_Test\winbase\main.obj winbase Fehler 2 error LNK1120: 1 nicht aufgelöste Externe I:\Projects\Visual C++\Win32_Test\Release\winbase.exe 1 1 winbase
INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrls.dwICC = ICC_STANDARD_CLASSES; BOOL bInit = InitCommonControlsEx(&InitCtrls); Debug Win32: ------------ Fehler 1 error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen? i:\projects\visual c++\Win32_Test\winbase\main.c 498 1 winbase Release Win32: -------------- Fehler 1 error LNK2001: Nicht aufgelöstes externes Symbol "__imp__InitCommonControlsEx@4". i:\Projects\Visual C++\Win32_Test\winbase\main.obj winbase Fehler 2 error LNK1120: 1 nicht aufgelöste Externe I:\Projects\Visual C++\Win32_Test\Release\winbase.exe 1 1 winbase
INFO:
Füge ich, wie in der Fehlermeldung genannt, folgende Zeilezum Projekt, so scheiter auch hier der Compiliervorgang.include "stdafx.h" Debug Win32: ------------ Fehler 1 error C1083: Datei (vorkompilierte Headerdatei) kann nicht geöffnet werden: "Debug\winbase.pch": No such file or directory i:\projects\visual c++\Win32_Test\winbase\main.c 8 1 winbase 2 IntelliSense: Die Datei "Quelle" kann nicht geöffnet werden: "stdafx.h". i:\Projects\Visual C++\Win32_Test\winbase\main.c 8 1 winbase Release Win32: -------------- Fehler 1 error C1083: Datei (Include) kann nicht geöffnet werden: "stdafx.h": No such file or directory i:\Projects\Visual C++\Win32_Test\winbase\main.c 8 1 winbase 2 IntelliSense: Die Datei "Quelle" kann nicht geöffnet werden: "stdafx.h". i:\Projects\Visual C++\Win32_Test\winbase\main.c 8 1 winbase
Hat evtl jemand eine Idee, wie ich diese und evtl. Zukünftige API Call Probleme beheben kann bzw worauf ich zu achten habe? Vielen Dank!
PS: Ich verwende VS2013 Express und habe das Win7 Platform SDK installiert.
-
Stelle die Verwendung des Vorkompilierten Headers ab, vielleicht hilft das was.
Unter Projekt->"Dein Projekt Name" Eigenschaften->Konfigurationseigenschaften->C/C++->Vorkompilierter Header
Und dann "Vorkompilierten Header nicht verwenden" auswählenfloorball
-
@floorball:
Habe gerade mal die von Dir genannten Einstellungen geprüft. Diese sind bereits exakt so eingestellt, wie von dir vorgeschlagen. Problem ist daher leider noch nicht gelöst.@all:
Evtl. jemand eine Idee, woran es liegen könnte und wie ich dieses Problem beheben kann? Vielen Dank!
-
Kann es evt. daraan liegen, dass ich die Visual Studio 2013 Express Version anstatt z.b. die Pro Version verwende?
Habe gerade ein Testprojekt aus dem Netz compilieren wollen, bei dem immer folgender kommt:
Fehler 1 error RC1015: cannot open include file 'afxres.h'. i:\Projects\Visual C++\DirList\dirlist.rc 10 1 dirlist
Nachtrag:
---------
Bzgl der Datei afxres.h habe ich nun etwas per Google gefunden. Dieses scheint eine Headerdatei für MFC zu sein, welches die Express Version nicht bietet. Habe die Resource-Datei afxres.h durch windows.h ersetzt und ein IDC verändert. Kann das Beispeil nun kompilieren.Jedoch habe ich für mein eigenetliches Posting noch immer keine Lösung gefunden und erhalten anch wie vor bei dem Testprojekt Kompilierungsfehler
-
Erstelle am besten noch mal ein neues (leeres) Projekt und deaktiviere dann dabei die vorkompilierten Header.
Und dann füge deine bisherigen Source-Dateien dem Projekt hinzu und lass es dann noch mal kompilieren.
-
@Th69:
Projekt neu angelegt und Source per copy/paste eingegefügt. Mehrere Projekteinstellungen abgeändert/angepasst. Leider genau wie beim alten Projekt, das gleiche Problem, sobald ich die entsprechenden Win32 API Befehle benutzen will.
-
Die Vorkompilierten Header für jede *.cpp oder .c Datei ausschalten und "stdafx.h" auch raus nehmen. Dass memset nicht erkannt wird, liegt wohl daran dass die CRT nicht verlinkt ist. Dann solltest du in deinen .c Dateien auch irgendwo sowas drinne stehen haben:
#include <windows.h>
#include <commctrl.h>und dann noch auf die "comctl32.lib" linken.
-
@kentucky chicken:
Ich habe in allen Einstellungen, "stdafx.h" entfernt. Aktuell besteht mein Projekt nur aus einer einzigen *.c Datei.Folgende Includes und Pragmas sind bereits vorhanden:
#include <windows.h> #include <commctrl.h> #pragma comment(lib, "comctl32.lib")
Dennoch bekomme ich jedesmal diese blöden Compilerfehler.
-
va!n schrieb:
Ich habe in allen Einstellungen, "stdafx.h" entfernt. Aktuell besteht mein Projekt nur aus einer einzigen *.c Datei.
Wenn der vorkompilierte Header deaktiviert ist würde er sich ja wohl nicht beschweren dass er ihn nicht findet, oder ?
Irgendwas ist definitiv falsch eingestellt. Kannst du irgendwo mal ein Minimalprojekt wo der Fehler auftritt hochladen ?
Dann könnte man denk ich relativ schnell sagen wo das Problem ist.
-
Der Vorkomplierte Header kann an 2 Stellen ein- und ausgeschaltet werden. Einmal rechte Maustaste Eigenschaften vom Projekt und einmal rechte Maustaste Eigenschaften von der *.c Datei. Sind beide ausgeschaltet?
-
Hallo zusammen,
ich habe in letzter Zeit einiges versucht, jedoch bekomme ich den Fehler leider einfach nicht behoben. Ich habe ein Projekt Template (VS2013 Express / Win32 API) als ZIP zusammengepackt. (Bei diesem kleinen Projekt, bereitet z.B. schon direkt am Anfang "ZeroMemory()" Compilerfehler. Gleiche Problem auch bei anderen API Calls, wie z.B. InitCommonControlsEx()
[url=http://www.secretly.de/public/Win32 - My Empty Template.zip]Mein VS2013 Win32 Project Template (12k ZIP)[/url]
-
Ich vermute mal Du hast Dir Code aus dem Internet kopiert und dieser Code verwendet MFC. MFC ist nicht in der Express Version enthalten, sondern nur ab der Pro Version.
Am besten ist, Du suchst dir ein Tutorial ohne MFC und fängst klein auf zu programmieren. Wenn Du schon Anfangs etwas riesiges machen willst, wird das auf Anhieb fehlschlagen.Hier ein Link zur MSDN: http://msdn.microsoft.com/en-s/library/windows/desktop/ff818516(v=vs.85).aspx
Dort gibt es auch zahlreiche Samples und es ist alles dokumentiert.
-
@Hi:
Wie Du dem Project (siehe Download-Link) entnehmen kannst, ist es ein reines Win32 Projekt und die API Befehle, bei denen der Compiler meckert, sind bekannte Win32 API Befehle - also nichts mit MFC.
-
Also ich bekomme da gar keine Compiler-Fehler. Kann es sein, dass bei der Installation von Visual Studio oder der Windows SDK Fehler aufgetreten sind?
Ich könnte mir korrupte Header vorstellen. Ein Versuchs alles neuzuinstallieren wäre es auf jeden Fall Wert.
-
@Hi:
Du kannst das ganze ohne Fehler Compilieren - auch wenn Du folgende Zeile im Code aktivierst?ZeroMemory(&wcex,sizeof(WNDCLASSEX));
-
Nein, dann nicht, aber es wird wohl daran liegen, dass du
WinMainCRTStartup
als Entry-Point benutzt.
Unter anderem Funktioniert dieser Code erst gar nicht bei einem neuen Win32-Projekt.
Ich hab jetzt nicht alle Möglichkeiten durchgeschaut, aber muss Dein Entry-Point unbedingWinMainCRTStartup
sein? Hast Du da etwas spezielles vor?
Ansonsten verwendet man dieWinMain()
als Entry Point.
-
@Hi:
Vielen Dank für die Info! Ich habe den EntryPoint und /NODEFAULTLIB unter den Settings geändert.alt: int WinMainCRTStartup() neu: int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
Ich kann den Source jetzt ohne Fehler kompilieren! Die WIN32 Funktion ZeroMemory() ist zwar im executeable als "memset" wiederzufinden - warum auch immer... Aber zumindest scheint es zu funktionieren! Vielen Dank!
-
ZeroMemory ist ja auch nur ein (indirektes) Makro für memset (s. Community Beiträge / ZeroMemory Definition).
-
Ich verstehe den ZeroMemory-Wahn der Windows-Programmierer nicht.
WNDCLASSEX wcex = {};
macht das selbe, und ist mMn. viel eleganter. Und auf jeden Fall kürzer.
-
va!n schrieb:
[url]http://www.secretly.de/public/Win32 - My Empty Template.zip[/url]
Hab mir das Projekt mal angesehen. Das Projekt verhält sich komisch. Der Code scheint als C-Code kompiliert zu werden. Das Ändern der Endung auf cpp hat das Problem nicht gelöst.
Der Code läuft in neu angelegtem (leeren) Projekt ohne Probleme nachdem die Änderung
// int WinMainCRTStartup() int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
eingebaut ist.
Und sinnvoll wäre zudem eventuell
// g_hInst = GetModuleHandle(0); // Seems to return always 0x40000 !? g_hInst = hThisInstance;
Nach ZeroMemory() kann man sich das Zuweisen von 0 auch sparen.