項(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)!
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)!

