Переопределение ошибки WinMain в примере OpenGL
Я пытаюсь связаться с OpenGL с этим примером:
#include <windows.h>
#include <GL/GL.h>
#pragma comment (lib, "opengl32.lib")
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
MSG msg = {0};
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
wc.lpszClassName = L"oglversionchecksample";
wc.style = CS_OWNDC;
if( !RegisterClass(&wc) )
return 1;
CreateWindowW(wc.lpszClassName,L"openglversioncheck",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,640,480,0,0,hInstance,0);
while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
DispatchMessage( &msg );
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
{
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags
PFD_TYPE_RGBA, //The kind of framebuffer. RGBA or palette.
32, //Colordepth of the framebuffer.
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
24, //Number of bits for the depthbuffer
8, //Number of bits for the stencilbuffer
0, //Number of Aux buffers in the framebuffer.
PFD_MAIN_PLANE,
0,
0, 0, 0
};
HDC ourWindowHandleToDeviceContext = GetDC(hWnd);
int letWindowsChooseThisPixelFormat;
letWindowsChooseThisPixelFormat = ChoosePixelFormat(ourWindowHandleToDeviceContext, &pfd);
SetPixelFormat(ourWindowHandleToDeviceContext,letWindowsChooseThisPixelFormat, &pfd);
HGLRC ourOpenGLRenderingContext = wglCreateContext(ourWindowHandleToDeviceContext);
wglMakeCurrent (ourWindowHandleToDeviceContext, ourOpenGLRenderingContext);
MessageBoxA(0,(char*)glGetString(GL_VERSION), "OPENGL VERSION",0);
wglDeleteContext(ourOpenGLRenderingContext);
PostQuitMessage(0);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Я использую последнюю версию Code::Blocks (v13.12) с MinGW-TDM-GCC-4.8.1
В настройках компоновщика я связался с libopengl32.a и использовал windows.h и GL-заголовки из дистрибутива MinGW.
Однако я получаю эту ошибку:
main.cpp|4|warning: ignoring #pragma comment [-Wunknown-pragmas]|
main.cpp|8|error: 'int WinMain' redeclared as different kind of symbol|
codeblocks\mingw\include\winbase.h|1251|error: previous declaration of 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)'|
main.cpp|8|error: '__in' was not declared in this scope|
main.cpp|8|error: '__in_opt' was not declared in this scope|
main.cpp|8|error: '__in_opt' was not declared in this scope|
main.cpp|8|error: '__in' was not declared in this scope|
Я что-то пропустил? Или этот пример работает только при использовании Visual Studio (как выглядит прагма)?
РЕДАКТИРОВАТЬ
Я вырезал все (без opengl) и получил только заголовок win и WinMain с той же ошибкой.
Затем я заменил WinMain стандартным main ( см. Здесь)
int main()
{
HINSTANCE hInstance = GetModuleHandle( NULL );
HINSTANCE hPrevInstance = 0;
LPSTR lpCmdLine = NULL;
int nShowCmd = 0;
...same as before
return 0;
}
И он скомпилирован без ошибок после того, как я также связался с libgdi32.a, однако тогда он показывает только пустую команду Promt.
РЕДАКТИРОВАТЬ 2
Я убрал широкие струны (L""
а также CreateWindowW
в CreateWindow
) и теперь это работает..
1 ответ
Я думаю, что Mingw не любит все конкретные вещи MSVC, удалите #pragma comment
и все __in
и т. д. Я думаю, что так как mingw не может разрешить те, которые не могут соответствовать WinMain
с определением это имеет и терпит неудачу. В основном переписать начало этого:
#include <windows.h>
#include <GL/GL.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)