NewConcept 发表于 2021-4-5 08:49:49

正在学孙鑫的“VC++深入理解”,为什么书第二章附码的解决方案可以编译,而我按书...

不编译就显示的错误:
严重性    代码    说明    项目    文件    行    禁止显示状态
错误(活动)    E1097    未知特性 "no_init_all"    WinMain    E:\Windows Kits\10\Include\10.0.18362.0\um\winnt.h    3886   


编译后增加两条:
1:
严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK2001    无法解析的外部符号 main    WinMain    D:\VS2019工作目录\Windows程序练习\VC++深入理解\Practice\ch02\WinMain_Build\ch02\WinMain\MSVCRT.lib(exe_main.obj)    1   

2:
严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK1120    1 个无法解析的外部命令    WinMain    D:\VS2019工作目录\Windows程序练习\VC++深入理解\Practice\ch02\WinMain_Build\ch02\x64\Release\WinMain.exe    1   

wp231957 发表于 2021-4-5 09:08:12

这个问题需要你自行研究
首先你没发代码,鬼都不晓得你在讲什么

其次,即使你发出代码,估计也没人会
现在研究mfc的好像不多

NewConcept 发表于 2021-4-5 09:30:43

源码:
#include <windows.h>
#include <stdio.h>



LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                    // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
);

int WINAPI WinMain(
        HINSTANCE hInstance,                // handle to current instance
        HINSTANCE hPrevInstance,                // handle to previous instance
        LPSTR lpCmdLine,                       // command line
        int nCmdShow                                 // show state
)
{
        //设计一个窗口类
        WNDCLASS wndcls;
        wndcls.cbClsExtra = 0;
        wndcls.cbWndExtra = 0;
        wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
        wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
        wndcls.hInstance = hInstance;                //应用程序实例句柄由WinMain函数传进来
        wndcls.lpfnWndProc = WinSunProc;
        wndcls.lpszClassName = "sunxin2019";
        wndcls.lpszMenuName = NULL;
        wndcls.style = CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&wndcls);

        //创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
        HWND hwnd;
        hwnd = CreateWindow("sunxin2019", "http://www.phei.com.cn",
                WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

        //显示及刷新窗口
        ShowWindow(hwnd, SW_SHOWNORMAL);
        UpdateWindow(hwnd);

        //定义消息结构体,开始消息循环
        MSG msg;
        BOOL bRet;
        //while (GetMessage(&msg, NULL, 0, 0))
        while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
        {
                if (bRet == -1)
                {
                        // handle the error and possibly exit
                        return -1;
                }
                else
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }


        }
        return msg.wParam;
}

//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                   // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
)
{
        switch (uMsg)
        {
        case WM_CHAR:
                char szChar;
                sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
                MessageBox(hwnd, szChar, "char", 0);
                break;
        case WM_LBUTTONDOWN:
                MessageBox(hwnd, "mouse clicked", "message", 0);
                HDC hdc;
                hdc = GetDC(hwnd);                //不能在响应WM_PAINT消息时调用
                TextOut(hdc, 0, 50, "程序员之家", strlen("程序员之家"));
                ReleaseDC(hwnd, hdc);
                break;
        case WM_PAINT:
                HDC hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(hwnd, &ps);                //BeginPaint只能在响应WM_PAINT消息时调用
                TextOut(hDC, 0, 0, "http://www.phei.com.cn", strlen("http://www.phei.com.cn"));
                EndPaint(hwnd, &ps);
                break;
        case WM_CLOSE:
                if (IDYES == MessageBox(hwnd, "是否真的结束?", "message", MB_YESNO))
                {
                        DestroyWindow(hwnd);
                }
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        return 0;
}

NewConcept 发表于 2021-4-5 09:31:55

我感觉我的和书附码一模一样,不知道哪个细节出了问题

NewConcept 发表于 2021-4-5 09:39:42

源码:
#include <windows.h>
#include <stdio.h>



LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                    // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
);

int WINAPI WinMain(
        HINSTANCE hInstance,                // handle to current instance
        HINSTANCE hPrevInstance,                // handle to previous instance
        LPSTR lpCmdLine,                       // command line
        int nCmdShow                                 // show state
)
{
        //设计一个窗口类
        WNDCLASS wndcls;
        wndcls.cbClsExtra = 0;
        wndcls.cbWndExtra = 0;
        wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
        wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
        wndcls.hInstance = hInstance;                //应用程序实例句柄由WinMain函数传进来
        wndcls.lpfnWndProc = WinSunProc;
        wndcls.lpszClassName = "sunxin2019";
        wndcls.lpszMenuName = NULL;
        wndcls.style = CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&wndcls);

        //创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
        HWND hwnd;
        hwnd = CreateWindow("sunxin2019", "http://www.phei.com.cn",
                WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

        //显示及刷新窗口
        ShowWindow(hwnd, SW_SHOWNORMAL);
        UpdateWindow(hwnd);

        //定义消息结构体,开始消息循环
        MSG msg;
        BOOL bRet;
        //while (GetMessage(&msg, NULL, 0, 0))
        while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
        {
                if (bRet == -1)
                {
                        // handle the error and possibly exit
                        return -1;
                }
                else
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }


        }
        return msg.wParam;
}

//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                   // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
)
{
        switch (uMsg)
        {
        case WM_CHAR:
                char szChar;
                sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
                MessageBox(hwnd, szChar, "char", 0);
                break;
        case WM_LBUTTONDOWN:
                MessageBox(hwnd, "mouse clicked", "message", 0);
                HDC hdc;
                hdc = GetDC(hwnd);                //不能在响应WM_PAINT消息时调用
                TextOut(hdc, 0, 50, "程序员之家", strlen("程序员之家"));
                ReleaseDC(hwnd, hdc);
                break;
        case WM_PAINT:
                HDC hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(hwnd, &ps);                //BeginPaint只能在响应WM_PAINT消息时调用
                TextOut(hDC, 0, 0, "http://www.phei.com.cn", strlen("http://www.phei.com.cn"));
                EndPaint(hwnd, &ps);
                break;
        case WM_CLOSE:
                if (IDYES == MessageBox(hwnd, "是否真的结束?", "message", MB_YESNO))
                {
                        DestroyWindow(hwnd);
                }
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        return 0;
}

NewConcept 发表于 2021-4-5 09:40:52

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



LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                    // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
);

int WINAPI WinMain(
        HINSTANCE hInstance,                // handle to current instance
        HINSTANCE hPrevInstance,                // handle to previous instance
        LPSTR lpCmdLine,                       // command line
        int nCmdShow                                 // show state
)
{
        //设计一个窗口类
        WNDCLASS wndcls;
        wndcls.cbClsExtra = 0;
        wndcls.cbWndExtra = 0;
        wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
        wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
        wndcls.hInstance = hInstance;                //应用程序实例句柄由WinMain函数传进来
        wndcls.lpfnWndProc = WinSunProc;
        wndcls.lpszClassName = "sunxin2019";
        wndcls.lpszMenuName = NULL;
        wndcls.style = CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&wndcls);

        //创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
        HWND hwnd;
        hwnd = CreateWindow("sunxin2019", "http://www.phei.com.cn",
                WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

        //显示及刷新窗口
        ShowWindow(hwnd, SW_SHOWNORMAL);
        UpdateWindow(hwnd);

        //定义消息结构体,开始消息循环
        MSG msg;
        BOOL bRet;
        //while (GetMessage(&msg, NULL, 0, 0))
        while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
        {
                if (bRet == -1)
                {
                        // handle the error and possibly exit
                        return -1;
                }
                else
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }


        }
        return msg.wParam;
}

//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                   // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
)
{
        switch (uMsg)
        {
        case WM_CHAR:
                char szChar;
                sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
                MessageBox(hwnd, szChar, "char", 0);
                break;
        case WM_LBUTTONDOWN:
                MessageBox(hwnd, "mouse clicked", "message", 0);
                HDC hdc;
                hdc = GetDC(hwnd);                //不能在响应WM_PAINT消息时调用
                TextOut(hdc, 0, 50, "程序员之家", strlen("程序员之家"));
                ReleaseDC(hwnd, hdc);
                break;
        case WM_PAINT:
                HDC hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(hwnd, &ps);                //BeginPaint只能在响应WM_PAINT消息时调用
                TextOut(hDC, 0, 0, "http://www.phei.com.cn", strlen("http://www.phei.com.cn"));
                EndPaint(hwnd, &ps);
                break;
        case WM_CLOSE:
                if (IDYES == MessageBox(hwnd, "是否真的结束?", "message", MB_YESNO))
                {
                        DestroyWindow(hwnd);
                }
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        return 0;
}

NewConcept 发表于 2021-4-5 10:57:34

把windows sdk 版本 从 10.0.18362.0改为10.0.17763.0后,第一个错误没有了,
但第2,3个错误依然存在,大神能不能提醒一下主要修改哪些属性项?

jackz007 发表于 2021-4-5 16:16:24

你的代码有 main() 函数吗?

NewConcept 发表于 2021-4-5 16:23:11

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

LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                    // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
);

int WINAPI WinMain(
        HINSTANCE hInstance,                // handle to current instance
        HINSTANCE hPrevInstance,                // handle to previous instance
        LPSTR lpCmdLine,                       // command line
        int nCmdShow                                 // show state
)
{
        //设计一个窗口类
        WNDCLASS wndcls;
        wndcls.cbClsExtra = 0;
        wndcls.cbWndExtra = 0;
        wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
        wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
        wndcls.hInstance = hInstance;                //应用程序实例句柄由WinMain函数传进来
        wndcls.lpfnWndProc = WinSunProc;
        wndcls.lpszClassName = "sunxin2019";
        wndcls.lpszMenuName = NULL;
        wndcls.style = CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&wndcls);
       
        //创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
        HWND hwnd;
        hwnd = CreateWindow("sunxin2019", "http://www.phei.com.cn",
                WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

        //显示及刷新窗口
        ShowWindow(hwnd, SW_SHOWNORMAL);
        UpdateWindow(hwnd);

        //定义消息结构体,开始消息循环
        MSG msg;
        BOOL bRet;
        //while (GetMessage(&msg, NULL, 0, 0))
        while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
        {
                if (bRet == -1)
                {
                        // handle the error and possibly exit
                        return -1;
                }
                else
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }

               
        }
        return msg.wParam;
}

//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
        HWND hwnd,                // handle to window
        UINT uMsg,                   // message identifier
        WPARAM wParam,        // first message parameter
        LPARAM lParam                 // second message parameter
)
{
        switch (uMsg)
        {
        case WM_CHAR:
                char szChar;
                sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
                MessageBox(hwnd, szChar, "char", 0);
                break;
        case WM_LBUTTONDOWN:
                MessageBox(hwnd, "mouse clicked", "message", 0);
                HDC hdc;
                hdc = GetDC(hwnd);                //不能在响应WM_PAINT消息时调用
                TextOut(hdc, 0, 50, "程序员之家", strlen("程序员之家"));
                ReleaseDC(hwnd, hdc);
                break;
        case WM_PAINT:
                HDC hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(hwnd, &ps);                //BeginPaint只能在响应WM_PAINT消息时调用
                TextOut(hDC, 0, 0, "http://www.phei.com.cn", strlen("http://www.phei.com.cn"));
                EndPaint(hwnd, &ps);
                break;
        case WM_CLOSE:
                if (IDYES == MessageBox(hwnd, "是否真的结束?", "message", MB_YESNO))
                {
                        DestroyWindow(hwnd);
                }
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        return 0;
}

NewConcept 发表于 2021-4-5 16:23:48

有啊:
int WINAPI WinMain(
        HINSTANCE hInstance,                // handle to current instance
        HINSTANCE hPrevInstance,                // handle to previous instance
        LPSTR lpCmdLine,                       // command line
        int nCmdShow                                 // show state
)
{
页: [1]
查看完整版本: 正在学孙鑫的“VC++深入理解”,为什么书第二章附码的解决方案可以编译,而我按书...