Registered Clipboard Formats
Many applications work with data that cannot be translated into a standard clipboard format without loss of information. These applications can create their own clipboard formats. A clipboard format that is defined by an application, is called a registered clipboard format. For example, if a word-processing application copied formatted text to the clipboard using a standard text format, the formatting information would be lost. The solution would be to register a new clipboard format, such as Rich Text Format (RTF).
the most 英[ðə məust]美 [ði most]
特大
clipboard 英 [ˈklɪpbɔ:d] 美 [ˈklɪpˌbɔrd, -ˌbord]
carriage
去背诵
void CcutpasteDlg::OnBnClickedBtnSend()
{
// TODO: Add your control notification handler code here
if (OpenClipboard())
{
CString str;
//HANDLE hClip;
char *pBuf;
EmptyClipboard();
GetDlgItemText(IDC_EDIT_SEND, str);//get data
HGLOBAL hmem = GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//alloca memory
//LPVOID lp = GlobalLock(hmem);
pBuf = (char*)GlobalLock(hmem);
strcpy(pBuf,str);
GlobalUnlock(hmem);
SetClipboardData(CF_TEXT,hmem);
CloseClipboard();
}
}
void CcutpasteDlg::OnBnClickedBtnRecv()
{
// TODO: Add your control notification handler code here
if (OpenClipboard())
{
if (IsClipboardFormatAvailable(CF_TEXT))
{
HGLOBAL hClip;
char *puf;
hClip = GetClipboardData(CF_TEXT);
puf = (char *)GlobalLock(hClip);
GlobalUnlock(hClip);
SetDlgItemText(IDC_EDIT_RECV,puf);
}
CloseClipboard();
}
}
Onpipecreate
handle hpipe;
hpipe = createnamedpipe(.....);
if(invalid_handle_value = hpipe)
{
hpipe = null;
return;
}
handle hEvent; /create manual reset event
hEvent = CreateEvent(...);
if(!hEvent)
{
closehanle(hpipe);
hpipe = null;
return;
}
OVERLAPPED ovlap;
ZeroMemory(&ovlap, sizeof(OVERLAPPED);
ovlap,hEvent = hEvent;
if(!ConnectNamedPipe(hPipe,&ovlap))
{}
if(WAIT_FAILED == WaitForSingleObject(hEvent,INFINITE))
{...}
编程思路:
1,handle hpipe; 定义一个句柄 ,调用createnamedpipe()函数——创建命名管道
2.连接命名管道connectNamedPipe(handle hpipe,LPOVERLAPPED lpOverlapped),首先需定义参数,如果hNameedPipe参数所标示的
管道是用FILE_FLAG_OVERLAPPED标记打开的,并且这个参数不是NULL,则这个参数(LPOVERLAPPED )所指向的OVERLAPPED结构体
中必须包含人工重置事件对象句柄。
3.HANDLE hEvent;
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); ///人工重置事件对象句柄。
OVERLAPPED ovlap;
ZeroMemory(&ovlap, sizeof(OVERLAPPED));
4.可以调用connectNamedPipe(handle hpipe,LPOVERLAPPED lpOverlapped)函数了。这个函数的作用是让服务器等待客户端的连接请求
到来。
5.然后调用WaitForSingleObject()函数等待事件对象(hEvent)变为有信号状态。
6.最后,当请求到所等待的事件对象后,也就是当该事件对象变成有信号状态时,说明已经有一个客户端连接到命名管道的实例上了。
注:每步骤都应有错误检测,此处省略。
OnPIpeRead
void Clesson17NamedPipeSrvView::OnPipeRead()
{
// TODO: Add your command handler code here
char buf[100];
DWORD dwRead;
if (!ReadFile(hPipe,buf,100,&dwRead,NULL))
{
MessageBox("failure!");
return;
}
MessageBox(buf);
}
这里的ReadFile()函数的对象其实是管道。
OnPipeWrite
void Clesson17NamedPipeSrvView::OnPipeWrite()
{
// TODO: Add your command handler code here
char buf[] = "lajioefj";
DWORD dwWrite;
if (!WriteFile(hPipe,buf,strlen(buf)+1, &dwWrite,NULL))
{
MessageBox("write failure!");
return;
}
}
这里的WriteFile()函数的对象其实是管道。
OVERLAPPED structure
Contains information used in asynchronous (or overlapped) input and output (I/O).
SyntaxC++
typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; }; PVOID Pointer; }; HANDLE hEvent; } OVERLAPPED, *LPOVERLAPPED;
Members
-
Internal
-
The status code for the I/O request. When the request is issued, the system sets this member to STATUS_PENDINGto indicate that the operation has not yet started. When the request is completed, the system sets this member to the status code for the completed request.
'CreateFileW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR'
'CreateFileW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR' – VBForums
In this article the author writes:
You have three valid options. All others are invalid. The third of these options is the best.
Option 1: Force ANSI (slower on NT, doesn't work on CE, possible problems with internationalization)
Code:
1
2
|
hFile = CreateFileA(
"C:\\tab.doc"
,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
|
Option 2: Force Unicode (doesn't work on 9x)
Code:
1
2
|
hFile = CreateFileW(L
"C:\\tab.doc"
,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
|
Option 3: Make it easily switchable in the project settings (easy to get working and ideal versions for everywhere)
Code:
1
2
|
hFile = CreateFile(TEXT(
"C:\\tab.doc"
),GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
|
If you include <tchar.h>, you can use _TEXT() or _T() instead of TEXT(), but that is the only permitted variation. Everything else is invalid.
邮槽
邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。油槽是一种单向通信机制,创建邮槽的服务器进程读取数据
,打开邮槽的客户机进程写入数据。
void CMailslotSrvView::OnMailslotRecv()
{
// TODO: Add your command handler code here
HANDLE hMailslot;
//create mailslot
hMailslot = CreateMailslot("\\\\.\\mailslot\\MyMailslot", 0,
MAILSLOT_WAIT_FOREVER, NULL);
if (INVALID_HANDLE_VALUE == hMailslot)
{
MessageBox("create mailslot failure!");
return;
}
char buf[100];
DWORD dwRead;
if (!ReadFile(hMailslot,buf,100,&dwRead,NULL))
{
MessageBox("read data failure!");
CloseHandle(hMailslot);
return;
}
MessageBox(buf);
CloseHandle(hMailslot);
}
void CMailslotCltView::OnMailslotSend()
{
// TODO: Add your command handler code here
HANDLE hMailslot;
//open mailslot
hMailslot = CreateFile(TEXT("\\\\.\\mailslot\\MyMailslot"), GENERIC_WRITE,FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE == hMailslot)
{
MessageBox(TEXT("open mailslot failure!"));
return;
}
char buf[] = "http://www.sunxin.org";
DWORD dwWrite;
//write data to mailslot
if (!WriteFile(hMailslot, buf, strlen(buf)+1, &dwWrite, NULL))
{
MessageBox(TEXT("write data failure!"));
CloseHandle(hMailslot);
return;
}
}
运算符重载:
成员函数运算符重载
#include <iostream>
using namespace std;
class X{
int i;
public:
X(int ii=0){i=ii;}
X operator +(const X &rx){
i+=rx.i;
return X(i);
}
int GetI(){return i;}
};
int main(){
X a(1),b(3);
cout<<(a+b).GetI()<<endl;
return 0;
}
友元函数运算符重载
#include <iostream>
using namespace std;
class Complex{
public:
Complex(double r=0.0,double i=0.0){
real=r;
image=i;
}
friend Complex operator+(const Complex&,const Complex&);
void display();
private:
double real;
double image;
};
Complex operator+(const Complex &c1,const Complex &c2){
return Complex(c1.real+c2.real,c1.image+c2.image);
}
void Complex::display(){
cout<<"("<<real<<","<<image<<"i)"<<endl;
}
int main(){
Complex c1(3,4),c2(5,-10),c3;
c3=c1+c2;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
cout<<"c1+c2=";c3.display();
return 0;
}
内联函数:
内联函数和宏的区别在于,宏是有预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
我们也可以将定义在类的外部的函数定义为内联函数,比如:
Class TableClass{
Private:
Int I,j;
Public:
Int add() { return I+j;};
Inline int dec() { return I-j;}
Int GetNum();
}
inline int tableclass::GetNum(){
return I;
}
上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
类的构造函数,析构函数和赋值函数
class string
{
public:
string(char *str = null);
~string(void);
string(const string &cp);
string operator +(const string &b);
private:
char *a;
}
构造函数与析构函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。
类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。
非内部数据类型的成员对象应采用第一种方式去初始化,以获得更高的效率。类String的构造函数与析构函数
String::String(String &other)
{}