2012-08-05 38 views
6

He estado tratando de obtener Glew y opengl 3.2 trabajando con bloques de código (minGW) en un contexto win32. encontré un buen pequeño tutorial hereno se puede convertir 'LPCWSTR {aka const wchar_t *}' a 'LPCSTR {aka const char *}

Como había estado tratando de averiguar si la compilación de glew en bloques de código era realmente posible, quería probar la fuente antes de hacer el tutorial para ver si funcionaba.

después de ajustar un poco el código Intenté compilar y obtuve varios errores que nunca antes había visto. que son los siguientes

|In function 'bool createWindow(LPCWSTR, int, int)':| 
|73|error: cannot convert 'LPCWSTR {aka const wchar_t*}' to 'LPCSTR {aka const char*}' in assignment| 
|80|error: cannot convert 'LPCWSTR {aka const wchar_t*}' to 'LPCSTR {aka const char*}' for argument '2' to 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'| 
|In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':| 
|105|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]| 
|110|error: '_TRUNCATE' was not declared in this scope| 
|110|error: 'mbstowcs_s' was not declared in this scope| 

Mi código es

include <iostream> 
#include <Windows.h> 

#ifndef GLEW_STATIC 
#define GLEW_STATIC 
#endif //GLEW_STATIC 



#include <GL/glew.h> 
#include <GL/wglew.h> 

//using namespace std; 
// 
//int main() 
//{ 
// cout << "Hello world!" << endl; 
// return 0; 
//} 


#include "opengl_3.h" 

OpenGLContext openglContext; // Our OpenGL Context class 

bool running = true; // Whether or not the application is currently running 

HINSTANCE hInstance; // The HINSTANCE of this application 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Standard window callback 

/** 
    WndProc is a standard method used in Win32 programming for handling Window messages. Here we 
    handle our window resizing and tell our OpenGLContext the new window size. 
*/ 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    switch (message) { 
     case WM_SIZE: // If our window is resizing 
     { 
      openglContext.reshapeWindow(LOWORD(lParam), HIWORD(lParam)); // Send the new window size to our OpenGLContext 
      break; 
     } 

     case WM_DESTROY: 
     { 
      PostQuitMessage(0); 
      break; 
     } 
    } 

    return DefWindowProc(hWnd, message, wParam, lParam); 
} 

/** 
    createWindow is going to create our window using Windows API calls. It is then going to 
    create our OpenGL context on the window and then show our window, making it visible. 
*/ 
bool createWindow(LPCWSTR title, int width, int height) { 
    WNDCLASS windowClass; 
    HWND hWnd; 
    DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; 

    hInstance = GetModuleHandle(NULL); 

    windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 
    windowClass.lpfnWndProc = (WNDPROC) WndProc; 
    windowClass.cbClsExtra = 0; 
    windowClass.cbWndExtra = 0; 
    windowClass.hInstance = hInstance; 
    windowClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); 
    windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    windowClass.hbrBackground = NULL; 
    windowClass.lpszMenuName = NULL; 
    windowClass.lpszClassName = title; 

    if (!RegisterClass(&windowClass)) { 
     return false; 
    } 

    hWnd = CreateWindowEx(dwExStyle, title, title, WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 0, width, height, NULL, NULL, hInstance, NULL); 

    openglContext.create30Context(hWnd); // Create our OpenGL context on the given window we just created 

    ShowWindow(hWnd, SW_SHOW); 
    UpdateWindow(hWnd); 

    return true; 
} 

/** 
    WinMain is the main entry point for Windows based applications as opposed to 'main' for console 
    applications. Here we will make the calls to create our window, setup our scene and then 
    perform our 'infinite' loop which processes messages and renders. 
*/ 
int WINAPI WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, 
        int  nCmdShow) { 
    MSG msg; 

    /** 
     The following 6 lines of code do conversion between char arrays and LPCWSTR variables 
     which are used in the Windows API. 
    */ 
    char *orig = "OpenGL 3 Project"; // Our windows title 
    size_t origsize = strlen(orig) + 1; 
    const size_t newsize = 100; 
    size_t convertedChars = 0; 
    wchar_t wcstring[newsize]; 
    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE); 

    createWindow(wcstring, 500, 500); // Create our OpenGL window 

    openglContext.setupScene(); // Setup our OpenGL scene 

    /** 
     This is our main loop, it continues for as long as running is true 
    */ 
    while (running) 
    { 
     if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // If we have a message to process, process it 
      if (msg.message == WM_QUIT) { 
       running = false; // Set running to false if we have a message to quit 
      } 
      else { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 
     else { // If we don't have a message to process 
      openglContext.renderScene(); // Render our scene (which also handles swapping of buffers) 
     } 
    } 

    return (int) msg.wParam; 
} 

(Perdón por el muro de texto) también hay otros archivos, pero todos los errores parecen ser de aquí. publicar el resto si es necesario.

Realmente no he visto ningún error similar a este, así que busqué en Google y descubrí que el error fue causado por el hecho de que el compilador no estaba configurado en bytes múltiples (una configuración en VS2010). Hice algunos mirando alrededor y no pude encontrar ninguna de esas configuraciones en los bloques de código. ¿este código solo se puede usar en VS o me he perdido algo? Me preocupa que pueda tener algo que ver con mi vinculación debido a que tengo muchos problemas con esto en el pasado. Cualquier ayuda sería apreciada.

Respuesta

8

Cambie CreateWindowEx a CreateWindowExW o defina la macro UNICODE antes de incluir cualquier encabezado.

+0

Hola gracias por la ayuda parece haber hecho el truco. estoy recibiendo otro error aunque "mbstowcs_s (& convertChars, wcstring, origsize, orig, _TRUNCATE);" ¿Sería esto una llamada a una función de Windows? dice que no está declarado. –

+1

@IPhantasmI: Hasta donde yo sé, 'mbstowcs_s' es específico de VC++. Con MinGW, simplemente use ['std :: mbstowcs'] (http://en.cppreference.com/w/cpp/string/multibyte/mbstowcs) en su lugar. – ildjarn

+0

¿Las variables de entrada necesitarían cambios? Estoy adivinando así que estoy recibiendo muchos errores simplemente reemplazando la llamada de función a lo que sugirió. No tengo mucha experiencia con la API de Windows, así que no estoy seguro exactamente de cómo está logrando la conversión variable. –

2

Nunca he usado minGW, así que tómalo con un granito de arena. (VS Express es de uso gratuito, BTW.)

La decisión Unicode/Ascii está controlada en gran medida por UNICODE define. Entonces, si define # UNICODE 1, o posiblemente lo transfiere a su línea de comandos de compilación, hay una buena posibilidad de que resuelva su problema.

+0

ty para la ayuda parece haber sido el problema. –

Cuestiones relacionadas