新建一个空的win32项目,加入自己写的文件,一个cpp文件,就是用sdk写的显示一个窗口和菜单。一个rc文件,一个.h文件。
用vc6编译连接成功,生成exe文件。执行没问题。
用vc2008编译成功,连接出错。
正在编译资源...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
正在链接...
sdk.obj : error LNK2001: 无法解析的外部符号 @__security_check_cookie@4
LINK : error LNK2001: 无法解析的外部符号 _WinMainCRTStartup
这是什么原因?是不是在vc2008下面写sdk程序有新的方法?
//menuplus.cpp
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;//在窗口类中定义菜单的字符串名
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("欢迎你的到来!"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
int wmpara; //这个参数是提取出WM_COMMAND消息参数WPAPAM的低16位
//部分,用以判断用户选了菜单的什么命令
switch (message)
{
case WM_COMMAND: //消息循环中多了一个WM_COMMAND消息,它的作用是当用户
//点击菜单中的命令时发送这个消息.
wmpara=LOWORD(wParam);
switch(wmpara)
{
case IDM_EXIT://当用户选择了文件中的退出后windows给程序发送的WM_COMMAND消
//息参数中的ID号
DestroyWindow(hwnd);
return 0;
case IDM_DISP://当用户选择了编辑中的显示后windows给程序发送
//的WM_COMMAND消息参数中的ID号
MessageBox(hwnd,"你好,欢迎你来到VC之路!","对话框",NULL);
return 0;
}
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("选择菜单上的退出或显示来看看不同的效果!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//menuplus.rc
#include "resource.h"
HelloWin MENU DISCARDABLE
BEGIN
POPUP "文件"
BEGIN
MENUITEM "退出", IDM_EXIT
END
POPUP "编辑"
BEGIN
MENUITEM "显示", IDM_DISP
END
END
//resource.h
#define IDM_EXIT 40001
#define IDM_DISP 40002
------解决方案--------------------------------------------------------
你创建的是Win32项目,不是控制台项目
Win32项目的入口点函数是WinMain
控制台项目入口点函数是main
因为创建的是Win32项目,不是控制台项目,所以,要在对应的项目属性中做更改!
在项目默认值中的 “MFC的属性中”改为 “ 在静态库中使用 MFC”
问题应该可以得到解决
------解决方案--------------------------------------------------------
是不是没有包含一些lib
------解决方案--------------------------------------------------------
VC .NET 与 VC6的变化有点大哦,直接转换可能有点问题