我使用ado从数据库中读取字符传,数据库中是vchar型的,内容为"12345",返回后是_bstr_t类型,然后我强行转化为LPCTSTR类型,代码内容如下:
  TCHAR tstr[20];
  _tcscmp(tstr,m_pset->Fields->GetItem("name")->value);
  MessageBox(NULL,tstr,_T("提示"),MB_OK);
  TCHAR str[]=_T("12345");
  MessageBox(NULL,str,_T("提示"),MB_OK);
  if(_tcscmp(str,tstr)!=0)
  {
     MessageBox(NULL,_T("不相等"),_T("提示"),MB_OK);
   }结果这段代码执行后总是显示不相等,而MessageBox出来是一模一样的,我无法想通原因,后来我用_tcslen分别取tstr,和str的大小,结果一个是10,一个是5,可见一个应该是单字节字符串,一个是双字节,由于我在这方面没什么了解,请问各位大侠可有办法动态判定字符串类型,并作相应变换,然后使它们相等?希望各位大侠多多指教。

解决方案 »

  1.   

    上面是示例代码,有一点错误,代码第二行应该是
    _tcscpy(tstr,(_bstr_t)(m_pset->Fields->GetItem("name")->value);
    不好意思!
      

  2.   

    我想可以这样试一试(只是个想法而已)
    uchar ch
    一个个读到ch中,然后转化成int看看值(双字节的高位可能是0,或者是统一标志)再次申明,只是个想法,我没实践过,你可以试一试
      

  3.   

    当你没有定义_UNICODE编译的时候,TCHAR 就是char,
    请确认m_pset->Fields->GetItem("name")->value的类型和当前TCHAR tstr[20];的实际类型一致,否则发生类型转换。
      

  4.   

    to:oldworm(oldworm) 
    我正是希望它发生类型转换啊,如果转换为一模一样的,我比较的时候就可以保证类型一致,事实上我就是不能保证其类型,因为MessageBox出来一样,而取其长度时候却不一样,我从数据库中读出数据后是直接转换为_bstr_t类型,而_bstr_t虽然是封装BSTR的一个类,但是它支持直接转换为LPCTSTR,而在我的程序中,从上面的代码可以看出,是没有定义_UNICODE宏的,而且我在程序中也测试了,确实没有定义_UNICODE宏(这个其实从程序一开始就应该知道,如果不使用com,是用不到UNICODE的),也就是说LPCTSTR就是const char*类型,如果发生强行转换,理论上说来结果应该就char类型的"12345",使用_tcscmp出来的结果就是0才对,但结果就是不对,我想不通得很,哎,这该死的字符串。
      

  5.   

    我无法单步,我的程序是win32appliction建的,使用debug就非法操作,我又改不来,所以就只好狂MessageBox达到接近单步的效果
      

  6.   

    本来就是不相等的,你需要的是什么?字符串处理自己来的话,向来是非常头疼的问题,你最好是全部使用unicode,能够省掉很多的事情
      

  7.   

    _tcscpy do not care about you string type , when it find a \n,the string is end ,just copy it , it can not auto change type for you , otherwise it will make mistake,  use
    IsDBCSLeadByte(BYTE TestChar) to test the string /see msdn
    then use MultiByteToWideChar(....) to covert // see msdn