一个API小程序编译问题

kekailiyuan 2009-12-28 05:09:01
源码为:
#include <windows.h>
#include <stdio.h>


LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbClsExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName="kekai";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW|CS_VREDRAW;

RegisterClass(&wndcls);

HWND hwnd;
hwnd=CreateWindow("kekai","窗口编程",WS_OVERLAPPED,0,0,500,500,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);


MSG msg;
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);



}
return 0;
}

LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{case WM_CHAR:
char szchar[20];
sprintf(szchar,"char is %d",wParam);
MessageBox(hwnd,szchar,"kekai",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"Mouse Click!","kekai",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"点击左键的显示结果",strlen("点击左键的显示结果"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDc;
PAINTSTRUCT ps;
hDc=BeginPaint(hwnd,&ps);
TextOut(hDc,0,10,"哈哈加油",strlen("哈哈加油"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束","哈哈",MB_YESNO))
{
DestroyWindow(hwnd);

}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);

}
return 0;
}







编译没有问题,可是执行创建的时候下面的状态栏的结果却是
--------------------Configuration: winmainnow - Win32 Debug--------------------
Linking...
LINK : fatal error LNK1168: cannot open Debug/winmainnow.exe for writing
执行 link.exe 时出错.


这是为什么呢?我用的是VC6版本的,操作系统是XP。
请高手帮忙看看,我在线等回复!!!!!!!!!!!
...全文
133 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
clhposs 2010-01-26
  • 打赏
  • 举报
回复
因此你窗体销毁就return 0了 导致了 没有窗体 就没有事件,,导致GetMessage 一直等待
clhposs 2010-01-26
  • 打赏
  • 举报
回复
窗体销毁了 但是说你没有退出消息循环
PostQuitMessage
CoolEagel 2010-01-26
  • 打赏
  • 举报
回复
菜鸟在学习中~
  • 打赏
  • 举报
回复
MSDN里面有实例啊!
kekailiyuan 2010-01-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kekailiyuan 的回复:]
你说的意思是在任务管理器中将WAINMAINNOW这个进程关掉,然后再重新进行编译运行是不是????
[/Quote]--------------------Configuration: winmainnow - Win32 Debug--------------------
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/winmainnow.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

winmainnow.exe - 1 error(s), 0 warning(s)
我改了之后是这样的结果,我后来发现那个return 0应该是没有问题的,我是看孙鑫的视频学着编的,他那里面就编出来了,我觉得应该是我的VC的设置有什么问题,你觉得呢,楼主?
并且,我看过程序管理器,没有发现这个程序在运行!!!!
好纠结啊?????
fox000002 2010-01-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kekailiyuan 的回复:]
引用 3 楼 kekailiyuan 的回复:
你说的意思是在任务管理器中将WAINMAINNOW这个进程关掉,然后再重新进行编译运行是不是????
--------------------Configuration: winmainnow - Win32 Debug--------------------
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/winmainnow.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

winmainnow.exe - 1 error(s), 0 warning(s)
我改了之后是这样的结果,我后来发现那个return 0应该是没有问题的,我是看孙鑫的视频学着编的,他那里面就编出来了,我觉得应该是我的VC的设置有什么问题,你觉得呢,楼主?
并且,我看过程序管理器,没有发现这个程序在运行!!!!
好纠结啊?????
[/Quote]

这是 subsystem 不对,导致链接时入口函数对不上

要么重新建 win32 application 项目,重新添加源码

要么直接改 subsystem 项设置
srbycc 2010-01-15
  • 打赏
  • 举报
回复
太好拉`被我看到这样的代码~~努力学习中
kekailiyuan 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 loaden 的回复:]
引用 5 楼 kekailiyuan 的回复:
好的,程序在家里笔记本上,我是在网吧上网求助的,回去如果成功的话我会立即把积分给你,如果不成功的话恐怕要继续麻烦你了。

嗯,有问题就给我PM。
这是一个标准的Win32程序,你参考下。
C/C++ code#define WINVER 0x0501#define _WIN32_WINNT 0x0501#define _WIN32_IE 0x0501#define _RICHEDIT_VER 0x0200

#include<Windows.h>
#include<tchar.h>

#include<CommCtrl.h>#pragma comment(lib,"comctl32.lib")#define DEF_AppName _T("Hello World!")#define DEF_ClassName _T("Hello World! - QPSOFT.COM")

LRESULT CALLBACK WndProc(HWND wndHandle, UINT msg, WPARAM wpa, LPARAM lpa);int WINAPI _tWinMain(HINSTANCE inst, HINSTANCE/*prevInst*/, PTSTR/*cmdLine*/,int cmdShow)
{
INITCOMMONCONTROLSEX icc= {sizeof(INITCOMMONCONTROLSEX), ICC_WIN95_CLASSES};
::InitCommonControlsEx(&icc);

WNDCLASSEX wcex;
::ZeroMemory(&wcex,sizeof(WNDCLASSEX));

wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW| CS_VREDRAW;
wcex.lpfnWndProc= WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance= inst;
wcex.hIcon= ::LoadIcon(NULL, IDI_APPLICATION);
wcex.hIconSm= wcex.hIcon;
wcex.hCursor= ::LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
wcex.lpszMenuName= NULL;
wcex.lpszClassName= DEF_ClassName;if (!::RegisterClassEx(&wcex))
{
::MessageBox(NULL, _T("This program requires Windows NT!"), DEF_AppName, MB_ICONERROR);return0;
}
HWND wndHandle= ::CreateWindowEx(0, DEF_ClassName, DEF_AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, inst, NULL);

::ShowWindow(wndHandle, cmdShow);
::UpdateWindow(wndHandle);

MSG msg;while (int ret= ::GetMessage(&msg, NULL,0,0)!=0)
{if (ret==-1)break;// handle the error and possibly exitelse
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND wndHandle, UINT msg, WPARAM wpa, LPARAM lpa)
{
PAINTSTRUCT ps;
HDC hdc;switch (msg)
{case WM_CREATE:
{
::MessageBox(wndHandle, _T("Welcome to QPSOFT.COM ...^_^"), DEF_AppName, MB_OK);
}return0;case WM_PAINT:
{
hdc= ::BeginPaint(wndHandle,&ps);
RECT rc;
::GetClientRect(wndHandle,&rc);
::DrawText(hdc, DEF_AppName,-1,&rc, DT_SINGLELINE| DT_CENTER| DT_VCENTER);
::EndPaint(wndHandle,&ps);
}return0;case WM_DESTROY:
::PostQuitMessage(0);return0;
}return ::DefWindowProc(wndHandle, msg, wpa, lpa);
}
[/Quote]

哈,多谢了!我学C++才半年,目前正在努力编一个俄罗斯方块,多谢你的帮助。
「已注销」 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kekailiyuan 的回复:]
好的,程序在家里笔记本上,我是在网吧上网求助的,回去如果成功的话我会立即把积分给你,如果不成功的话恐怕要继续麻烦你了。
[/Quote]
嗯,有问题就给我PM。
这是一个标准的Win32程序,你参考下。
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0200

#include <Windows.h>
#include <tchar.h>

#include <CommCtrl.h>
#pragma comment(lib,"comctl32.lib")

#define DEF_AppName _T("Hello World!")
#define DEF_ClassName _T("Hello World! - QPSOFT.COM")

LRESULT CALLBACK WndProc(HWND wndHandle, UINT msg, WPARAM wpa, LPARAM lpa);

int WINAPI _tWinMain(HINSTANCE inst, HINSTANCE /*prevInst*/, PTSTR /*cmdLine*/, int cmdShow)
{
INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), ICC_WIN95_CLASSES};
::InitCommonControlsEx(&icc);

WNDCLASSEX wcex;
::ZeroMemory(&wcex, sizeof(WNDCLASSEX));

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = inst;
wcex.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
wcex.hIconSm = wcex.hIcon;
wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
wcex.lpszMenuName = NULL;
wcex.lpszClassName = DEF_ClassName;

if (!::RegisterClassEx(&wcex))
{
::MessageBox(NULL, _T("This program requires Windows NT!"), DEF_AppName, MB_ICONERROR);
return 0;
}
HWND wndHandle = ::CreateWindowEx(0, DEF_ClassName, DEF_AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, inst, NULL);

::ShowWindow(wndHandle, cmdShow);
::UpdateWindow(wndHandle);

MSG msg;
while (int ret = ::GetMessage(&msg, NULL, 0, 0) != 0)
{
if (ret == -1) break; // handle the error and possibly exit
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}

return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND wndHandle, UINT msg, WPARAM wpa, LPARAM lpa)
{
PAINTSTRUCT ps;
HDC hdc;

switch (msg)
{
case WM_CREATE:
{
::MessageBox(wndHandle, _T("Welcome to QPSOFT.COM ...^_^"), DEF_AppName, MB_OK);
}
return 0;

case WM_PAINT:
{
hdc = ::BeginPaint(wndHandle, &ps);
RECT rc;
::GetClientRect(wndHandle, &rc);
::DrawText(hdc, DEF_AppName, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
::EndPaint(wndHandle, &ps);
}
return 0;

case WM_DESTROY:
::PostQuitMessage(0);
return 0;
}

return ::DefWindowProc(wndHandle, msg, wpa, lpa);
}
kekailiyuan 2009-12-28
  • 打赏
  • 举报
回复
好的,程序在家里笔记本上,我是在网吧上网求助的,回去如果成功的话我会立即把积分给你,如果不成功的话恐怕要继续麻烦你了。
「已注销」 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kekailiyuan 的回复:]
你说的意思是在任务管理器中将WAINMAINNOW这个进程关掉,然后再重新进行编译运行是不是????
[/Quote]
是的。
因为虽然窗口销毁了,但进程并没有退出。
kekailiyuan 2009-12-28
  • 打赏
  • 举报
回复
你说的意思是在任务管理器中将WAINMAINNOW这个进程关掉,然后再重新进行编译运行是不是????
「已注销」 2009-12-28
  • 打赏
  • 举报
回复
    default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);

}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


处理WM_CLOSE后,一定不要返回0!
「已注销」 2009-12-28
  • 打赏
  • 举报
回复
winmainnow这个程序还没有退出。
任务管理器,杀掉!

24,853

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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