WinMain重新定义

时间:2013-01-20 19:35:16

标签: c++ winapi

我刚刚开始使用C ++,我遇到了一个我无法解决的错误。

到目前为止,这是我的所有代码(甚至无法让hello world工作):

#include "stdafx.h"
#include <windows.h>


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
               LPSTR lpCmdLine, int nCmdShow)
{
                   MessageBox(NULL, L"Hello World!",
                       L"Hello World!",
                       MB_ICONEXCLAMATION | MB_OK);
                   return 0;
}

但是当我尝试运行它时会出现此错误:

  

Test.cpp(11):错误C2373:'WinMain':重新定义;不同类型的修饰符            C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ include \ winbase.h(2588):参见'WinMain'的声明

当我查看WinMain的声明时,我发现在每个参数之前都有一个“__in”。我尝试添加,但没有运气。我也尝试用CALLBACK替换WINAPI,但这也不起作用。

2 个答案:

答案 0 :(得分:4)

简单的解决方案是

使用标准main功能

像这样:

#undef UNICODE
#define UNICODE
#incude <windows.h>

int main()
{
    MessageBox(
        0,
        L"Hello World!",
        L"Hello World!",
        MB_ICONEXCLAMATION | MB_SETFOREGROUND
        );
}

现在你唯一的问题是使用微软的工具集将它构建为GUI子系统应用程序,这在这方面有点迟钝(GNU工具链没有这样的问题)。

为此,使用Microsoft的link,使用此链接器选项(除了选择GUI子系统):/entry:mainCRTStartup

请注意,您可以将该选项放在名为LINK的环境变量中。

快乐的编码! : - )

答案 1 :(得分:1)

WinMain是一个C函数,因此需要用extern "C"

包装它
#include "stdafx.h"
#include <windows.h>

extern "C"
{

    int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
               LPSTR lpCmdLine, int nCmdShow)
    {
                   MessageBox(NULL, L"Hello World!",
                       L"Hello World!",
                       MB_ICONEXCLAMATION | MB_OK);
                   return 0;
    }
}