编译成功,运行失败!该如何处理

编译成功,运行失败!!!
看图:编译成功,运行失败!该如何处理
F5后的错误提示,是什么意思?

再看这个可以通过编译但无法运行的源代码:
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc  /* 声明一个回调函数 */
(
HWND hwnd,    /* 窗口的句柄 */
UINT uMsg,    /* 窗口的消息 */
WPARAM wParam,
LPARAM lParam
);
/*****************************************************
 WinMain:Windows程序的入口函数
要创建一个完整的窗口需要经过下面4个步骤:设计一个窗口
类,注册窗口类,创建窗口,显示及更新窗口
******************************************************/
int WINAPI WinMain
(
HINSTANCE hInstance,      // 实例句柄,当前应用程序的实例句柄
HINSTANCE hPrevInstance,  // 默认这个参数为null
LPSTR lpCmdLine,          // 储存第一个命令行参数
    int nCmdShow)
{
WNDCLASS wndcls;          // 定义一个窗口对象
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;

wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);   // 指定窗口背景色

wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);                   // 设置光标样式

wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);                       // 设置图表样式

wndcls.hInstance = hInstance;              // 指定窗口实例句柄
wndcls.lpfnWndProc = WinSunProc;           // 指定窗口函数,即窗口主处理函数

wndcls.lpszClassName = "Visual c++ name";  // 窗口类名称
wndcls.lpszMenuName = NULL;

wndcls.style = CS_HREDRAW | CS_VREDRAW;

// 注册窗口类
RegisterClass(&wndcls);

HWND hwnd;  // 声明窗口句柄
hwnd = CreateWindow(
                        "Visual C++ Game",
                    "Visual C++ 游戏开发",
                    WS_OVERLAPPEDWINDOW,
                    200, 200, 600, 400,
                    NULL,NULL,hInstance,NULL
                    );
// 在这里真正显示窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);  // 更新显示
/***********************************************************
初始化工作完成后,WinMain进入所谓的消息循环
************************************************************/
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); // 转换键盘消息
DispatchMessage(&msg);
}
    return 0;
}
/***********************************************************
窗口函数:窗口函数通常利用switch/case方式判断消息的种类,以
决定处置方式,由于其被window调用,所以是一种callback函数
***********************************************************/
LRESULT CALLBACK WinSunProc(
HWND hwnd, // 窗口句柄
                            UINT uMsg, // 消息
WPARAM wParam, // 参数1
WPARAM lParam  // 参数2
)
{
switch(uMsg)
{
case WM_PAINT:  /* 更新窗口消息 */
HDC hDC;  /* 定义DC设备 */
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps); /* 得到设备HDC */
TextOut(hDC, 200, 0, "Visual C++ 游戏开发", strlen("Visual C++ 游戏开发"));
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:  /* 当单击关闭按钮时,产生关闭消息 */
if(IDYES==MessageBox(hwnd, "你真要走?", "游戏开发", MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:  /* 销毁窗口消息 */
PostQuitMessage(0);
break;
default:
// 在这里必须调用DefWindowProc,这是window内部默认的消息处理函数
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}

------解决思路----------------------
你的两个窗口类名不一样,
调用CreateWindow的第一个参数改成wndcls.lpszClassName试试
------解决思路----------------------
LRESULT CALLBACK WinSunProc(
                            HWND hwnd, // 窗口句柄
                            UINT uMsg, // 消息
                            WPARAM wParam, // 参数1
                            WPARAM lParam  // 参数2
                            )

------------------------------------------->

WPARAM lParam  // 参数2 类型不对

LPARAM
------解决思路----------------------
你要把工程类型改成windows类型
不是console类型
------解决思路----------------------
链接错误,你把声明删除了,然后把下边的那个实现,放到main上边
------解决思路----------------------
  你的函数WinSunProc 声明和定义不一致 导致链接错误,声明的最后的参数类型是LPARAM  定义里最后的参数类型是WPARAM,改成LPARAM再编译一遍
------解决思路----------------------
请楼主今后对“no matching symbolic information found.”这类提示信息眼不见为净。
请楼主以后编译链接通过后不要按F5或Ctrl+F5或点击相应按钮或菜单运行,而要按F11键运行。
------解决思路----------------------
这个函数指针的声明
LRESULT CALLBACK WinSunProc  /* 声明一个回调函数 */
(
    HWND hwnd,    /* 窗口的句柄 */
    UINT uMsg,    /* 窗口的消息 */
    WPARAM wParam,
    LPARAM lParam

);
跟实现的参数不符合
LRESULT CALLBACK WinSunProc(
                            HWND hwnd, // 窗口句柄
                            UINT uMsg, // 消息
                            WPARAM wParam, // 参数1
                            WPARAM lParam  // 参数2

                            )

------解决思路----------------------
你这个不叫运行失败,而是叫链接失败

编译、链接、运行……,是完全不同的过程,其错误含义也大相径庭
------解决思路----------------------
你这个代码有问题,当然不会出现,你仔细看一下, CreateWindow时参数中指定的窗口类名为Visual C++ Game
,但你注册的是wndcls.lpszClassName = "Visual c++ name";,改成Visual c++ Game 一样就可以了

引用:
Quote: 引用:

按F11运行的意思是每按一次F11,程序往下走一句,当你觉得没问题,可以继续往下快速运行没必要一句一句往下走时,按F5.
如果你希望按F5后在运行到某行时暂停回到调试界面,预先在那行按F9设置断点。


赵老师,我有一个小要求,如果您机器上还有vc6.0的话,您可否建立这个win32 application项目,看运行后,能不能在您屏幕上弹出一个对话框,就像书上说的那样。源代码如下:

#include <windows.h>
#include <stdio.h>



/***********************************************************
窗口函数:窗口函数通常利用switch/case方式判断消息的种类,以
决定处置方式,由于其被window调用,所以是一种callback函数
***********************************************************/
LRESULT CALLBACK WinSunProc(
                            HWND hwnd, // 窗口句柄
                            UINT uMsg, // 消息
                            WPARAM wParam, // 参数1
                            LPARAM lParam  // 参数2
                            )
{
    switch(uMsg)
    {
    case WM_PAINT:  /* 更新窗口消息 */
        HDC hDC;  /* 定义DC设备 */
        PAINTSTRUCT ps;
        hDC = BeginPaint(hwnd, &ps); /* 得到设备HDC */
        TextOut(hDC, 200, 0, "Visual C++ 游戏开发", strlen("Visual C++ 游戏开发"));
        EndPaint(hwnd, &ps);
        break;
    case WM_CLOSE:  /* 当单击关闭按钮时,产生关闭消息 */
        if(IDYES==MessageBox(hwnd, "你真要走?", "游戏开发", MB_YESNO))
        {
            DestroyWindow(hwnd);
        }
        break;
    case WM_DESTROY:  /* 销毁窗口消息 */
        PostQuitMessage(0);
        break;
    default:
        // 在这里必须调用DefWindowProc,这是window内部默认的消息处理函数
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

/*****************************************************
 WinMain:Windows程序的入口函数
要创建一个完整的窗口需要经过下面4个步骤:设计一个窗口
类,注册窗口类,创建窗口,显示及更新窗口
******************************************************/
int WINAPI WinMain
(
    HINSTANCE hInstance,      // 实例句柄,当前应用程序的实例句柄
    HINSTANCE hPrevInstance,  // 默认这个参数为null
    LPSTR lpCmdLine,          // 储存第一个命令行参数
    int nCmdShow)
{
    WNDCLASS wndcls;          // 定义一个窗口对象
    wndcls.cbClsExtra=0;
    wndcls.cbWndExtra=0;
 
    wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);      // 指定窗口背景色
     
    wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);                   // 设置光标样式
     
    wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);                       // 设置图表样式
     
    wndcls.hInstance = hInstance;              // 指定窗口实例句柄
    wndcls.lpfnWndProc = WinSunProc;           // 指定窗口函数,即窗口主处理函数
 
    wndcls.lpszClassName = "Visual c++ name";  // 窗口类名称
    wndcls.lpszMenuName = NULL;
 
    wndcls.style = CS_HREDRAW 
------解决思路----------------------
 CS_VREDRAW;
 
    // 注册窗口类
    RegisterClass(&wndcls);
 
    HWND hwnd;  // 声明窗口句柄
    hwnd = CreateWindow(
                        "Visual C++ Game",
                        "Visual C++ 游戏开发",
                        WS_OVERLAPPEDWINDOW,
                        200, 200, 600, 400,
                        NULL,NULL,hInstance,NULL
                        );
// 在这里真正显示窗口
    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);  // 更新显示
/***********************************************************
初始化工作完成后,WinMain进入所谓的消息循环
************************************************************/
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg); // 转换键盘消息
        DispatchMessage(&msg);
    }
    return 0;
}

------解决思路----------------------
建议更换更高版本的开发环境,虽然VC6轻便快捷,但微软一向都是强制升级的,兼容方便有很多问题,偶尔能用有时也可能有很多不必要的麻烦,不有太多多余无用的东西用Vs03到VS08之间的版本,2008算是最后一个比较不错的版本了,从2010开始臃肿无比。
------解决思路----------------------
引用:
Quote: 引用:

建议更换更高版本的开发环境,虽然VC6轻便快捷,但微软一向都是强制升级的,兼容方便有很多问题,偶尔能用有时也可能有很多不必要的麻烦,不有太多多余无用的东西用Vs03到VS08之间的版本,2008算是最后一个比较不错的版本了,从2010开始臃肿无比。


谢谢建议。前两天刚刚下载了visual stdio 2010,有一点用着不是很舒服:那就是我在调用库里的代码时,比如输入函数名【LoadCursor】以后,再输入一个【 ( 】,这个平台却并不会给我显示参数列表,而VC6.0却可以。它不给我显示参数列表会让我很心虚啊,毕竟就是照抄代码,也不知道自己会不再哪个字母写错了。。。还有,填写完结构体类型名以后,按下【 . 】后,也不会出现该结构体里面的变量列表。。。


那是因为你缺少一个叫VAssistx的神器!