sFiles为文件路径,其中有汉字也有英文、数字的
但是需要把它全部转化成双字节字符,
用下面的方法,只有路径中有一个汉字的才可以正常操作,为什么呢?USES_CONVERSION;
memcpy( sData + 20, A2W( sFiles ), nLen*2 ); 怎样改正呢?谢谢,请指教。

解决方案 »

  1.   

    A2W是很好用的,我用了没有问题,我的路径是全英文的。你所谓的不正常操作是指什么?如果实在不行就用MultiByteToWideChar这个函数吧,具体的用法看一下MSDN
      

  2.   

    wchar_t *wszData=new wchar_t[strlen(sFiles)+1];
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,sFiles,-1,wszData,strlen(sFiles)+1);
      

  3.   

    MultiByteToWideChar这个函数吧,A2W老是出现莫名其妙的问题,
    那位大虾有A2W()的详尽的用法解释(NO MSDN),那就太感谢了
      

  4.   

    to luckyker(坷坷)
    你看看用 A2W 转换过来的字符串是什么样子的?
    还有是不是文件路径的问题,比如有的设计得不周全的软件在读文件时如果路径中包含空格的话,则会出现如上提示。
      

  5.   

    是不是MultiByteToWideChar和A2W的作用是一样的,
    就是把单字节变成双字节?是把整个字符串都变吗?也就是说汉字就不变了吧?
      

  6.   

    在单字节转双字节时,汉字是不能简单转换的,实在要做的话就一个一个字节的转吧,在内存中汉字的每个单字节为负值, 而ASCII为正,以此来判断转不转换, 如
    if(g_Camera[no].Position[m] == '\0') break;
    if(g_Camera[no].Position[m]>=0)
    {
    Format1[n] = g_Camera[no].Position[m];
    n++; m++;
    }
    else
    {
    X = (g_Camera[no].Position[m]+256)<<8;
    temp =(g_Camera[no].Position[m+1]+256)+X;
    Format1[n] = temp;
    n++; m++; m++;
    }
      

  7.   

    我一个字节一个字节的看了,
    因为到汉字,一个字节就看不出来是什么了但是好象确实是汉字就给变错了:(
    debug下,value那一栏,前面有个值,应该是ASCII码吧?然后是个'\'一类的
    如:92'\',意思就是'\'的ASCII码是92吧?如果是这样,那么汉字正确的都是负的,而经过A2W之后,就变为正的了所以,是不是汉字变成乱码了?谢谢大家帮助!
      

  8.   

    我又这样试了一下:
    把汉字的地方自己输入进去,可是如果汉字是原来的ACSII码表示还会出错,如果变成由A2W变成的新的就对了。如果说还是需要变一下的话,那么为什么两个汉字以上就不对了呢?反正到现在我还没有一次是两个汉字以上的成功呢我想还是和汉字有关吧?为什么呢?请帮我解释一下吧
    我的源代码如下:
    void CWjjmView::OnEditCopy() 
    {
      file_to_edit=GetFileSelected();
      //文件完全路径的长度
      int nLen=file_to_edit.GetLength();
      char sFiles[MAX_PATH];
      //sFiles中为要复制的文件的路径
        strcpy(sFiles, (LPCTSTR)file_to_edit);
      DROPFILES dobj = { 20, { 0, 0 }, false, true };   //分配一块空间用于存放文件路径
       // total length of files name  
       int nGblLen = sizeof(dobj) + nLen*2+5;//lots of nulls and multibyte_char
       HGLOBAL hGbl = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, nGblLen);
      char* sData = (char*)::GlobalLock(hGbl);
      memcpy( sData, &dobj, 20 );
      
      USES_CONVERSION;
       memcpy( sData + 20, A2W( sFiles ), nLen*2 );

       ::GlobalUnlock(hGbl);
      if( OpenClipboard() )
     {
    EmptyClipboard();
    SetClipboardData( CF_HDROP, hGbl );
    CloseClipboard();
      }
    }
    完成在自己的程序中“复制”文件到剪帖板,在系统的资源管理中可以“粘贴”
    哪位好心人再帮我看看吧,实在是不明白为什么了:(