自己定义程序入口启示
2007-10-23 14:15
302 查看
今天在看Windows Graphics Programming Win32 GDI and DirectDraw®一书时,作者说为了使程序尽可能的小可以自己写启动函数,然后指定为入口点,将多个节合并,这样可以生成很小的程序,觉的比较的意思,所以就CP书中的SRC到VC下。结果报错。哎呀!汗呀。
在网上找了半天,也没有找到个解决的方法。只好自己试了。当我连接动态库时却不会出错,尝试连接各种库,报错只在连接静态调试库时才出错,对于非调试库不存在上面的问题。刚开始以为只于所建工程有关,结果在WIN32 CON/APP下有同样的错误说找不到main.
这个主要是程序中用到了C库函数_tcstrlen,如果不用C库应该就不会出错了吧。于是我将它换成了Windows的函数lstrlen,但是问题还是存在。不用C库函数还是有错。没有法只好禁止去连接LIBCD.lib结果报错,找不到__chkesp,这下才明白。调试版中要检查堆栈指针合法性是编译器自动加入了__chkesp,函数应该是在C库中。那只有连接动态库或非调版本库时才能解决这个问题了。但是最后还是没有明白。为什么静态调试库会报错,而动态库不会出错呢。请高人指点。
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/REL.exe : fatal error LNK1120: 1 unresolved externals
下面是代码,我没有怎么改原来程序:(下面程序如果要调试版本也成功只有去连接动态库,加入
#pragma comment(lib, "msvcrtd.lib")就可以了..)
#pragma comment(linker, "-merge:.rdata=.text")
#pragma comment(linker, "-merge:.data=.text")
#pragma comment(linker, "-align:512")
#pragma comment(linker, "/subsystem:windows")
#pragma comment(linker, "/entry:KWinMainCRTStartup" )
#include <windows.h>
#include <tchar.h>
#include <assert.h>
void CenterText(HDC hDC, int x, int y, LPCTSTR szFace, LPCTSTR szMessage, int point)
...{
HFONT hFont = CreateFont(point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,
0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, VARIABLE_PITCH, szFace);
// assert(hFont);
HGDIOBJ hOld = SelectObject(hDC, hFont);
SetTextAlign(hDC, TA_CENTER | TA_BASELINE);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0, 0, 0xFF));
TextOut(hDC, x, y, szMessage, _tcstrlen(szMessage));
SelectObject(hDC, hOld);
DeleteObject(hFont);
}
const TCHAR szMessage[] = _T("Hello, World");
const TCHAR szFace[] = _T("Times New Roman");
void KWinMainCRTStartup()
...{
HDC hDC = GetDC(NULL);
// assert(hDC);
CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,
GetSystemMetrics(SM_CYSCREEN) / 2,
szFace, szMessage, 72);
ReleaseDC(NULL, hDC);
ExitProcess(0);
}
哎,不会写文章内...大家见量希望大家能发表下自己的看法....非常感谢;)......
在网上找了半天,也没有找到个解决的方法。只好自己试了。当我连接动态库时却不会出错,尝试连接各种库,报错只在连接静态调试库时才出错,对于非调试库不存在上面的问题。刚开始以为只于所建工程有关,结果在WIN32 CON/APP下有同样的错误说找不到main.
这个主要是程序中用到了C库函数_tcstrlen,如果不用C库应该就不会出错了吧。于是我将它换成了Windows的函数lstrlen,但是问题还是存在。不用C库函数还是有错。没有法只好禁止去连接LIBCD.lib结果报错,找不到__chkesp,这下才明白。调试版中要检查堆栈指针合法性是编译器自动加入了__chkesp,函数应该是在C库中。那只有连接动态库或非调版本库时才能解决这个问题了。但是最后还是没有明白。为什么静态调试库会报错,而动态库不会出错呢。请高人指点。
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/REL.exe : fatal error LNK1120: 1 unresolved externals
下面是代码,我没有怎么改原来程序:(下面程序如果要调试版本也成功只有去连接动态库,加入
#pragma comment(lib, "msvcrtd.lib")就可以了..)
#pragma comment(linker, "-merge:.rdata=.text")
#pragma comment(linker, "-merge:.data=.text")
#pragma comment(linker, "-align:512")
#pragma comment(linker, "/subsystem:windows")
#pragma comment(linker, "/entry:KWinMainCRTStartup" )
#include <windows.h>
#include <tchar.h>
#include <assert.h>
void CenterText(HDC hDC, int x, int y, LPCTSTR szFace, LPCTSTR szMessage, int point)
...{
HFONT hFont = CreateFont(point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,
0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, VARIABLE_PITCH, szFace);
// assert(hFont);
HGDIOBJ hOld = SelectObject(hDC, hFont);
SetTextAlign(hDC, TA_CENTER | TA_BASELINE);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0, 0, 0xFF));
TextOut(hDC, x, y, szMessage, _tcstrlen(szMessage));
SelectObject(hDC, hOld);
DeleteObject(hFont);
}
const TCHAR szMessage[] = _T("Hello, World");
const TCHAR szFace[] = _T("Times New Roman");
void KWinMainCRTStartup()
...{
HDC hDC = GetDC(NULL);
// assert(hDC);
CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,
GetSystemMetrics(SM_CYSCREEN) / 2,
szFace, szMessage, 72);
ReleaseDC(NULL, hDC);
ExitProcess(0);
}
哎,不会写文章内...大家见量希望大家能发表下自己的看法....非常感谢;)......
相关文章推荐
- 定义避免程序重复运行的互斥量导致无法升级时替换自己重启(delphi)
- .Net——实现IConfigurationSectionHandler接口定义处理程序处理自己定义节点
- 程序片段----std::set中使用自己定义的结构体需要重载小于号 20170904
- 网址重写 由一个任意或是自己定义的地址转到指定的处理程序 4000 上来
- 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)
- 用浏览器控件做界面,网页界面中定义自己的程序事件
- c#Winform程序的toolStripButton自己定义背景应用演示样例源代码
- 模块管理常规功能自己定义系统的设计与实现(53--演示程序和视频解说 )
- 自己编写程序批量合并多个“规范定义电子名片(vCard)”文件
- Extjs4.1+desktop+SSH2 定义程序入口
- 在“更改或删除程序”内添加自己的卸载入口
- 自己编写程序批量合并多个“规范定义电子名片(vCard)”文件
- 像腾讯QQ和Skype一样定义自己的类似HTTP的Web协议,可以通过URL来触发自己的程序(附源码)
- Android四大组件(Activity详解)----如何定义程序主入口
- 程序定义了多个入口点。使用 /main (指定包含入口点的类型)进行编译
- c++ 自己创建的namespace,声明在h文件中,定义在cpp文件中,这种程序结构应该是合理的吧,欢迎不同见解的朋友来讨论。
- 十一、在代码段中定义数据、程序入口、使用栈
- .Net——使用.net内置处理程序处理自己定义节点Demo
- 由普通程序员推广自己的共享软件的启示
- 在linux系统中将自己程序的日志输出到自己定义的文件