我有个程序,会将一些数据保存到Clipboard中,然后再粘贴.
在程序运行之前,用户可能已经使用Clipboard保存了一些数据,这些数据的格式未知(文本,图片,OLE甚至是文件或者是几种情况的组合).在程序运行完后,应该将Clipboard中的数据恢复到程序运行之前的状况.如何保存和恢复这些数据??最好有代码,或给个链接也行.
先谢过了!

解决方案 »

  1.   

    http://www.codeproject.com/clipboard/cbbackup.asp 这个吗?
      

  2.   

    // stdafx.h : include file for standard system include files,
    //  or project specific include files that are used frequently, but
    //      are changed infrequently
    //#if !defined(AFX_STDAFX_H__A83F042D_F57E_4DB4_99E9_7A7A56C1EDD3__INCLUDED_)
    #define AFX_STDAFX_H__A83F042D_F57E_4DB4_99E9_7A7A56C1EDD3__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers#include <afxwin.h>         // MFC core and standard components
    #include <afxext.h>         // MFC extensions
    #include <afxdisp.h>        // MFC Automation classes
    #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h> // MFC support for Windows Common Controls
    #endif // _AFX_NO_AFXCMN_SUPPORT#include <afxtempl.h>//{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_STDAFX_H__A83F042D_F57E_4DB4_99E9_7A7A56C1EDD3__INCLUDED_)
    //
    //
    //
    //
    //
    //
    // ClipboardBackup.h: interface for the CClipboardBackup class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_CLIPBOARDBACKUP_H__B2363083_E96C_4F7E_8D2D_39A0C3A7046C__INCLUDED_)
    #define AFX_CLIPBOARDBACKUP_H__B2363083_E96C_4F7E_8D2D_39A0C3A7046C__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000/*#define CF_TEXT             1
    #define CF_BITMAP           2
    #define CF_METAFILEPICT     3
    #define CF_SYLK             4
    #define CF_DIF              5
    #define CF_TIFF             6
    #define CF_OEMTEXT          7
    #define CF_DIB              8
    #define CF_PALETTE          9
    #define CF_PENDATA          10
    #define CF_RIFF             11
    #define CF_WAVE             12
    #define CF_UNICODETEXT      13
    #define CF_ENHMETAFILE      14#if(WINVER >= 0x0400)
    #define CF_HDROP            15
    #define CF_LOCALE           16
    #define CF_MAX              17
    #endif // WINVER >= 0x0400#define CF_OWNERDISPLAY     0x0080
    #define CF_DSPTEXT          0x0081
    #define CF_DSPBITMAP        0x0082
    #define CF_DSPMETAFILEPICT  0x0083
    #define CF_DSPENHMETAFILE   0x008E*/class CClipboardBackup  
    {
    public:
    CClipboardBackup();
    virtual ~CClipboardBackup();public:
    BOOL Backup ();
    BOOL Restore();public:
    struct ClipboardData
    {
    UINT   m_nFormat;
    TCHAR  m_szFormatName[100];
    UINT   m_nLength;
    LPVOID m_pData;
    };private:
    VOID ClearBackupDatas();
    CList <ClipboardData, ClipboardData&> m_lstData;
    };#endif // !defined(AFX_CLIPBOARDBACKUP_H__B2363083_E96C_4F7E_8D2D_39A0C3A7046C__INCLUDED_)
    //
    //
    //
    //
    //
    //
    // ClipboardBackup.cpp: implementation of the CClipboardBackup class.
    //
    ////////////////////////////////////////////////////////////////////////#include "stdAfx.h"
    #include "stdafx.h"
    #include "ClipboardBackup.h"//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CClipboardBackup::CClipboardBackup()
    {
    Backup();
    }CClipboardBackup::~CClipboardBackup()
    {
    ClearBackupDatas();
    }BOOL CClipboardBackup::Backup()
    {
    if( ! ::OpenClipboard(NULL) )
    return FALSE; ClearBackupDatas(); UINT format = 0;
    while( (format = ::EnumClipboardFormats(format)) != 0 )
    {
    ClipboardData data;
    data.m_nFormat = format; if( format <= 14 )
    data.m_szFormatName[0] = 0;
    else if( GetClipboardFormatName(format, data.m_szFormatName, 100) == 0 )
    data.m_szFormatName[0] = 0; HANDLE hMem = ::GetClipboardData( format );
    if( hMem == NULL )
    continue; data.m_nLength = ::GlobalSize(hMem); LPVOID pMem = ::GlobalLock( hMem );
    data.m_pData = new byte[data.m_nLength]; memcpy(data.m_pData, pMem, data.m_nLength); m_lstData.AddTail(data);
    } ::CloseClipboard();
    return TRUE;
    }BOOL CClipboardBackup::Restore()
    {
    if( ! ::OpenClipboard(NULL) )
    return FALSE; ::EmptyClipboard(); POSITION pos = m_lstData.GetHeadPosition();
    while( pos != NULL )
    {
    ClipboardData & data = m_lstData.GetNext( pos ); UINT format = data.m_nFormat; if( data.m_szFormatName[0] != 0 )
    {
    UINT u = RegisterClipboardFormat( data.m_szFormatName );
    if( u > 0 ) format = u;
    } HANDLE hMem = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_DDESHARE, data.m_nLength );
    LPVOID pMem = ::GlobalLock( hMem ); memcpy( pMem, data.m_pData, data.m_nLength ); ::GlobalUnlock( hMem ); ::SetClipboardData( format, hMem );
    } ::CloseClipboard();
    return TRUE;
    }VOID CClipboardBackup::ClearBackupDatas()
    {
    POSITION pos = m_lstData.GetHeadPosition();
    while( pos != NULL )
    {
    ClipboardData & data = m_lstData.GetNext( pos ); delete [] data.m_pData;
    } m_lstData.RemoveAll();
    }void main()
    {
    CClipboardBackup b;
    b.Backup();
    b.Restore();
    }
      

  3.   

    上面代码编译有错误如下,请指教:--------------------Configuration: yyy - Win32 Debug--------------------
    Compiling...
    ClipboardBackup.cpp
    Linking...
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
    Debug/yyy.exe : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.yyy.exe - 3 error(s), 0 warning(s)
      

  4.   

    project->settings->c/c++->category下拉框选择code generation,
    use runtime library下拉框选择Debug MultiThreaded或Debug MultiThreaded DLL
      

  5.   

    谢谢!
    选用Debug MultiThreaded模式,编译没有问题,但是不管是debug版本还是release版本一运行就终止.
    设断点直接进入汇编环境,可以汇编太差,看不懂.无法调试.折磨死了,先睡,明天继续!
      

  6.   

    下了试一下,确有很多错误。一查,发现在ClipboardBackup.h中用到了CList,马上在该文件开头加上:#include <afxtempl.h>,运行无误。
      

  7.   

    我的是VC++6.0下,MFC标准对话框工程,其它类型工程没试。楼主既已加了#include <afxtempl.h>,应当没问题了。不知你的是什么IDE环境,什么类型工程?你可以新建一个工程试一下。
      

  8.   

    选用的是Win32 Application,
    我最终是希望把这个做成一个.dll给vb程序调用.
    今天在公司试了一下(VC6.0),编译能过,但也是一运行就终止了.Snow_Ice11111(雪上加冰) 你的能运行吗??
    如果方便希望你能把你的工程发送给我 [email protected] ,谢谢!
      

  9.   

    Atomictry(天影) ( ) 信誉:106 
    已回复邮件
    非常感谢!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    上面哪个例子我在MFC AppWizard中已经OK
    现正将其转成dll
      

  10.   

    vb和vc的dll都已经OK,Game over!