How do I set WinMain as entry point?
Asked Answered
K

3

8

I've deleted the _tmain() method which the IDE generated because I find no sense having two entry points after adding my WinMainentry. And yes, this is my first ever C++ application and I am a newbie, but please be nice.

So that's all I got:

// Included headers:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
// Shortened namespaces:
using namespace std;
// The main entry of the application:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    MessageBox( NULL, L"Hello World!", L"Just another Hello World program!", MB_ICONEXCLAMATION | MB_OK );
    return 0;
}
// End of file.

When I try to build and run I get this error:

error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

error LNK1120: 1 unresolved externals

I realise the entry point is missing, But where can I set WinMain as the entry point? I just took a look in the properties of the project itself and found nothing. Note that I've started the project as a console application, But now I am trying to turn it into a regualr windows application.

Thanks.

Kynewulf answered 25/4, 2014 at 0:30 Comment(7)
How can you "see no sense" when you've never done this before ? The answer is, by the way, you can't -- because that would make no sense :)Rocketeer
What compiler and IDE are you using?Upstanding
@BenjaminLindley, I am using VS2013.Kynewulf
IIRC, WinMain isn't the actual entry point from the operating system's point of view. It's called by the runtime environment (or RT, as in CRT), which needs to be initialized (or started up, as in Startup). So, yeah, that _tmain is there for a reason. It's the actual entry point. WinMain is only an entry point 'by convention'.Tensile
The simplest way to get all the settings correct is by using the Win32 Project template instead of the Win32 Console Application template. Next best thing after you got started wrong is Project + Properties, Linker, System, change the SubSystem setting to "Windows".Euthanasia
@Rhymoid, Okay, I brought back the _tmain method and everything works fine, But I really have no idea where from to get the parameters for WinMain, So I just call it from _tmain with NULLs. Is that really supposed to be like that?Kynewulf
I guess I misunderstood what you misunderstood. Like the others are saying, use the proper template and you'll be fine.Tensile
U
17

You need to change the subsystem to Windows.

enter image description here

Upstanding answered 25/4, 2014 at 0:52 Comment(0)
C
1

Project->Properties->Linker->System change Subsystem to /SUBSYSTEM:WINDOWS

If you have further trouble with it then start all over again, selecting Win32 Project instead of Win32 Console.

Chuff answered 25/4, 2014 at 0:52 Comment(0)
A
0

It sounds you are trying to build a console application with code that you imported from a windows application.

Console applications use a main (or _tmain) entry point, whereas windows applications use a WinMain (or _tWinMain) entry point.

Edit: Indeed changing the linker option as Benjamin told you will solve your immediate problem but you are likely to meet other issues later with such hybrid projects. For example you may include some code relying on the _CONSOLE preprocessor symbol. You can of course adjust this latter setting yourself too but better restart from a clean win32 template as Scott and Hans suggested.

Acropetal answered 25/4, 2014 at 0:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.