我有个程序,会将一些数据保存到Clipboard中,然后再粘贴.
在程序运行之前,用户可能已经使用Clipboard保存了一些数据,这些数据的格式未知(文本,图片,OLE甚至是文件或者是几种情况的组合).在程序运行完后,应该将Clipboard中的数据恢复到程序运行之前的状况.如何保存和恢复这些数据??最好有代码,或给个链接也行.
先谢过了!
在程序运行之前,用户可能已经使用Clipboard保存了一些数据,这些数据的格式未知(文本,图片,OLE甚至是文件或者是几种情况的组合).在程序运行完后,应该将Clipboard中的数据恢复到程序运行之前的状况.如何保存和恢复这些数据??最好有代码,或给个链接也行.
先谢过了!
// 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();
}
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)
use runtime library下拉框选择Debug MultiThreaded或Debug MultiThreaded DLL
选用Debug MultiThreaded模式,编译没有问题,但是不管是debug版本还是release版本一运行就终止.
设断点直接进入汇编环境,可以汇编太差,看不懂.无法调试.折磨死了,先睡,明天继续!
我最终是希望把这个做成一个.dll给vb程序调用.
今天在公司试了一下(VC6.0),编译能过,但也是一运行就终止了.Snow_Ice11111(雪上加冰) 你的能运行吗??
如果方便希望你能把你的工程发送给我 [email protected] ,谢谢!
已回复邮件
非常感谢!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上面哪个例子我在MFC AppWizard中已经OK
现正将其转成dll