(1)picture 控件添加成员变量时,出现无效的过程调用或参数
解决办法:找到头文件
// 对话框数据
enum { IDD = IDD_LDXXXX_DIALOG };
后面添加下面这行;
enum cust_enum{};
(2)vc 6.0 升级到vs2005
错误 1 error C2668: “pow”: 对重载函数的调用不明确
dlg.m_colors = static_cast<DWORD>(pow( 2, 3*8 ));
d:/program files/microsoft visual studio 8/vc/include/math.h(575): 可能是“long double pow(long double,int)”
d:/program files/microsoft visual studio 8/vc/include/math.h(527): 或“float pow(float,int)”
d:/program files/microsoft visual studio 8/vc/include/math.h(489): 或“double pow(double,int)”
试图匹配参数列表“(int, int)”时
正确的使用为pow(2.0, 3*8)
(3)stack overflow
局部变量,数组的空间不能太大,比如 char buff[2M];这样会报stack overflow错误,解决方法是从堆中使用new分别内存,比如 char *buff=new char[2M];window下局部变量空间不能超过1M
。
(4)用VS调试程序的时候有,加载符号加载时间长,解决办法如下:
在VS2008的安装目录的IDE文件夹下(我机器上是F:\DevelopTools\VS2008\Common7\IDE)新建一个symsrv.ini文件,我们可以在里面设置想要排除的文件。因为我全都不想加载,所以就*.*,文件内容
如下:
-------------------------------------------------------------------------------------------------
[exclusions]
*.*
(5) localtime_s 获取时间month的取值范围0-11,获取时间month必须加1
time_t t = time(0);
struct tm tm;
localtime_s(&tm, &t);
(6)如何使菜单栏变灰
CMenu* pMenu = GetMenu();
pMenu-> EnableMenuItem(ID_SYS,MF_GRAYED);
(7)如何设置快车键
BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg-> message==WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case 72://H
if (::GetKeyState( VK_CONTROL)<0)
{
((CButton*)GetDlgItem(IDC_XXX_EDIT))->EnableWindow(FALSE);
return TRUE;
}
break;
case 83: //S
if (::GetKeyState(VK_CONTROL)<0)
{
((CButton*)GetDlgItem(IDC_XXX_EDIT))->EnableWindow(TRUE);
return TRUE;
}
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
(8)资源文件.rc 报错 fatal error RW1022:I/O error writing file
发现硬盘空间不够了。
(9)UpdateData(FALSE)和UpdateData(TRUE)的区别
UpdateData(true)取对话框上控件的值,UpdateData(false)把值赋给取对话框上控件。
(10)SQL insert 不能添加2个指针
删除.ncb文件
(11)CAboutDlg:不是类或者命名空间名称;GetMessageMap :非成员函数上不容许修饰符。
是不是将类的最后的;删除了
(12)memcpy 拷贝内存错误 今天给一个同学调试程序发现,呵呵!气晕!
struct buffer{
char *buffer;
unsigned int length;
unsigned int valid_len;
};
buffer m_buffer;
m_buffer.buffer=new char [1024]
在构造函数里面对buffer进行了new分配内存,后面对memcpy(m_buffer.buffer,"aa",2)尽然出错,后面检查,发现它又将对m_buffer这个结构体清空了,使用了
memset(&m_buffer,0,sizeof(m_buffer)); 直接把我气晕!
(13)vc 如何判断一个路径是否为合法路径
#include <shlwapi.h> //判断路径是否为合法路径
#pragma comment(lib, "shlwapi.lib")
if (PathIsDirectory(strImgdirPath))
其中strImgdirPath 为路径,如果PathIsDirectory返回为true,说明路径是合法路径,如果返回为false,说明不合法;
(14) 数组的控件分配太大,不行,今天一个同事要我帮他调试程序,最后发现是 BYTE buff 【2000000】,编译没错,运行发现有错,最后发现不能搞这么大的数组,需要new 分配一段空间;
(15) MFC 主对话框调用子对话框函数出错;
调试发现,没有定义将定义子对话框的对象,而是在一个函数中定义了一个局部的对象,然后也没有domodel,直接用这个对象访问子对话框中的函数,就报错了。
(16) combo box 下拉框控件,如何限制不能输入值,而只能从下拉框里面选;
vs2008 下降type属性设为DropList
(17)MFC CFileDialog 如何限制只选择特定文件;
CFileDialog dlg(TRUE,NULL,"xxxxxxxx", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"(xxxxxxxx)|lxxxxxxxx||");
(18)fatal error C1083: 无法打开包括文件:“afxcontrolbars.h”: No such file or directory
安装vs2008 sp1补丁。
(19)当数据库的选项允许为空时 而且此时内容为空 则一下查询会出错
strPosInfo= m_pRecordset->GetCollect("列名");
解决办法:
_variant_t var;
var= m_pRecordset->GetCollect("列名"); //可能为空!
if(var.vt != VT_NULL) //为NULL
{
strPosInfo = var;
}
else
{
strPosInfo = “”;
}
(20)线程中的socket处于accept的阻塞状态,如何使得线程顺利退出?
使用Select 设置超时,check_read;
(21)std::string 的注意的地方;
char *pbuff=new char[1000];
std::string str(pbuff+ibegin,pbuff+iend); //注意这个地方是闭开区间,即[ibegin,iend)之间的数;
std::string str.substr(pbuff+ibegin,len);注意len是从ibegin开始的len长度,还不是末尾的地址;
string memcpy 时,特别要注意结束符号的情况,有可能会少copy一个字符;sprintf和sprintf_s都要注意!
(22)sokcet 客户端 connect不成功时
注意是不是忘记了 #include <WinSock2.h>
(23)在程序中调用GetDlgItem函数,编译后运行出现下面的错误: Debug Assertion Failed!
常见问题:DoModal后调用GetDlgItem导致以上错误
产生原因:这时候窗口已经关闭,没有DlgItem一说
解决方法:在退出前保存为成员变量,Member Vari;
或者创建非模态对话框,指针可直接调用GetDlgItem()
(24)STL vector 和list的区别
vector 没有push_front和pop_front,而list有这两个,新员工有时容易犯这个错误!
(25)VS2008中使用winpcap时关于头文件netioapi.h的问题
解决方法有两个
1、修改VS2008中netioapi.h文件的#include <ntddndis.h>为#include “ntddndis.h”来包含本地目录的头文件
2、定义宏__IPHLPAPI_H__来避免冲突,这个好处不要修改库的头文件
(26)warning C4251: class“std::vector<_Ty>”需要有 dll 接口由 class
使用指针代替,举例如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> *p = new vector<int>();
int a=5,b=7;
p->push_back(a);
p->push_back(b);
vector<int>::iterator iter=p->begin();
while(iter!=p->end())
cout<<*iter++<<endl;
system("pause");
return 0;
}
(27)error C2664: “int CListCtrl::InsertColumn(int,LPCTSTR,int,int,int)”: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”
原因是:
m_MyList.InsertColumn(0,_T("姓名"),LVCFMT_LEFT,100,-1);
""字符串的地方都要添加_T();或者改为宽字节
(28)fatal error LNK1104: 无法打开文件“E:\xxx.obj”
原因:1)磁盘空间不足,2)目录太长;3)目录有空格
29)今天发现Sleep主线程,或者WaitForSingleObject 等待子线程信号时,程序死锁了,定位发现在子线程中应用了操作了MFC的对话框资源,挂起主线程时,MFC资源也挂起了。
现象如下:
子线程:
showMfc控件;
SetEvent;
主线程:
Sleep(5000);
WaitForSingleObject
就死锁了。
30) win7下在析构函数中调用KillTimer定时器,报错: Debug Assertion Failed ...axfwin2.inl Line:196
KillTimer不能放在析构函数里。因为KillTimer是属于对话框的,而调用析构函数时,对话框已经关掉了,这时在KillTimer会出错;
31)WaitForSingleObject 能等待什么信号,信号什么激发?
1、具体要问要等什么信号哪,这个信号是什么哪?这个要等的信号就是我们程序产生的一个句柄,而这个句柄指向的是一个对象;
2、激发和信号是什么关系?其实就是一个对象激发了,它就产生了一个信号,没有激发,它当然就没有信号。呵呵,不要想的太复杂;激发是系统内部的一个动作,比如你被打了一下,你就疼,打就是
一个动作,就像对象被激发一样;疼就是有信号了。如果不被打一下怎么会产生疼这个信号,所以对象被激发产生了一个信号。
3、哪些对象可以产生信号?
什么情况下这些对象可以被激发产生有信号?那就是
1、线程对象,当线程结束的时候会被激发状态,没有结束的时候是未激发状态;
2、进程对象,当进程结束的时候会被激发状态,没有技术的时候是未激发状态;
3、文件对象,当一个文件或目录发生一件特别大的事情,比如:文件对象产生或删除一个子目录,产生、删除、重新命名一个文件,目录及目录的任何属性改变,最后写入时间的改变,任何安全属性的
改变都会激发文件对象为激发状态;
4、Console input; 当窗口的输入缓冲区有数据可用的时候变为激发状态;
5、Event, SetEvent()可以激发产生信号,ResetEvent()可以使它无信号;
6、Mutex ; 当没有一个线程拥有它时,它就处于激发态,一旦一个线程拥有它就处于未激发态
7、 Semaphore; 当拥有Semaphore的线程的个数大于0就处于激发态,当等于0就处于未激发态;
32)Rtsp流程中opinion,descript,setup,play,teardown的作用?
33) 定义一个结构,如下,在一个类中定义一个变量;
typedef struct {
BYTE *yuv_buff;
DWORD width;
DWORD height;
}Yuv422Data;
class A{
private:
Yuv422Data *pBuff;
|
然后在构造函数中:
pBuff->yuv_buff=new [1024*768];
pBuff->width=1024;
pBuff->height=768;
这样会有内存冲突,比如先为pBuff指针分配内存;然后在这样做,或者不定义指针变量,还是定义个结构体变量,Yuv422Data pBuff;
然后 构造函数中
pBuff-.yuv_buff=new [1024*768];
pBuff.width=1024;
pBuff.height=768;
34)Wireshark找不到网卡的解决办法
no interface can be used for capturing in this system with the current configuration. See Capture Help below for details?
有时候装完WireShark,在Capture Interfaces里面却找不到网卡,抓不到包。遇到这种情况,重启进入安全模式,打开C:\WINDOWS\system32\drivers目录,看看是不是有“nvmini.sys”这个文件。把
这个文件删掉,再新建一个文本文件,重命名为“nvmini.sys”并设置属性为“只读”。
这个“nvmini.sys”是一个病毒文件,至于怎么影响WireShark的,就不太清楚了。
最近windows 2008和windows 7的电脑也遇到wireshark找不到网卡的情况,但是又找不到nvmini.sys这个文件。重新安装的时候提示“NPF驱动没有运行,可能会导致找不到网卡”(大致是这样的)。在
网上找到了结果,在命令提示符中输入“net start npf”并回车即可。XP/WIN7/WIN2008下都是这个命令,只是WIN7/WIN2008需要以管理员身份运行CMD。
http://ask.wireshark.org/questions/1281/npf-driver-problem-in-windows-7
35)socket connect函数一直返回0,即成功;
定位发现是安装杀毒软件造成的,avast或卡巴斯基都可能造成这个问题,他占用了8080的端口;
36)socket 小包发送延迟问题;
将socket的属性设置成nodelay
37)vector push_back error
http://connect.microsoft.com/VisualStudio/feedback/details/629626/debug-assert-on-calling-of-std-vector-insert-with-iterator-returned-from-std-vector-erase
38)visual studio 2008 调用vector的clear()函数 导致 "vector iterators incompatible"错误
解决办法:
只好这么做,就可以:
while(!vec.empty() )
{
vec.pop_back();
};
--------------------------------------------------------------------------------
while(!vector() )
{
vector.pop_back();
};
或者
for( int i = 0, int length = vector.size(); i < length; i++ )
{
vector..erase( vector..begin() );
}
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/6c6c1a6f-c9a0-4174-9786-0c08eaaba915/
39)HEAP[xxx.exe]:Invalid Address specified to RtlValidateHeap 错误的解决方法总结
http://www.verydemo.com/demo_c173_i2702.html
(40)
pWnd= GetDlgItem(IDC_XXX); 返回NULL,遇到的这个问题的原因是在父类的对话框中添加一个函数,在函数内定义了一个子对话框的局部变量,然后使用domodel()弹出子对话框,然后在父对话框中
定义了一个子对话框的成员变量,使用这个成员变量去访问子对话框的成员函数,这个时候就报这个错误了,原因是这个成员变量根本没有关联子对话框的信息,修改办法,就是将局部变量改成类的成
员函数,然后在Domodel就可以了!
41)
解决鼠标左键按下,鼠标形状不改变问题;添加一个消息函数,在消息函数中改变鼠标形状;
BOOL CXXXXtDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (XXXXX)
{
SetCursor((HCURSOR)::LoadCursor(NULL,IDC_SIZEALL));
return true;
}else
{
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
}
42) Debug 版本编译没有问题,而Release编译出现链接错误;
原因:1)使用的字符集可能不同,一个为unicode,一个为多字节;2)release 下将全程序优化从使用链接时间代码生成修改成无全程序优化;3)一个对话框调用另外一个对话框时,用指针对象,对对象
分配内存;
43)非对话框的类中include对话框类的头文件时,需要include "resource.h";有时对话框不能增加消息函数如(Button),原因可能是resource.h中ID重复;
44).dll 需要拷贝到运行文件的主目录下;
45)ListControl 控件相应单击时,如何确定是单击的哪一行,哪一列,注意将屏幕坐标转换成客户区坐标;
HitTest:得到当前鼠标位置的Item
其实关键是要有ScreenToClient这个函数的使用,我先前没有用这个函数,HitTest老是返回-1,搞得我都头大了。不过这个不能用于SubItem,那应该要用SubItemHitTest
LVHITTESTINFO ht ;
GetCursorPos(&(ht.pt)) ;
m_friendList.ScreenToClient(&ht.pt) ;
m_friendList.HitTest(&ht) ;
if(ht.iItem == -1) //检查是否有item选中
return ;
SubItemHitTest:
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
/****************************************/
/* 确定单击的listctrl的行列号 方法1 */
/****************************************/
/*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format( "单击的是第%d行第%d列 ", lvinfo.iItem, lvinfo.iSubItem);
}
*pResult = 0;
}
46)CString 内存拷贝的问题
typedef struct {
CString AA;
CString BB;
}AA_BB
AA_BB A_A,B_B;
A_A.AA="hello world";
A_A.BB="world hello";
memcpy(&B_B,&A_A,sizeof(AA_BB));
这样是有问题的,因为CString是个指针,sizeof(AA_BB)=8;
所以会出现问题;
48)winxp 和win7 的临界区是不同的(http://bbs.csdn.net/topics/360015533),所以在使用临界区时,应该在Enter前或Leave后Sleep下;不然两个线程之间有一个线程一直获取不到锁;
49)使用ffmpeg时应该注意的问题,ffmpeg是C语言的,在c++中应用时需要extern,不然连接时会有错误的。
extern "C"
{
#include <libavutil/mathematics.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}
50)MFC对话框增加工具栏时,双击工具栏的区域,会闪烁,下层显示一个另外的对话框?
原因创建对话框时,create 增加了CCS_ADJUSTABLE,去掉解决问题:
51)ffmpeg解码分辨率变化时,异常处理;
iDecodeWidth=DecodecContext->width;
iDecodeHeight=DecodecContext->height;
H264DecodeDeInit();
H264DecodeInit(iDecodeWidth,iDecodeHeight);
//上一次解码失败,在解码一次
if (len != H264BuffLen)
{
len => printf("decode error\n");
return DECODE_ERROR;
}
}
}
avcodec_decode_video2成功后,avpkt的Buff是无效的,此时不能再调用avcodec_decode_video2在进行解码,这样会造成内存错误;
52)调用一个库,在析构的时候,delete pObject; 出现vector deleting destruction 堆栈内存错误;
原因是其它地方堆栈出现了问题;
53)
54)
其它请看:
vs2008 MFC 常见错误--新员工常犯的错误《二》!