用windows sdk写程序,vc6编译成功,vc2008 link出错,为什么

expert2000 2008-12-21 12:24:30
新建一个空的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


...全文
1034 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
字符集不一样而已,比如你的DrawText在unicode环境下应该调用DrawTextW才对。
在他乡奋斗 2011-03-04
  • 打赏
  • 举报
回复
为什么6楼没得分
wonsoft 2008-12-27
  • 打赏
  • 举报
回复
VC .NET 与 VC6的变化有点大哦,直接转换可能有点问题
expert2000 2008-12-26
  • 打赏
  • 举报
回复
连接器的输入选项,我原来选择的是忽略所有的默认库,现在改为否,问题解决。
expert2000 2008-12-26
  • 打赏
  • 举报
回复
在项目属性页的c/c++的代码生成中,选择缓冲区安全检查为否,可以去除error LNK2001: 无法解析的外部符号 @__security_check_cookie@4 这个错误。
maguic 2008-12-24
  • 打赏
  • 举报
回复
是不是没有包含一些lib
expert2000 2008-12-23
  • 打赏
  • 举报
回复
期待能解决问题的人出现。
kugou123 2008-12-21
  • 打赏
  • 举报
回复
你创建的是Win32项目,不是控制台项目
Win32项目的入口点函数是WinMain
控制台项目入口点函数是main

因为创建的是Win32项目,不是控制台项目,所以,要在对应的项目属性中做更改!
在项目默认值中的 “MFC的属性中”改为 “ 在静态库中使用 MFC”
问题应该可以得到解决
expert2000 2008-12-21
  • 打赏
  • 举报
回复
我在MinGW Developer Studio中也能编译通过,执行没问题。
expert2000 2008-12-21
  • 打赏
  • 举报
回复
按照你的方法,得到如下的错误。


------ 已启动生成: 项目: sdk, 配置: Release Win32 ------
正在编译...
sdk.cpp
正在链接...
sdk.obj : error LNK2001: 无法解析的外部符号 @__security_check_cookie@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__RegisterClassA@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__GetStockObject@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__LoadCursorA@8
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__UpdateWindow@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__DispatchMessageA@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__ShowWindow@8
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__DefWindowProcA@16
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__CreateWindowExA@48
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__TranslateMessage@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__MessageBeep@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__LoadIconA@8
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__PostQuitMessage@4
sdk.obj : error LNK2001: 无法解析的外部符号 __imp__GetMessageA@16
LINK : error LNK2001: 无法解析的外部符号 _WinMainCRTStartup
D:\vcprj\sdk\Release\sdk.exe : fatal error LNK1120: 15 个无法解析的外部命令
生成日志保存在“file://d:\vcprj\sdk\sdk\Release\BuildLog.htm”
sdk - 16 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧