博文

转unresolved external symbol _main相关错误(2007-12-02 20:16:00)

摘要:2006年09月12日 星期二 下午 09:02 在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex





下面介绍解决的方法:

1. Windows子系统设置错误, 提示:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:console改成/subsystem:windows





2. Console子系统设置错误, 提示:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _W......

阅读全文(1575) | 评论:0

CSpinButtonCtrl使用说明(2007-11-27 13:39:00)

摘要:CSpinButtonCtrl使用说明 2007/05/11 14:01 CSpinButtonCtrl使用起来比较特殊,使用起来,需要注意一些地方.实际的教程也比较少.为了让后人少走弯路,这里写这篇文章以说明.
1.添加EDIT控件
2.添加Spin控件
如果不是这样的顺序的话,使用ctrl+D改变Tab顺序,使spin紧靠edit后面
3.在EDIT控件上面设置group属性(特别注意)
4.在Spin控件上设置
Auto Buddy 为 true
Set Buddy Integer 为 true
Alignment 为 Right Align
5.添加Edit控件 int 变量 m_nNumK;
这个时候点击向下应该可以增加数值
6.在OnInitDialog中添加以下语句
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1))->SetRange(-100, 100);
这个时候向上的箭头为增加,向下的箭头为减小. 大功告成.欢迎留言.     http://hi.baidu.com/dayet/blog/item/75ed0046524c28086b63e51f.html......

阅读全文(5956) | 评论:4

转CListCtrl使用指南有排序(2007-11-26 18:24:00)

摘要:CListCtrl使用指南 2007-06-05 17:24 创建图形列表并和CListCtrl关联:
m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192));
m_image_list.SetBkColor( GetSysColor( COLOR_WINDOW ) );
m_caller_list.SetImageList( &m_image_list, LVSIL_SMALL);
为报表添加4列:
   char *szColumn[]={"昵称","IP地址","登陆时间","状态"};
   int widths[]={100,98,70,55};
   LV_COLUMN lvc;
   lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
   lvc.fmt=LVCFMT_LEFT;
   for(int i=0;i<4;i++) {//插入各列
    lvc.pszText=szColumn[i];
    lvc.cx=widths[i];
    lvc.iSubItem=i;
    m_caller_list.InsertColumn(i,&lvc);
   }
为报表添加两项,以附加方式添加:
char* data[4];
data[0]="所有人";
data[1]="0.0.0.0";
data[3]="在线";
data[2]=new char;
CTime now=CTime::GetCurrentTime();
        CString temp = now.Format("%H:%M:%S");
......

阅读全文(4749) | 评论:0

转CListCtrl应用与排序(2007-11-26 17:59:00)

摘要: http://cache.baidu.com/c?word=vc%2Cclistctrl%3B%C8%E7%BA%CE%3B%C5%C5%D0%F2&url=http%3A//www%2Ezixi%2Enet/article/show%2Easp%3Fid%3D32246%26Page%3D1&p=9f63861e85cc4aff57efcd6f4e&user=baidu#baidusnap1 编程环境VC

初始化:
 DWORD dwStyle;
 dwStyle = m_bzlist.GetStyle();
 dwStyle = LVS_EX_GRIDLINES LVS_EX_FULLROWSELECTLVS_SHOWSELALWAYS ;
 m_bzlist.SetExtendedStyle(dwStyle);
 m_bzlist.SetBkColor(RGB(0xec,0xf1,0xfd));
 m_bzlist.SetTextBkColor(RGB(0xfe,0xFF,0xc6));
插入一列:
 m_bzlist.InsertColumn(0,"编号");
 m_bzlist.SetColumnWidth(0,50);
插入一行:
方法1:
 LV_ITEM lvitem;
 lvitem.pszText="";
 lvitem.mask=LVIF_TEXT;
 lvitem.iSubItem=0;
 lvitem.iItem=0;
 m_jbxxlist.InsertItem(&lvitem);
 m_jbxxlist.SetItemText(0,0,xh);
 m_jbxxlist.SetItemText(0,1,xm);
 m_jbxxlist.SetItemText(0,2,nj);
 方法2:
 m_yktlist.InsertItem(i,"2");
 m_y......

阅读全文(2648) | 评论:0

“右左法则”[重要!!!] (2007-11-26 12:02:00)

摘要:The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

  这是一个简单的法则,但能让你准确理解所有的声明。这个法则运用如下:从最内部的括号开始阅读声明,向右看,然后向左看。当你碰到一个括号时就调转阅读的方向。括号内的所有内容都分析完毕就跳出括号的范围。这样继续,直到整个声明都被分析完毕。

  对上述“右左法则”做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变量名开始,而不是从最内部的括号。

  下面结合例子来演示一下“右左法则”的使用。

  int * (* (*fp1) (int) ) [10];

  阅读步骤:

  1. 从变量名开始 -------------------------------------------- fp1

  2. 往右看,什么也没有,碰到了),因此往左看,碰到一个* ------ 一个指针

  3. 跳出括号,碰到了(int) ----------------------------------- 一个带一个int参数的函数

  4. 向左看,发现一个* --------------------------------------- (函数)返回一个指针

  5. 跳出括号,向右看,碰到[10] ------------------------------ 一个10元素的数组

  6. 向左看,发现一个* --------------------------------------- 指针

  7. 向左......

阅读全文(2650) | 评论:0

WritePrivateProfileString函数说明(2007-11-22 13:42:00)

摘要: 在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下:   一.将信息写入.INI文件中.   1.所用的WINAPI函数原型为: BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);   其中各参数的意义:    LPCTSTR lpAppName 是INI文件中的一个字段名.    LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.    LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.    LPCTSTR lpFileName 是完整的INI文件名.   2.具体使用方法:设现有一名学生,需把他的姓名和年龄写入 c:\stud\student.ini 文件中. CString strName,strTemp;
int nAge;
strName="张三";
nAge=12;
::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");   此时c:\stud\student.ini文件中的内容如下:    [StudentInfo]
   Name=张三   3.要将学生的年龄保存下来,只需将整型的值变为字符型即可: strTemp.format("%d",nAge);
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini"); 二.将信息从INI文件中读入程序中的变量.   1.所用的WINAPI函数原型为: DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDe......

阅读全文(8528) | 评论:4

转使用LARGE_INTEGER查看系统运行时间  (2007-11-21 14:10:00)

摘要:众所周知,windows ce是一个实时操作,因此提供了不少的优先级给用户.优先级最高为0级,也就是说使用0优先级的程序,  可以挂起整个系统,  来运行你的程序 对于实时性比较的领域,  我们作为程序员的  应该清楚的知道你的程序模块运行的时间 是非常必要的. 当然这个模块运行的时间也不是完全的稳定的,  几次运行的时间相差几十毫秒是很正常的.  因此我们只要知道大概的时间就可以了. 当然,  大家非常容易的想到,   先用 GetSystemTime() 获取系统时间1 ,然后处理程序  , 再获取系统时间2  ; 系统时间2 - 系统时间1 , 就是程序的运行时间?    这个方法当然行(在XP 或者 2000下是可以的),   在windows ce下就不行了,  你也可以试一试,   我试的结果,  我知道 这个方法只能精确到秒,   非常的不可靠.  自然而然 我们想到了另一种方法  也是wince下特有的. LARGE_INTEGER Freg;
LARGE_INTEGER Count1, Count2;
QueryPerformanceFrequency(&Freg);  //调用API函数,  这个API函数可是优先级0的函数啊.
QueryPerformanceCounter(&Count1);  //获取时间一 //测试程序;
QueryPerformanceCounter(&Count2);   //获取时间2
double d = (double)(Count2.QuadPart - Count1.QuadPart) / (double)Freg.QuadPart * 1000.0;
//都放大了1000倍拉!    这样的结果还是毫秒级的!!   够强 够牛吧! 当然我们可以利用函数可以做很多很多事,  包括做更精确的定......

阅读全文(6162) | 评论:0

V转C++ CMenu使用总结(2007-11-21 13:57:00)

摘要:CMenu类
LoadMenu()可以从资源中加载菜单 AppendMenu()是在菜单的末尾添加一个菜单项,第二个参数可以使该菜单项对应的命令ID,如ID_FILE_OPEN,也可以使一个弹出菜单的句柄 菜单是个树状结构,对于MFC主界面的菜单,第一级是那种没有ID的菜单项,没有消息处理函数的,如常见的"文件",其他就是子菜单,也就是弹出菜单 给菜单加位图,采用SetMenuBitMaps(), 要求位图数据不能是局部的
......

阅读全文(3100) | 评论:0

大虾对C指针的理解(2007-11-09 14:24:00)

摘要:77535518 13:58:32
 
77535518 13:58:44
这就是
77535518 13:59:00
当定义char c[6]="abc";
77535518 13:59:19
和定义char *d;
_BAT_姜维 13:59:48
图片还没完全打开
77535518 14:00:04
 
_BAT_姜维 14:00:21
o
77535518 14:00:55
看到图了吗?
_BAT_姜维 14:01:02
看到了上一个
_BAT_姜维 14:01:16
o
77535518 14:01:17
呵呵,下一个我又重发的,不用看了
77535518 14:01:54
这样c中的地址是固定的,以后c就不能再被赋值了,像c="123"之类的就不行了
_BAT_姜维 14:02:11
o
77535518 14:03:01
而d作为指针在刚定义时,里面的值是个随机值,它就可以进行赋值操作,比如d=c
_BAT_姜维 14:03:09
o
77535518 14:03:18
这时候,内存图如下:
_BAT_姜维 14:03:28
en
77535518 14:04:31
 
77535518 14:04:53
又贴多了
_BAT_姜维 14:04:57
he
_BAT_姜维 14:05:08
看到了
77535518 14:05:35
那你画一个 d=c+1;的图给我
_BAT_姜维 14:06:27
==
77535518 14:06:30
指针可以任意赋值,甚至可以赋值不同类型的指针
77535518 14:07:27
而数组则不容许赋值,你如果想让C数组内容是“789”就不能用c="789"来进行
77535518 14:07:50
而必须用strcpy(c, "789")来进行了
77535518 14:07:56
内存图如下:
_BAT_姜维 14:07:59
o
_BAT_姜维......

阅读全文(2246) | 评论:0

学习VC++日记(二)(2008-03-20 14:55:00)

摘要:============================================= 11.8 做项目合成函数块时,在未完成全部功能时,可先在一函数内完全实现,之后在把函数内重复的代码分到其他函数,这样就减少数据不一至现象. ================================================== 11.12 memcmp(lptemp2,c2,mSize);比较内存中字符 最好进行进制转换时不返回CString,而直接修改char类型的内存. ================================================== 11.21 QueryPerformanceFrequence 得到系统计数器频率
QueryPerformanceCounter 得到系统计数器当前数值
搭配使用可精确计时(ms)  BeginWaitCursor();
 LARGE_INTEGER Freg;
 QueryPerformanceFrequency(&Freg);
 AfxMessageBox("开始");
 LARGE_INTEGER lpPerformanceCount;
 LARGE_INTEGER lpPerformanceCount2;
 QueryPerformanceCounter(&lpPerformanceCount);
 AfxMessageBox("停止");
 QueryPerformanceCounter(&lpPerformanceCount2);  m_process.SetPos(99);  long Fregpc=(long)Freg.QuadPart;
 str.Format("%ld",Fregpc);
 AfxMessageBox("频率是"+str);  long i=(long)((lpPerformanceCount2.QuadPart-lpPerformanceCount.QuadPart)/Freg.Qua......

阅读全文(13471) | 评论:0