您的位置:首页 > Web前端

VC使用剪切板实现两个应用程序之间的数据交互

2006-07-26 11:24 1206 查看
1:A程序使用OLE剪切板,作为数据发送 
  //获得关键字
 CTime time;
 time=CTime::GetCurrentTime();   //获得当前时间
 strDownFlag=_wtoi(time.Format("%d%H%M%S"));   //将日,时,分,秒转换为关键字

 //将关键字使用自定义格式做为拖放源
 UINT format = RegisterClipboardFormat(_T("MY_FORMAT")); 
 HGLOBAL clipbuffer;
 clipbuffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT | GMEM_DISCARDABLE, sizeof(strDownFlag));
 long * buffer=(long*)GlobalLock(clipbuffer);
 *buffer = strDownFlag; //保存到内存
 GlobalUnlock(clipbuffer);

 //设置拖放
 m_DataSource.CacheGlobalData(format, clipbuffer);
 m_DataSource.DoDragDrop();

2:B程序接收OLE剪切板数据,处理后发送数据到标准剪切板
//判断剪切板格式
 HGLOBAL hMem;
 UINT format = RegisterClipboardFormat(_T("MY_FORMAT")); 
 UINT reformat=RegisterClipboardFormat(_T("MY_REFORMAT"));
 if(pDataObject->IsDataAvailable(format))
 {
//取得数据
  hMem = pDataObject->GetGlobalData(format);
  long* fgd = (long*) GlobalLock(hMem);
  GlobalUnlock(hMem);

//处理,获得相关返回信息
  struct MyFormatData
  {
   long idval;
   TCHAR  strLocalPath[MAX_PATH]; 
  };
  MyFormatData * mydata=new MyFormatData();
  mydata->idval=*fgd;
  TCHAR szLocDirectory[MAX_PATH];
  ::GetCurrentDirectory(MAX_PATH,mydata->strLocalPath);

//将数据保存到标准剪切板
if(OpenClipboard(NULL))
  {
   HGLOBAL clipbuffer;
   EmptyClipboard();
   clipbuffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT | GMEM_DISCARDABLE, sizeof(MyFormatData));
   MyFormatData * buffer=(MyFormatData*)GlobalLock(clipbuffer);
   *buffer = *mydata; //保存到内存
   GlobalUnlock(clipbuffer);
   SetClipboardData(reformat,clipbuffer);
   CloseClipboard();
  }  
 }

3:A程序从标准剪切板读数据
 (使用SetClipboardViewer(),然后响应ON_WM_DRAWCLIPBOARD)
 
//判断剪切板格式
 UINT format = RegisterClipboardFormat(_T("MY_REFORMAT"));
 MyFormatData data;
 if(OpenClipboard())
 {
  HANDLE hData =GetClipboardData(format);

 //如果剪切板内存在这样的数据,则取值
  if(hData)      
 {
   MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
   data = *buffer;
   GlobalUnlock(hData);
   EmptyClipboard();  
   CloseClipboard(); 
 
//判断当前关键字。确认是当前发出的信息 
  if(data.idval==strDownFlag)  
   {

    //取得相关信息,处理
    szLocalDirectory=data.strLocalPath;
    m_thread.BeginThread(Down,(LPVOID)&data);
   }
   return;
  }
  CloseClipboard(); 
 }

以上是当A程序拖放数据到B程序后,取得B程序的相关信息,返回给A,然后由A进行数据传送。这是我公司一人写的两个程序,但后来修改,要实现他们之间的交互。又懒得全部重写,所以使用了该方法来完成,希望可以让别人少费点时间。如果要实现两个应用程序之间的交互,将A,B两程序都加入到剪切板侦听链,注册两个剪切板格式。一程序将数据保存到剪切板,一程序响应WM_DRAWCLIPBOARD消息,读取数据。两者通过关键字来保证数据的正确性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  buffer path struct null
相关文章推荐