1、1一. (2013/3/17 遇到)unresolved external symbol _endthreadex 错误解决在用 VC6.0 写程序调试时,初学者总是会遇到一些错误,针对如下错误主要是因为 MFC 类库没有引用所出现的问题。错误现象:nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadexDebug/jnH
2、id.exe : fatal error LNK1120: 2 unresolved externalsError executing link.exe.解决错误的方法:选择 ProjectSettings-General-Microsoft foundation Classes下拉列表中有三个选项:1、Not using MFC2、Use MFC in a Static Libray3、Use MFC in a Shared DLL二unresolved external symbol _endthreadex 错误解决在用 VC6.0 写程序调试时,初学者总是会遇到一些错误,针对如下错误主
3、要是因为 MFC 类库没有引用所出现的问题。错误现象:nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadexDebug/jnHid.exe : fatal error LNK1120: 2 unresolved externalsError executing link.exe.解决错误的方法:选择 ProjectSet
4、tings-General-Microsoft foundation Classes下拉列表中有三个选项:1、Not using MFC2、Use MFC in a Static Libray3、Use MFC in a Shared DLL本文来自 CSDN 博客,转载请标明出处:http:/ : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadex2libcd.lib(
5、crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/Hello.exe : fatal error LNK1120: 3 unresolved externals第一种解决方法:1、“Project”-“settings”-“c/c+”“Catagory” 选择“Code Generation”“use run-time library”选择“debug multithreaded”此时确定一般解决问题,也有可能出现如下问题提示:libcmtd.lib(crt0.obj) : error LNK2001: unres
6、olved external symbol _mainDebug/Hello.exe : fatal error LNK1120: 1 unresolved externals此时,进行第二步操作:2、Project Settings 选择“Link“属性页,在 Project Options 中将/subsystem:console 改成/subsystem:windows温馨提示:在 Project Options 窗口,右边滑动条向下滑动就会找到该项!总结:进行以上两步操作后,问题解决!第二种解决方法:1.检查是否包含头文件 afx.h2.打开 project-settings-gene
7、ral-microsoft foundation classes-选 use MFC in a static library或选 use MFC in a shared DLL(需要把 MFC 的动态库放在 system32 文件夹下) .本人是碰到的nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadex这两行错误,故用
8、第二种方法解决,分析原因是我调用了 MFC 类库,但建立的控制台程序默认不加载 MFC 类库,故需要改此处设置。3第一种方法是在网上搜的,碰到类似的问题可以尝试一下。三(2013/3/18 遇到)#include using namespace std;然后编译时出现 error C2871: std : does not exist or is not a namespace查了一下,原来 C+有两个不同版本的头文件。引入名字空间这个概念以前编译器用的是#include ,而引入名字空间的概念以后 std 名字空间的头文件名字变成了。是比较老的 C+的头文件的版本,而 namespace 是
9、 98 年才被加入C+标准的,所以里面是没有 std 这么个命名空间的,当使用 时,相当于在 c 中调用库函数,使用的是全局命名空间,也就是早期的 c+实现。头文件则没有定义全局命名空间,使用时必须使用 namespace std 才能正确使用 cout。vc6.0 支持这个两个版本. 不过现在都用了 所以只需将以上语句改为:#include using namespace std;或者是 #include 即可。四 (2013/3/18 遇到)cinabendl; 输入流中不能加“endl;”D:Program FilesMicrosoft Visual StudioMyProjectssu
10、msum.cpp(7) : error C2679: binary : no operator defined which takes a right-hand operand of type class ostream void return type assumed 执行 cl.exe 时出错.五 (2013/3/18 遇到)#include int max(int a,int b)if(ab)return a;else return b;int main()4int x,y,max; / int x,y,m;coutxy; /cinxy;max = max(x,y); / m = max
11、(x,y);coutnum;cinscore;void display()cout#include /#include using namespace std;5d:program filesmicrosoft visual studiomyprojectsdecimal pointdecimal point.cpp(2) : fatal error C1083: Cannot open include file: iomainp: No such file or directory执行 cl.exe 时出错.cout/#include (把这一行的注释符号去掉,就正确了。上一行有没有都行)i
12、nt main()char a,b,c;a = B;b = O;c = Y;putchar(a);putchar(b);putchar(c);putchar(n);return 0;d:program filesmicrosoft visual studiomyprojectsiosios.cpp(10) : error C2065: putchar : undeclared identifier执行 cl.exe 时出错.九 (2013/3/19 遇到)#include #include int main()int a;float b;char c;scanf(“%d%f%c“,printf
13、(“a = %d,b = %f,c = %c“,(多了三个 void return type assumed6Linking.printfscanf.exe - 0 error(s), 0 warning(s)#include #include int main()int a;float b;char c;scanf(“%d%f%c“,printf(“a = %d,b = %f,c = %cn“,a,b,c);return 0;#include #include int main()int a;float b;char c;7scanf(“%d %f %c“,(在%d%f%c 中加了两个空格键
14、,本来不显示的 c =后面的弄显示了出来)printf(“a = %d,b = %f,c = %cn“,a,b,c);return 0;十 (2013/3/19 遇到)x2 = (-b-sqrt(b*b-4*a*c)/2a;(应该是 2*a)D:Program FilesMicrosoft Visual StudioMyProjectsequationequation.cpp(21) : error C2059: syntax error : bad suffix on number十一 (2013/3/22 遇到)p/4 = p/4 + (-1)(i-1)/(2*i - 1);d:progr
15、am filesmicrosoft visual studiomyprojects 的近似值 的近似值.cpp(9) : error C2296: : illegal, left operand has type doubled:program filesmicrosoft visual studiomyprojects 的近似值 的近似值.cpp(9) : error C2297: : illegal, right operand has type double意思是:“非法运算。原因,你左边的操作数是 double 型。”通常是你的程序有语法错误,编译器理解为 左边的操作数是 double
16、 型 引起的。十二 (2013/3/22 遇到)if(n = 1|n = 2)f(n) = 1;D:Program FilesMicrosoft Visual StudioMyProjectsFibonacciFibonacci.cpp(7) : error C2106: = : left operand must be l-value十三.(2013/4/15)(没解决)c1 = CWnd:GetDlgCtrlID(IDC_EDIT_NO);/获得编辑框D:Program FilesMicrosoft Visual StudioMyProjectsexeclexeclView.cpp(138
17、) : error C2660: GetDlgCtrlID : function does not take 1 parameters十四.(2013/4/15)VC+环境下连接 SQL Server 数据库方法指导实验类型:设计型8一、实验环境1Windows XP 操作系统;2VC+6.0 开发环境;3SQL server 2000 数据库管理系统。二、实验内容和要求利用 VC 开发应用程序,要求能够通过界面完成对数据库中数据的查询、插入、删除以及修改。三、实验原理VC 访问 SQL Server 数据库,常用的方法有两种:通过 ODBC 连接和通过ADO 连接。下面分别介绍一下。采用 O
18、DBC 方式要求先创建 ODBC 数据源,应用程序通过数据源与数据库连接;并且在创建应用程序时,只能是基于单文档或多文档,而无法直接创建基于对话框的应用程序。采用 ADO 方式无需创建数据源,应用程序可通过 ADO 直接与数据库连接;ADO 方式可以创建基于对话框的应用程序。两种方式都要在应用程序中添加代码以完成相应的初始化功能。四、实验步骤下面通过两个例子分别介绍基于 ODBC 方式和基于 ADO 方式的实验步骤。1 基于 ODBC 方式的实验步骤(1)在 SQL Server2000 中创建数据库 student,该数据库中有学生表 s 用来存放学生信息。s 表的结构如下:属性名 类型 是
19、否为主键 允许空 备注sno char(8) 是 学号sname varchar(10) 否 姓名age int 否 年龄dept char(4) 否 所在系号comment varchar(8) 否 评语s 表的创建方法在此不详述。(2)创建 ODBC 数据源“开始”- “设置”- “控制面板” “管理工具” “数据源(ODBC) ”,打开之后出现如图 1 所示窗口。9图 1点击“添加”按钮,出现图 2。图 2选择 SQL Server,点击“完成” ,出现图 3。图 3名称中填写所创建的数据源的名称,本例中为 student,描述可以不填。因为 SQL Server 的服务器和客户端均安装
20、在本地计算机上,所以服务器为(local) 。如果本地计算机上只安装了客户端,服务器安装在另外的机器上,服务器为另一台机器的名称。点击“下一步” ,出现图 4。10图 4SQL Server 如何验证 ID 的真伪,使用哪种方法要看安装 SQL Server2000时选择的是哪种验证方式。如果是 Windows 验证,选择使用网络登录 ID 的Windows NT 验证;如果是混合验证模式则要选择下面一种。本例中采用Windows 验证。进入数据库无需另外的用户名和密码。点击“下一步” ,出现图 5。图 5这里要更改默认的数据库,默认情况下数据源所连接的数据库为 master,这里要改为 st
21、udent 数据库。点击“下一步” ,出现图 6。图 6这里无需修改,点击“完成”出现图 7。11图 7点击“测试数据源” ,如果测试成功说明数据源已成功创建。(3)创建 VC 应用程序。打开 VC+6.0,新建工程,如图 8 所示。选择 MFC AppWizard(exe) ,工程名为 exec1,存放在 D 盘实验文件夹里。图 8点击“确定” ,在出现的窗口中选择“单文档” ,点击“下一步” ,出现图9。图 9这里选择“查看数据库不使用文件支持” ,还要选择数据源,点击“数据12源” ,弹出如图 10 所示窗口。图 10选择“student”数据源,点击“OK” ,在弹出的窗口中选择表 d
22、bo.s,点击“OK”返回图 9 所示的界面。以后的创建步骤中没有需要修改的地方可以直接点击完成。这样工程 exec1 就创建完成了,并且通过数据源与数据库发生了关联。创建好的工程可以运行,结果如图 11 所示。图 11(4)界面设计在工作区左边的树型结构中,选择 ResourceView,展开 Dialog 节点,双击IDD_EXEC1_FORM,打开该对话框。在这里添加所需控件。如图 12 所示。图 12此时运行程序,结果如图 13 所示。13图 13从界面可以看出程序要完成的功能。完整的程序运行后,界面默认显示表中的第一条数据,点击工具栏中的“下一记录”可以显示下一条记录;点击“删除”按
23、钮可将当前显示的数据从库中删除;点击“清除”按钮,将所有编辑框清空;在界面输入学生信息,点击“添加”按钮可将此学生信息输入至数据库;点击“修改”按钮可修改当前显示的学生信息。为界面上的编辑框和按钮添加变量和函数。在界面右键单击,选择“建立类向导” ,弹出如图 14 所示窗口。图 14本例中需要为编辑框 IDC_AGE, IDC_COMMENT, IDC_DEPARTMENT, IDC_NAME, IDC_SNO 添加变量。以 IDC_AGE 为例,点击“ADD Variable”弹出如图 15 所示窗口。下一记录14图 15在下拉框中选择 m_pSet-m_age 为变量名,这里的变量是与数据
24、库表 s 中的字段相对应的,变量类型也与 s 中的字段类型对应。其它变量的添加方法相同。为按钮添加函数比较简单,双击按钮即可。添加的函数在 exec1View.cpp文件中。(5)代码设计“清除”按钮所添加的函数为 OnClear(),具体代码如下:/名称:OnClear/功能:清除编辑框中的内容void CExec1View:OnClear() CWnd* c1;c1= CWnd:GetDlgItem(IDC_SNO);/获得编辑框c1-SetWindowText(“); /将编辑框置空c1= CWnd:GetDlgItem(IDC_NAME);c1-SetWindowText(“); c1
25、= CWnd:GetDlgItem(IDC_DEPARTMENT);c1-SetWindowText(“); c1= CWnd:GetDlgItem(IDC_AGE);c1-SetWindowText(“); c1= CWnd:GetDlgItem(IDC_COMMENT);c1-SetWindowText(“); “添加”按钮所添加的函数为 OnAdd(),具体代码如下:/名称:OnAdd/功能:插入一条记录void CExec1View:OnAdd() / TODO: Add your control notification handler code here/判断年龄是否合适CStri
26、ng strAge;GetDlgItem(IDC_AGE)-GetWindowText(strAge);int nAge = atoi(strAge.GetBuffer(0);if(nAge120)AfxMessageBox(“输入的年龄不符合实际!“);return;/呈增加状态m_pSet-AddNew();UpdateData();/更新数据库m_pSet-Update();15/重新获得数据m_pSet-Requery();UpdateData(FALSE);“删除”按钮所添加的函数为 OnDelete(),具体代码如下:/名称:OnDelete/功能:删除当前记录void CExec
27、1View:OnDelete() / TODO: Add your control notification handler code here/发出删除命令m_pSet-Delete();/重新获得记录集m_pSet-Requery();UpdateData(FALSE);“修改”按钮所添加的函数为 OnEdit(),具体代码如下:/名称:OnEdit/功能:修改当前记录void CExec1View:OnEdit() / TODO: Add your control notification handler code here/判断年龄是否合适CString strAge;GetDlgIt
28、em(IDC_AGE)-GetWindowText(strAge);int nAge = atoi(strAge.GetBuffer(0);if(nAge120)AfxMessageBox(“输入的年龄不符合实际!“);return;/呈编辑状态m_pSet-Edit();UpdateData();/更新数据库m_pSet-Update();/重新获得记录集m_pSet-Requery();UpdateData(FALSE);(6)运行结果16图 16172 基于 ADO 方式的实验步骤此例中所用数据库与上例中相同;此例中无需创建数据源。(1)创建 VC 应用程序打开 VC+6.0,新建工程。
29、选择 MFC AppWizard(exe) ,工程名为 exec2,存放在 D 盘实验文件夹里。点击“确定” ,在弹出的窗口中选择“基本对话框”,以后的步骤没有需要修改的地方,可以直接点击“完成。 ”这样一个基于基本对话框的工程就创建好了。(2)界面设计在工作区左边的树型结构中,选择 ResourceView,展开 Dialog 节点,双击IDD_EXEC2_DIALOG,打开该对话框。在这里添加所需控件。如图 17 所示。图 17为编辑框和列表框添加变量。在界面右键单击,选择“建立类向导” ,弹出如图 18 所示窗口。图 18本例中需要为编辑框 IDC_AGE, IDC_COMMENT, I
30、DC_DEPT, IDC_NAME, IDC_SNO,列表框 IDC_LIST 添加变量。以 IDC_AGE 为例,点击“ADD Variable”弹出如图 19 所示窗口。18图 19这里变量名为 m_age,类型可从下拉框里选。添加变量完成之后类向导如图 20 所示。图 20为按钮添加函数,双击按钮可为其添加函数,在 exec2Dig.cpp 文件里。(3)与 ADO 相关的代码设计引入 ADO 库文件,使用 ADO 前必须在工程的 StdAfx.h 头文件里用直接引入符号#import 引入 ADO 库文件,以使编译器能正确编译。代码如下所示:/加入 ADO 支持库#import “c:
31、program filescommon filessystemadomsado15.dll“ no_namespace rename (“EOF“, “adoEOF“) 定义 ADO 连接变量指针,在 exec2.h 文件的 class CExec2App : public CwinApp 方法中添加代码如下:/ 定义 ADO 连接变量指针_ConnectionPtr m_pConnection;该指针为整个应用程序共享,所以放在 public 下面。定义 ADO 连接、命令、记录集变量指针,在 exec2Dlg.h 文件的 class CExec2Dlg : public CDialog 方
32、法中添加如下代码:/ 定义 ADO 连接、命令、记录集变量指针19_ConnectionPtr m_pConnection;_CommandPtr m_pCommand;_RecordsetPtr m_pRecordset;该指针为整个应用程序共享,所以放在 public 下面。初始化 OLE/COM 库环境。必须注意的是,ADO 库是一组 COM 动态库,这意味应用程序在调用 ADO 前,必须初始化 OLE/COM 库环境。在 MFC 应用程序里,一个比较好的方法是在应用程序主类的 InitInstance 成员函数里初始化OLE/COM 库环境。在本例中,在 exec2.cpp 文件的 B
33、OOL CExec2App:InitInstance()成员函数里添加如下代码:/初始化 COM,创建 ADO 连接等操作AfxOleInit();m_pConnection.CreateInstance(_uuidof(Connection);/在 ADO 操作中建议语句中要常用 try.catch()来捕获错误信息,/因为它有时会经常出现一些想不到的错误try /打开本地 Sql Server 库 studentm_pConnection-Open(“driver=SQL Server; Server=lenovo-pc;Database=student;UID=“;PWD=“,“,“,a
34、dModeUnknown);/Server 后是服务器的计算机名,Database 后是数据库名/这里使用的 windows 验证,没有设置用户名和密码,/如果是 windows 和 SQL server 混合验证,UID=“;PWD=“要写入相应的用户名和密码catch(_com_error e)AfxMessageBox(“数据库连接失败!“);return FALSE; 在 exec2Dlg.cpp 文件中添加代码。在#endif 下面添加如下代码:extern CExec2App theApp; / 在此引用应用类中的 theApp 来获取库连接指针在 BOOL CExec2Dlg:O
35、nInitDialog()函数中添加如下代码:20/ TODO: Add extra initialization here/使用 ADO 创建数据库记录集m_pRecordset.CreateInstance(_uuidof(Recordset);/ 在 ADO 操作中建议语句中要常用 try.catch()来捕获错误信息,/ 因为它有时会经常出现一些想不到的错误trym_pRecordset-Open(“SELECT * FROM s“, / 查询 s 表中所有字段theApp.m_pConnection.GetInterfacePtr(),/ 获取库接库的 IDispatch 指针adO
36、penDynamic,adLockOptimistic,adCmdText);catch(_com_error *e)AfxMessageBox(e-ErrorMessage();至此,与 ADO 相关的代码都已添加完了。下面在 exec2Dlg.cpp 文件中添加应用代码。(4)与功能相关的代码设计在界面上用到列表框,当鼠标点击列表框的某一行时,其中的数据能够在编辑框中显示出来,这要用到列表框的一个函数。添加此函数的方法如下:摁住 Ctrl 和 w 键,进入类向导,如图 21 所示。图 2121选择 IDC_LIST,在右边的 Messages 下面选择 LBN_SELCHANGE,然后点击
37、“Add Function”按钮,最后点击“确定”按钮,即为列表框添加了此函数。具体代码如下:/名称:OnSelchangeList/功能:当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来void CExec2Dlg:OnSelchangeList() int curSel = m_list.GetCurSel();_variant_t var,varIndex;if(curSel MoveFirst();m_pRecordset-Move(long(curSel);var = m_pRecordset-GetCollect(“sname“);if(var.vt != VT_NU
38、LL)m_sname = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(“age“);if(var.vt != VT_NULL)m_age=(LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(“sno“);if(var.vt != VT_NULL)m_sno = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(“dept“);if(var.vt != VT_NULL)m_dept = (LPCSTR)_bstr_t(var);var =
39、 m_pRecordset-GetCollect(“comment“);if(var.vt != VT_NULL)m_comment = (LPCSTR)_bstr_t(var);UpdateData(false);22catch(_com_error *e)AfxMessageBox(e-ErrorMessage();将数据库中的数据显示在列表框中,添加函数 ListData()。添加的方法是,在工作区左边的树型结构中,选择 ClassView,右键单击 CExec2Dlg,在弹出的菜单中选择 Add Member Function,出现如图 22 所示的窗口,类型为void,函数描述为 L
40、istData()。图 22此函数的具体代码如下:/名称:ListData/功能:将数据库中的数据显示在列表框中void CExec2Dlg:ListData()_variant_t var;CString strname,strage,strsno,strdept,strcom;/清空列表框m_list.ResetContent();strname=strage=strsno=strdept=strcom=“;/在 ADO 操作中建议语句中要常用 try.catch()来捕获错误信息,/因为它有时会经常出现一些想不到的错误。tryif(!m_pRecordset-BOF)m_pRecords
41、et-MoveFirst();elseAfxMessageBox(“表内数据为空“);return;23/ 读入库中各字段并加入列表框中while(!m_pRecordset-adoEOF)var = m_pRecordset-GetCollect(“sno“);if(var.vt != VT_NULL)strsno = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(“sname“);if(var.vt != VT_NULL)strname = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetColl
42、ect(“age“);if(var.vt != VT_NULL)strage = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(“dept“);if(var.vt != VT_NULL)strdept = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(“comment“);if(var.vt != VT_NULL)strcom = (LPCSTR)_bstr_t(var);m_list.AddString( strsno + “ “ +strname + “ “+strage+ “
43、“+ strdept+ “ “+ strcom);m_pRecordset-MoveNext();/ 默认列表指向第一项,同时移动记录指针并显示m_list.SetCurSel(0);OnSelchangeList();catch(_com_error *e)AfxMessageBox(e-ErrorMessage();24插入按钮对应的函数代码如下:/名称:OnWritedata/功能:将编辑框中输入的学生信息插入到 s 表中void CExec2Dlg:OnWritedata() UpdateData();if(m_sname = “ | m_sno = “)AfxMessageBox(“
44、学号和姓名信息不能为空!“);return;/在 ADO 操作中建议语句中要常用 try.catch()来捕获错误信息,/因为它有时会经常出现一些想不到的错误。try/ 写入各字段值m_pRecordset-AddNew();m_pRecordset-PutCollect(“sno“, _variant_t(m_sno);m_pRecordset-PutCollect(“sname“, _variant_t(m_sname);m_pRecordset-PutCollect(“age“, atol(m_age);m_pRecordset-PutCollect(“dept“, _variant_t
45、(m_dept);m_pRecordset-PutCollect(“comment“, _variant_t(m_comment);m_pRecordset-Update();AfxMessageBox(“插入成功!“);/ 更新显示其库内容int nCurSel = m_list.GetCurSel();ListData();m_list.SetCurSel(nCurSel);/ 移动记录指针到新的位置OnSelchangeList();catch(_com_error *e)25AfxMessageBox(e-ErrorMessage();修改按钮对应的函数代码如下:/名称:OnModif
46、y/功能:修改学生信息void CExec2Dlg:OnModify() UpdateData(); / 更新对话框数据if(m_list.GetCount() = 0)AfxMessageBox(“表中记录数为空!“);return;else if(m_list.GetCurSel() m_list.GetCount()m_list.SetCurSel(0);/ 修改当前记录的字段值trym_pRecordset-PutCollect(“sno“, _variant_t(m_sno);m_pRecordset-PutCollect(“sname“, _variant_t(m_sname);m
47、_pRecordset-PutCollect(“age“, atol(m_age);m_pRecordset-PutCollect(“dept“, _variant_t(m_dept);m_pRecordset-PutCollect(“comment“, _variant_t(m_comment);m_pRecordset-Update();/ 重新读入库记录更新显示int nCurSel = m_list.GetCurSel();ListData();m_list.SetCurSel(nCurSel);/ 移动记录指针到新的位置OnSelchangeList();catch(_com_err
48、or *e)26AfxMessageBox(e-ErrorMessage();删除按钮对应的函数代码如下:/名称:OnDelete/功能:删除选中的学生信息void CExec2Dlg:OnDelete() if(m_list.GetCount() = 0)return;else if(m_list.GetCurSel() m_list.GetCount()m_list.SetCurSel(0);try/ 删除当前行记录m_pRecordset-Delete(adAffectCurrent);m_pRecordset-Update();/ 删除列表中当前值int nCurSel = m_list.GetCurSel();m_list.DeleteString(nCurSel);if(nCurSel = 0 else if(m_list.GetCount() != 0)m_list.S