现在的位置: 首页 > 综合 > 正文

vs2008 MFC 常见错误 vs2008 MFC 常见错误–新员工常犯的错误!

2013年12月04日 ⁄ 综合 ⁄ 共 18778字 ⁄ 字号 评论关闭

vs2008 MFC 常见错误--新员工常犯的错误!

分类:
MFC

1404人阅读
评论(4)
收藏
举报

  (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不能放在析构函数里。

 

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下;不然两个线程之间有一个线程一直获取不到锁;

  (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不能放在析构函数里。

 

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下;不然两个线程之间有一个线程一直获取不到锁;

抱歉!评论已关闭.