1. error C2065: “CString”: 未声明的标识符
在非mfc下使用CString 会导致上面错误:
解决办法:
(1)如果你使用VC.net那么:使用MFC:包含cstringt.h;
不使用MFC:包含atlstr.h
(2)或者 #include <afx.h>
参考来源:http://blog.csdn.net/xlm289348/article/details/7851654 博主:xlm289348
2. CPoint类 简介
CPoint类与Windows POINT结构类似。它还包括用来操纵CPoint和POINT结构的成员函数。
只要POINT结构可以使用的地方,CPoint对象也可以使用。这个类与“大小”有关的操作符可以接受CSize对象或SIZE结构,因为这两者是可以互换的。
注意:这个类派生于tagPOINT结构(名字tagPOINT是POINT结构的不太常用的有关名字)。这意味着POINT结构的数据成员,x和y,也是CPoint的可以访问的数据成员。
#include "atltypes.h"
参考来源:百度百科
3. GetLastError()
在VC中编写应用程序时,经常需要涉及到错误处理问题。许多函数调用只用TRUE和FALSE来表明函数的运行结果。一旦出现错误,MSDN中往往会指出请用GetLastError()函数来获得错误原因。
可问题是,GetLastError()返回的只是一个双字节数值(DWORD)。
目前Win32的出错编号已经从0排到11031,而这还不是错误编码的全部。因为错误代码还在不断增加。
没有人愿意自己去查出错编码所对应的错误信息。
Windows(Windows95以上, Window NT3.1以上)已经提供了现成的错误信息处理函数:FormatMessage()。
以下是用FormatMessage()得到由GetLastError()返回的出错编码所对应错误信息的示例:
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
MessageBox((LPCTSTR)lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
参考来源:http://www.seacha.com/article.php/knowledge/windows/mfc/2011/0423/335.html
4. WM_KILLFOCUS和WM_SETFOCUS
当windows将输入焦点从一个窗口转换到另一个窗口时,它首先给正在失去焦点的窗口发一个WM_KILLFOCUS消息,wParam参数是接收输入焦点的窗口的句柄,
然后window向正在接收输入焦点的窗口发送一个WM_SETFOCUS消息,同时wParam是还在失去输入焦点的窗口的句柄,
(WPARAM为NULL表示没有窗口拥有或正在接收输入焦点)
写个示例:父窗口可以阻止子窗口获得输入焦点.
case WM_KILLFOCUS:
Sethwnd = (HANDLE)wParam ;
if (hwnd == GetParent((HWND)wParam))
{
SetFocus(hwnd) ;
}
break ;
具体参看MSDN
参考来源:http://blog.csdn.net/hgy413/article/details/6440878 博主:花熊
5. 无法解析的外部符号 _WinMain@16
Ctrl+F7 编译的时候没有错误,而F6生成解决方案的时候出现如下两个错误:
1:error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib
2: error LNK1120: 1 个无法解析的外部命令
出这个错误可能有以下几个原因:
一、新建项目是控制台应用程序而程序通过的是WinMian(及windows入口函数)
因为新建项目的时候选择的是控制台应用程序,控制台应用程序的入口是main。而在.CPP文件中提供的是windows入口函数WinMian。
解决办法:
(1)项目->属性->配置属性->C/C++ ->预处理器 中的【预处理器定义】 删除“_CONSOLE” 添加 “ _WINDOWS”
(2)项目->属性->配置属性->连接器->系统中的【子系统】设置为Windows(/SUBSYSTEM:WINDOWS)
(3)生成->重新生成解决方案
二、WinMain的UNICODE版和ANSI版不匹配
为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版。对UNICODE版的程序,C运行库调用wWinMain,而对于ANSI版的则调用WinMain。
解决办法:
(1)将代码中的 int APIENTRY _tWinMain 替换为 int WINAPI wWinMain 或(int WINAPI wWinMain 替换为 int APIENTRY _tWinMain )
(2)生成->重新生成解决方案
参考来源:http://blog.csdn.net/ghevinn/article/details/8697404 博主:hevin
6. error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”
void CscanTestDlg::OnBnClickedScan()
{
// TODO: 在此添加控件通知处理程序代码
hThrd=NULL;
if(!hThrd)
{
hThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetDateFromScannerThread,NULL,0,NULL);
}
}
error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”
原因在于:把类的非静态成员函数传给CreateThread了
可以用静态成员函数包装一下,然后把这个静态成员函数跟对象的指针(this)同时传给CreateThread,
然后在函数中恢复出this指针,再从对象指针上调用你的非静态成员函数。
7. UNICODE下memset的使用
在多字节程序中,memset及ZeroMemory的使用很清楚,如:
char str[10];
memset(str,0,10)或memset(str,0,sizeof(str));
ZeroMemory(str,10)或ZeroMemory(str,sizeof(str))
其中:sizeof(str)==10;
在UNICODE下,应该这样用:
TCHAR str[10];
memset(str,0,20)或memset(str,0,sizeof(str));
ZeroMemory(str,20)或ZeroMemory(str,sizeof(str))
memset(str,'\0',sizeof(str))或memset(str,'\0',20)
memset(str,TEXT('\0'),10*sizeof(TCHAR));
其中:sizeof(str)==20,str字符串分配的内存字节数;若用 wcslen(str),应该是str字符串的实际个数(有效字符个数);
=================================================
在定义时也可以将内存清0,如:TCHAR str[10]=_T("");
TCHAR str[10]=_T("");
等同于
TCHAR str[10];
memset(str,0,20);