we6540 发表于 2015-12-17 11:58:11

directx编程问题



编译不通过爆出下面一连串错误求解:dizzy:

1>MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
1>D:\visual studio sdk\游戏编程\ConsoleApplication1\Debug\ConsoleApplication1.exe : fatal error LNK1120: 1 个无法解析的外部命令



#include <windows.h>   
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>

#include <ddraw.h> // include directdraw


using namespace std;


#define WINDOW_CLASS_NAME TEXT("WINCLASS1")


#define SCREEN_WIDTH    640// size of screen
#define SCREEN_HEIGHT   480
#define SCREEN_BPP      8    // bits per pixel
#define MAX_COLORS      256// maximum colors

typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned charUCHAR;
typedef unsigned charBYTE;

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

#define DD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }


HWND      main_window_handle = NULL; // globally track main window
HINSTANCE hinstance_app = NULL; // globally track hinstance



LPDIRECTDRAW7         lpdd = NULL;   
LPDIRECTDRAWSURFACE7lpddsprimary = NULL;   
LPDIRECTDRAWSURFACE7lpddsback = NULL;   
LPDIRECTDRAWPALETTE   lpddpal = NULL;
LPDIRECTDRAWCLIPPER   lpddclipper = NULL;
PALETTEENTRY          palette;         
PALETTEENTRY          save_palette;   
DDSURFACEDESC2      ddsd;                  
DDBLTFX               ddbltfx;               
DDSCAPS2            ddscaps;               
HRESULT               ddrval;               
DWORD               start_clock_count = 0;

// these defined the general clipping rectangle
int min_clip_x = 0,                        // clipping rectangle
max_clip_x = SCREEN_WIDTH - 1,
min_clip_y = 0,
max_clip_y = SCREEN_HEIGHT - 1;

// these are overwritten globally by DD_Init()
int screen_width = SCREEN_WIDTH,            // width of screen
screen_height = SCREEN_HEIGHT,         // height of screen
screen_bpp = SCREEN_BPP;            // bits per pixel


char buffer;                     // general printing buffer

// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
        UINT msg,
        WPARAM wparam,
        LPARAM lparam)
{
        // this is the main message handler of the system
        PAINTSTRUCT                ps;                // used in WM_PAINT
        HDC                                hdc;        // handle to a device context
        char buffer;      // used to print strings

        // what is the message
        switch (msg)
        {
        case WM_CREATE:
        {
                // do initialization stuff here
                // return success
                return(0);
        } break;

        case WM_PAINT:
        {
                // simply validate the window
                hdc = BeginPaint(hwnd, &ps);

                // end painting
                EndPaint(hwnd, &ps);

                // return success
                return(0);
        } break;

        case WM_DESTROY:
        {

                // kill the application, this sends a WM_QUIT message
                PostQuitMessage(0);

                // return success
                return(0);
        } break;

        default:break;

        } // end switch

        // process any messages that we didn't take care of
        return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

///////////////////////////////////////////////////////////

int Game_Main(void *parms = NULL, int num_parms = 0)
{
        // this is the main loop of the game, do all your processing
        // here

        // for now test if user is hitting ESC and send WM_CLOSE
        if (KEYDOWN(VK_ESCAPE))
                SendMessage(main_window_handle, WM_CLOSE, 0, 0);

        // return success or failure or your own return code here
        return(1);

} // end Game_Main

////////////////////////////////////////////////////////////

int Game_Init(void *parms = NULL, int num_parms = 0)
{
        // this is called once after the initial window is created and
        // before the main event loop is entered, do all your initialization
        // here

        // create IDirectDraw interface 7.0 object and test for error
        if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
                return(0);

        // set cooperation to full screen
        if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
                DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
                DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
        {
                // error
                return(0);
        } // end if

        // set display mode to 640x480x8
        if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 0, 0)))
        {
                // error
                return(0);
        } // end if


        // return success or failure or your own return code here
        return(1);

} // end Game_Init

/////////////////////////////////////////////////////////////

int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
        // this is called after the game is exited and the main event
        // loop while is exited, do all you cleanup and shutdown here

        // simply blow away the IDirectDraw4 interface
        if (lpdd)
        {
                lpdd->Release();
                lpdd = NULL;
        } // end if

        // return success or failure or your own return code here
        return(1);

} // end Game_Shutdown

// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinstance,
        HINSTANCE hprevinstance,
        LPSTR lpcmdline,
        int ncmdshow)
{

        WNDCLASSEX winclass; // this will hold the class we create
        HWND           hwnd;       // generic window handle
        MSG                   msg;               // generic message
        HDC      hdc;      // graphics device context

        // first fill in the window class stucture
        winclass.cbSize = sizeof(WNDCLASSEX);
        winclass.style = CS_DBLCLKS | CS_OWNDC |
                CS_HREDRAW | CS_VREDRAW;
        winclass.lpfnWndProc = WindowProc;
        winclass.cbClsExtra = 0;
        winclass.cbWndExtra = 0;
        winclass.hInstance = hinstance;
        winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        winclass.lpszMenuName = NULL;
        winclass.lpszClassName = WINDOW_CLASS_NAME;
        winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

        // save hinstance in global
        hinstance_app = hinstance;

        // register the window class
        if (!RegisterClassEx(&winclass))
                return(0);

        // create the window
        if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                WINDOW_CLASS_NAME,   // class
                TEXT("DirectDraw Full-Screen Demo"), // title
                WS_POPUP | WS_VISIBLE,
                0, 0,          // initial x,y
                SCREEN_WIDTH, SCREEN_HEIGHT,// initial width, height
                NULL,          // handle to parent
                NULL,          // handle to menu
                hinstance,// instance of this application
                NULL)))        // extra creation parms
                return(0);

        // save main window handle
        main_window_handle = hwnd;

        // initialize game here
        Game_Init();

        // enter main event loop
        while (TRUE)
        {
                // test if there is a message in queue, if so get it
                if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                {
                        // test if this is a quit
                        if (msg.message == WM_QUIT)
                                break;

                        // translate any accelerator keys
                        TranslateMessage(&msg);

                        // send the message to the window proc
                        DispatchMessage(&msg);
                } // end if

                // main game processing goes here
                Game_Main();

        } // end while

        // closedown game here
        Game_Shutdown();

        // return to Windows like this
        return(msg.wParam);

}

林問 发表于 2015-12-29 01:25:19

哈哈 太複雜了

atmo 发表于 2015-12-29 16:03:22

这个要几个文件一起编译的。
页: [1]
查看完整版本: directx编程问题