Kompatibilitätsfrage, von WinXp geschrieben Programmen auf Win98 laufen nicht richtig,wieso???



  • hi,
    ich habe hier zu hause am rechner ein paar spielchen und andere anwendungen geschrieben und wollte diese meien info lehrer zeigen da der aber nur win98 auf dem rechner hat in der schule sind zB. die opengl anwendungen nicht korrekt dargestellt oder tasten funktionieren nicht.... was kann ich daran aendern? ne linker einstellung aendern oder waS???
    fuer hilfe waer ich dankbar.



  • WOOOOW! Es gibt außer mir noch Leute, die Win98 nutzen. 😮 😮 😮 Und sogar Lehrer.

    Zu Deinem Problem- ich habe nämlich das gleiche: Das hängt vom Compiler ab. VC2005 ist auf XP-Programme voreingestellt. (Ich habe schon im Forum gefragt, wie man das ändern könnte, aber keine Antwort bekommen.) Die laufen unter '98 nicht, weil schon die Datenbreite für Zeiger oder verschiedene Variablentypen unterschiedlich ist.

    Im Zweifelsfall nimmst Du erstmal einen älteren Compiler.

    Dann gibt es meistens noch Probleme mit der UNICODE-Definierung und den zugehörigen anderen Typenbezeichnern im Quellcode (z. B. TCHAR statt einfach nur char o.ä.).

    Poste mal ein Quellcode- Beispiel, dann läßt es sich vielleicht einfacher erklären



  • hmmm... naja.. denn ganzen code ok... also ich soll den code so erweitern das der lehrer den unteren klassen an hand von simplen beispielen von geometrischen formen wie, kegeln, quader ect. den das veranschaulichen will aus diesem grund wollte ich des per openGL machen... das ja nun leider net so auf `98 läuft... der code erst mal...

    //---------------------------------------------------------------------------
    
    #include <windows.h>
    #include <GL\gl.h>
    #include <GL\glu.h>
    #include <GL\glaux.h>
    #include <conio.h >
    #include "open.h"
    
    const char szAppName[] = "OpenGL";
    
    bool fullscreen = false;
    bool active = true;
    bool keys[256];
    bool shot = false;
    
    void ReSizeGL( GLsizei width, GLsizei height );
    void KillGL();
    void DrawFighter( float&, float& );
    void LoadTexture();
    
    int InitGL();
    int DrawGL();
    int Shoots( float &xPos, float &yPos );
    
    unsigned int texture[2];
    
    bool CreateGL( const char *title, int width, int height, int bits, bool mode );
    
    HINSTANCE hInstance;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;
    
    bool CALLBACK Dialog1Proc( HWND, UINT, WPARAM, LPARAM );
    LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM );
    
    struct object {
    
        float cx, cy;   // momentane posi
        float mx, my;   //
    };
    
    struct object player;
    
    WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
                    int nCmdShow ) {
    
        MSG msg;
        bool quit = false;
    
        CreateGL( " SpaceWar 2D! ", 640, 480, 32, fullscreen );
    
        while( !quit ) {
    
            if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
    
                if( msg.message == WM_QUIT ) {
    
                    quit = true;
                }
                else {
    
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
            }
            else {
    
                if( active ) {
    
                    if( keys[VK_ESCAPE] ) {
    
                        quit = true;
                    }
                    else {
    
                        DrawGL();
                        SwapBuffers( hDC );
                    }
    
                    if( keys[VK_F1] ) {
    
                        keys[VK_F1] = false;
                        KillGL();
                        fullscreen = !fullscreen;
    
                        if( fullscreen ) {
    
                            CreateGL( " SpaceWar 2D! ", 1024, 768, 32, fullscreen );
                            SetMenu( hWnd, 0 );
                        }
                        else {
    
                            CreateGL( " SpaceWar 2D! ", 640, 480, 32, fullscreen );
                        }
                    }
    
                    if( keys[ VK_UP ] ) {
    
                        if( !( fullscreen ) ) {
    
                            if( !( player.my > 2.8f ) ) {
    
                                player.my += 0.0019f;
                            }
                            else if( player.my > 2.8f ) {
    
                                player.my = 2.8f;
                            }
                        }
                        else if( ( fullscreen ) ) {
    
                            if( !( player.my > 3.6f ) ) {
    
                                player.my += 0.002f;
                            }
                        }
                    }
    
                    if( keys[ VK_DOWN ] ) {
    
                        if( !( fullscreen ) ) {
    
                            if( !( player.my < -3.7f ) ) {
    
                                player.my -= 0.0019f;
                            }
                        }
                        else if( ( fullscreen ) ) {
    
                            if( !( player.my < -3.7f ) ) {
    
                                player.my -= 0.002f;
                            }
                        }
                    }
    
                    if( keys[ VK_SPACE ] ) {
    
                        shot = true;
                     }
                }
            }
        }
        KillGL();
        return msg.wParam;
    }
    
    void ReSizeGL( GLsizei width, GLsizei height ) {
    
        if( height == 0 ) {
    
            height = 1;
        }
    
        glViewport( 0, 0, width, height );
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
    
        gluPerspective( 45.0f, (float) width / (float) height, 0.1f, 100.0f );
    
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
    }
    
    int InitGL() {
    
        LoadTexture();
    
        glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
        glClearDepth( 1.0f );
        glDepthFunc( GL_LEQUAL );
        glShadeModel( GL_SMOOTH );
        glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
    
        glEnable( GL_DEPTH_TEST );
        glEnable( GL_TEXTURE_2D );
    
        return 0;
    }
    
    void LoadTexture() {
    
        AUX_RGBImageRec *TextureImage[2];
        memset( &TextureImage, 0, sizeof( void* ) *1 );
    
        TextureImage[0] = auxDIBImageLoad( "Bmp/player.bmp" );
        TextureImage[1] = auxDIBImageLoad( "Bmp/blaster.bmp" );
    
        glGenTextures( 2, &texture[0] );
    
        glBindTexture( GL_TEXTURE_2D, texture[0] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                         GL_LINEAR_MIPMAP_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
                         GL_LINEAR_MIPMAP_LINEAR );
        gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[0] -> sizeX,
                           TextureImage[0] -> sizeY, GL_RGB, GL_UNSIGNED_BYTE,
                           TextureImage[0] -> data );
    
        glBindTexture( GL_TEXTURE_2D, texture[1] );
    
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                         GL_LINEAR_MIPMAP_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
                         GL_LINEAR_MIPMAP_LINEAR );
        gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[1] -> sizeX,
                           TextureImage[1] -> sizeY, GL_RGB, GL_UNSIGNED_BYTE,
                           TextureImage[1] -> data );
    
       for( int i = 0; i < 2; ++i ) {
    
            if( TextureImage[i] ) {
    
                if( TextureImage[i] -> data ) {
    
                    free( TextureImage[i] -> data );
                }
                free( TextureImage[i] );
            }
        }
    }
    
    int DrawGL() {
    
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glLoadIdentity();
        glTranslatef( -5.0f, 0.0f, -10.0f );
        DrawFighter( player.mx, player.my );
    
        return 0;
    }
    
    void KillGL() {
    
        if( fullscreen ) {
    
            ChangeDisplaySettings( 0, 0 );
            ShowCursor( true );
        }
    
        wglMakeCurrent( 0, 0 );
        wglDeleteContext( hRC );
        hRC = 0;
    
        ReleaseDC( hWnd, hDC );
        hDC = 0;
    
        DestroyWindow( hWnd );
        hWnd = 0;
    
        UnregisterClass( szAppName, hInstance );
        hInstance = 0;
    }
    
    void DrawFighter( float&, float& ) {
    
        player.mx = -2.0f;
        player.my = 0.25f;
    
        glBindTexture( GL_TEXTURE_2D, texture[0] );
        glBegin( GL_QUADS );
    
         glTexCoord2f( 0.0f, 0.0f ); glVertex2d( player.mx,  player.my );
         glTexCoord2f( 1.0f, 0.0f ); glVertex2d( player.mx + 0.19f,  player.my );
         glTexCoord2f( 1.0f, 1.0f ); glVertex2d( player.mx + 0.19f,  player.my );
         glTexCoord2f( 0.0f, 1.0f ); glVertex2d( player.mx,  player.my );
    
        glEnd();
        glLoadIdentity();
    }
    
    bool CreateGL( const char *title, int width, int height, int bits, bool mode ) {
    
        unsigned int PixelFormat;
        static RECT wndr;
        DWORD ExStyle;
        DWORD Style;
        WNDCLASS wc;
    
        hInstance = GetModuleHandle( 0 );
        fullscreen = mode;
    
            wndr.left = (long) 0;
            wndr.top = (long) 0;
            wndr.right = (long) width;
            wndr.bottom = (long) height;
    
        wc.lpszClassName = szAppName;
        wc.lpszMenuName = "WINMENU";
        wc.lpfnWndProc = WinProc;
        wc.hInstance = hInstance;
        wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
        wc.hCursor = LoadCursor( 0, IDC_ARROW );
        wc.hbrBackground = 0;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    
        RegisterClass( &wc );
    
        if( fullscreen ) {
    
            DEVMODE dmSettings;
            memset( &dmSettings, 0, sizeof( dmSettings ) );
    
            dmSettings.dmSize = sizeof( dmSettings );
            dmSettings.dmPelsWidth = width;
            dmSettings.dmPelsHeight = height;
            dmSettings.dmBitsPerPel = bits;
            dmSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
    
            ChangeDisplaySettings( &dmSettings, CDS_FULLSCREEN );
        }
    
        if( fullscreen ) {
    
            ExStyle = WS_EX_APPWINDOW;
            Style = WS_POPUP;
            ShowCursor( false );
        }
        else {
    
            ExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
            Style = WS_OVERLAPPEDWINDOW;
        }
    
        hWnd = CreateWindowEx( ExStyle,
                               szAppName,
                               title,
                               WS_CLIPCHILDREN | WS_CLIPSIBLINGS | Style,
                               0, 0,
                               wndr.right - wndr.left, wndr.bottom - wndr.top,
                               0,
                               0,
                               hInstance,
                               0 );
    
        static PIXELFORMATDESCRIPTOR pfd = {
    
            sizeof( PIXELFORMATDESCRIPTOR ),
            1,
            PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
            PFD_TYPE_RGBA,
            bits,
            0, 0, 0, 0, 0, 0,
            0,
            0,
            0,
            0, 0, 0, 0,
            32,
            0,
            0,
            PFD_MAIN_PLANE,
            0,
            0, 0, 0
        };
    
        hDC = GetDC( hWnd );
        PixelFormat = ChoosePixelFormat( hDC, &pfd );
        SetPixelFormat( hDC, PixelFormat, &pfd );
    
        hRC = wglCreateContext( hDC );
        wglMakeCurrent( hDC, hRC );
    
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    
        ReSizeGL( width, height );
        InitGL();
    
        return true;
    }
    
    LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam,
                              LPARAM lParam ) {
    
        switch( message ) {
    
            case WM_ACTIVATE: {
    
                if( !( HIWORD( wParam ) ) ) {
    
                    active = true;
                }
                else {
    
                    active = false;
                }
                return 0;
            }
    
            case WM_SIZE: {
    
                ReSizeGL( LOWORD( lParam ), HIWORD( lParam ) );
                return 0;
            }
    
            case WM_COMMAND: {
    
                switch( wParam ) {
    
                    case IDM_MAPPING: {
    
                        DialogBox( hInstance, MAKEINTRESOURCE( IDD_DIALOG1 ),
                                   hWnd, (DLGPROC) Dialog1Proc );
                        return 0;
                    }
    
                    case IDM_EXIT: {
    
                        SendMessage( hWnd, WM_CLOSE, 0, 0 );
                        return 0;
                    }
    
                    case IDB_HOOK1: {
    
                        HWND hbtn1;
                        hbtn1 = GetDlgItem( hWnd, IDB_HOOK1 );
                        SendMessage( hbtn1, BM_SETCHECK, BST_CHECKED, 0 );
                        return 0;
                    }
                }
                return 0;
            }
    
            case WM_SYSCOMMAND: {
    
                switch( wParam ) {
    
                    case SC_SCREENSAVE:
                    case SC_MONITORPOWER:
                    return 0;
                }
                break;
            }
    
            case WM_KEYDOWN: {
    
                keys[wParam] = true;
                return 0;
            }
    
            case WM_KEYUP: {
    
                keys[wParam] = false;
                return 0;
            }
    
            case WM_CLOSE: {
    
                PostQuitMessage( 0 );
                return 0;
            }
        }
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    
    bool CALLBACK Dialog1Proc( HWND Dlg1, UINT message, WPARAM wParam,
                               LPARAM lParam ) {
    
        switch( message ) {
    
            case WM_INITDIALOG: {
    
                return true;
            }
    
            case WM_COMMAND: {
    
                switch( wParam ) {
    
                    case IDOK: {
    
                        MessageBox( 0, "Du hast den Sieger Knopf gedrückt",
                                    "Herzlichen Glückwunsch", MB_OK );
                        EndDialog( Dlg1, IDOK );
                        return true;
                    }
    
                    case IDCANCEL: {
    
                        MessageBox( 0, "Du hast den Verlierer Knopf gedrückt",
                                    "Herzlichen Glückwunsch", MB_OK );
                        EndDialog( Dlg1, IDCANCEL );
                        return true;
                    }
                }
            }
        }
        return false;
    }
    


  • Elektronix schrieb:

    Zu Deinem Problem- ich habe nämlich das gleiche: Das hängt vom Compiler ab. VC2005 ist auf XP-Programme voreingestellt. (Ich habe schon im Forum gefragt, wie man das ändern könnte, aber keine Antwort bekommen.)

    Wo? Hab ich wohl übersehene...
    Du musst nur
    WINVER und _WIN32_WINNT in dein Projekteinstellungen unter "Preprocessor defines" entsprechend setzen!
    z.B. Wn98:
    _WIN32_WINDOWS=0x0410
    WINVER>=0x0410

    Elektronix schrieb:

    Die laufen unter '98 nicht, weil schon die Datenbreite für Zeiger oder verschiedene Variablentypen unterschiedlich ist.

    Wo hast Du denn das her! Wenn Du ein x86 Programm erstellst, dann ist es immer gleich egal ob dies für Win98 oder Vista erstellt wurde!

    Elektronix schrieb:

    Dann gibt es meistens noch Probleme mit der UNICODE-Definierung und den zugehörigen anderen Typenbezeichnern im Quellcode (z. B. TCHAR statt einfach nur char o.ä.).

    Win98 kennt keine Unicode, somit musst Du nur die Default-Einstellung in dem VC-Projekt von Unicode nach "Multibyte" oder "Not Set" stellen (Project|Properties|General|Character Set).

    Auch rate ich dazu die CRT statisch zu linken, dann musst Du auf dem zielrechner nix installieren (ausser in Deinem Fall vielleicht opengl).

    PS: Die unterstützten Platformen für VC2005 findest Du hier:
    http://msdn2.microsoft.com/en-us/library/ms235435.aspx
    bzw. ein Hinweis zu NT hier:
    http://blog.kalmbachnet.de/?postid=53



  • heisst das ich soll oben wo ich alles initialisiere oder in meiner header datei einfach

    #define _WIN32_WINDOWS=0x0410 
    #define WINVER>=0x0410
    

    hin schreiben und dann läuft mein code auch auch win98????



  • T0bi schrieb:

    heisst das ich soll oben wo ich alles initialisiere oder in meiner header datei einfach

    #define _WIN32_WINDOWS=0x0410 
    #define WINVER>=0x0410
    

    hin schreiben und dann läuft mein code auch auch win98????

    Jochen Kalmbach schrieb:

    WINVER und _WIN32_WINNT in dein Projekteinstellungen unter "Preprocessor defines" entsprechend setzen!



  • T0bi schrieb:

    heisst das ich soll oben wo ich alles initialisiere oder in meiner header datei einfach

    Entweder gaaaaaaaanz oben (also bevor windows.h oder sostwas includiert wird!), dann aber so:

    #define _WIN32_WINDOWS 0x0410 
    #define WINVER 0x0410
    

    oder aber in den Projekteinstellungen (würde ich in diesem Fall bevorzugen).

    Unter Win98 läuft es aber nur, wenn Du statisch linkst oder wenn Du unbedingt gegen die DLLs linken willst, musst Du die CRT-DLLs auf dem Zielrechner installieren.



  • Jochen Kalmbach schrieb:

    Elektronix schrieb:

    Zu Deinem Problem- ich habe nämlich das gleiche: Das hängt vom Compiler ab. VC2005 ist auf XP-Programme voreingestellt. (Ich habe schon im Forum gefragt, wie man das ändern könnte, aber keine Antwort bekommen.)

    Wo? Hab ich wohl übersehene...
    Du musst nur
    WINVER und _WIN32_WINNT in dein Projekteinstellungen unter "Preprocessor defines" entsprechend setzen!
    z.B. Wn98:
    _WIN32_WINDOWS=0x0410
    WINVER>=0x0410

    Elektronix schrieb:

    Die laufen unter '98 nicht, weil schon die Datenbreite für Zeiger oder verschiedene Variablentypen unterschiedlich ist.

    Wo hast Du denn das her! Wenn Du ein x86 Programm erstellst, dann ist es immer gleich egal ob dies für Win98 oder Vista erstellt wurde!

    Elektronix schrieb:

    Dann gibt es meistens noch Probleme mit der UNICODE-Definierung und den zugehörigen anderen Typenbezeichnern im Quellcode (z. B. TCHAR statt einfach nur char o.ä.).

    Win98 kennt keine Unicode, somit musst Du nur die Default-Einstellung in dem VC-Projekt von Unicode nach "Multibyte" oder "Not Set" stellen (Project|Properties|General|Character Set).

    Auch rate ich dazu die CRT statisch zu linken, dann musst Du auf dem zielrechner nix installieren (ausser in Deinem Fall vielleicht opengl).

    PS: Die unterstützten Platformen für VC2005 findest Du hier:
    http://msdn2.microsoft.com/en-us/library/ms235435.aspx
    bzw. ein Hinweis zu NT hier:
    http://blog.kalmbachnet.de/?postid=53

    Aha!! Neulich im Zusammenhang mit den Toolbars habe ich diese Frage schon gestellt, und keiner konnte sie beantworten.
    Manchmal kann es sogar helfen, wenn man selbst dumme Antworten gibt 😃 . Danke für die Infos. 👍



  • Also ich hab das gleiche Problem,

    ich hab in der Firma im Büro ein Programm unter XP geschrieben, will dieses jetzt auf unsrer Fräsmaschine auf NT 4.0 laufen lassen, dies geht aber nicht, kommt ne Fehlermeldung und das Programm wird beendet.

    Ich habe die 2 Möglichkeiten auch schon probiert,

    1. in den Quellcode ganz oben die #define befehle eintragen

    #define _WIN32_WINDOWS 0x0410 
    #define WINVER 0x0410
    

    2. in den Projecteigenschaften die Präprozessor Einstellungen entsprechend gesetzt !! Funktioniert aber immer noch nicht !!

    kann mir mal jemadn die genaue Syntax posten, vielleicht hab ich da doch ein Schreibfehler drin !! Oder gibt´s noch andere Optionen die man ändern muss !!

    Gruß Andi

    EDIT: Hehe, hab grad gesehn, dass das letzte Posting genau ein Jahr her ist 😋 😃


Anmelden zum Antworten