剪貼板文件操作,還有關(guān)于字符串,以及Unicode的代碼

字號(hào):

項(xiàng)目需要用到復(fù)制粘貼工作,主要是文件!
    void CClipDlg::OnOK()
    {
    COleDataObject odj;
    if( odj.AttachClipboard() )
    {
    if( odj.IsDataAvailable( CF_HDROP ) )
    {
    STGMEDIUM StgMed;
    FORMATETC fmte = { CF_HDROP,(DVTARGETDEVICE FAR *)NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL };
    if( odj.GetData( CF_HDROP, &StgMed, &fmte ) )
    {
    HDROP hDrop = (HDROP)StgMed.hGlobal;
    CopyFileNames( hDrop );
    if (StgMed.pUnkForRelease)
    StgMed.pUnkForRelease->Release();
    else
    GlobalFree(StgMed.hGlobal);
    return;
    }
    }
    }
    }
    void CClipDlg::CopyFileNames( HDROP hDrop )
    {
    UINT cFiles = ::DragQueryFile(hDrop, (UINT)-1, NULL, 0);
    CString szText;
    szText.Format( "There are %d files/directories\r\n", cFiles );
    char szFile[MAX_PATH];
    for( UINT count = 0; count < cFiles; count++ )
    {
    ::DragQueryFile(hDrop, count, szFile, sizeof(szFile));
    szText += szFile;
    szText += "\r\n";
    }
    MessageBox(szText);
    }
    void CClipDlg::OnButton1()
    {
    char sFiles[] = "C:\\Temp\\file1.txt\0C:\\Temp\\file2.txt"; //這些都是剪貼板內(nèi)容格式,看著那個(gè)0
    //MessageBox(sFiles); Examda提示:這里會(huì)從\0處截?cái)?,看看下面的sizeof會(huì)是真正的長(zhǎng)度,寫函數(shù)的話想想怎么傳遞
    DROPFILES dobj = { 20, { 0, 0 }, 0, 1 };//在SDK里面
    int nLen = sizeof(sFiles);//sizeof算是操作符,很字符串關(guān)系沒(méi)有關(guān)系比如char s[10]={0};sizeof(s);
    int nGblLen = sizeof(dobj) + nLen*2 + 5;//這些都是SDK中定義的
    HGLOBAL hGbl = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, nGblLen);
    //修改內(nèi)存地址
    {
    char* sData = (char*)::GlobalLock(hGbl);//返回內(nèi)存地址
    memcpy( sData, &dobj, 20 );
    char* sWStr = sData+20;//這一句是個(gè)不錯(cuò)的指針操作
    for( int i = 0; i < nLen*2; i += 2 )
    sWStr[i] = sFiles[i/2];
    }
    GlobalUnlock(hGbl);
    if( OpenClipboard() )
    {
    EmptyClipboard();
    SetClipboardData( CF_HDROP, hGbl );
    CloseClipboard();
    }
    }
    //char c[]="12345";//sizeof=6;strlen=5
    //char *c = "123456";//sizeof=4(指針大小);strlen=6
    //char c[]="123456789";c[5]=0;//sizeof=10;strlen=5;
    char c[10]="12345";//sizeof=10;strlen=5;
     提示:發(fā)現(xiàn)不支持中文,需要把中文轉(zhuǎn)換成unicode,使用函數(shù)的話會(huì)在\0那里截?cái)?,在網(wǎng)上又沒(méi)有找到ansi->unicode轉(zhuǎn)換規(guī)律,因?yàn)樵谑M(jìn)制編輯器中發(fā)現(xiàn)ansi和unicode文件中的ascii碼有規(guī)律但是中文我沒(méi)有找出來(lái)!