📄 rcaclientlibrary.cpp
字号:
///////////////////////////////////////////
//
// 获得整个屏幕的象素信息
//
// 参数:
//
// pbmi[in,out] -- BITMAPINFO 结构指针, 函数成功调用后会填充这个结构,这个结构反映了象素信息
//
// x, y, w, h; 矩形的左上角座标, 以及宽高. 如果这些参数不合法,将被修整为合法参数
//
// pBits[in,out] -- void 指针, 函数调用成功后,pBits 将被象素值填充. 如果 pBits 为NULL,
// 函数将修改 dwBufferSize 参数, 指明需要多少缓冲存放象素值
//
// dwBufferSize -- [in, out] 指明 pBits 的大小. 如果函数成功调用后, dwBufferSize 将会被修改,
// 指明实际拷贝的象素字节数
// 返回值:
// BOOL 类型, 函数调用成功后, 将返回 TRUE; 失败,将返回 FALSE;
//
HBITMAP
WINAPI GetDCPixel_BMP (
HDC hdc,
int x,
int y,
int w,
int h,
int zw,
int zh,
WORD wBitCount,
VOID ** pBits,
BITMAPINFOHEADER * pbmih, // 当色深为 8 时, 包含颜色表
DWORD * pdwBitmapInfoSize
)
{
int width = 0;
int height;
// 确定 DC 是而效的, 并获得 DC 的宽高(以像素为单位)
width = GetDeviceCaps( hdc, HORZRES);
if( width == 0 )
return NULL;
height = GetDeviceCaps( hdc, VERTRES);
// 修整请求的矩形
x = (x<0)||(x>(width-1)) ? 0 : x;
x = (y<0)||(y>(height-1)) ? 0 : y;
w = (w>(width-x)) || (w<1) ? width - x : w;
h = (h>(height-y)) || (h<1) ? height - y : h;
zw = zw <= 0 ? w : zw;
zh = zh <= 0 ? h : zh;
// 修整请求的色深
if( wBitCount <= 8 )
wBitCount = 8;
else if( wBitCount <=16 )
wBitCount = 16;
else if( wBitCount <= 24 )
wBitCount = 24;
else if( wBitCount >=32 )
wBitCount = 32;
// 计算存储图象所需空间的大小
//DWORD tmp = (((w * wBitCount) +31) & ~31) / 8 * h;
if( pbmih != NULL )
{
if( wBitCount == 8 )
{
if( *pdwBitmapInfoSize < (sizeof(RGBQUAD)*256 + sizeof(BITMAPINFOHEADER) ))
return NULL;
}
else
{
if( *pdwBitmapInfoSize < sizeof( BITMAPINFOHEADER) )
return NULL;
}
}
else
{
*pdwBitmapInfoSize = (sizeof(RGBQUAD)*256 + sizeof(BITMAPINFOHEADER) );
return NULL;
}
HBITMAP bmp;
PVOID pTmp = NULL;
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = zw;
bmi.bmiHeader.biHeight = zh;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = wBitCount;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
// create a DIB section bitmap;
bmp = CreateDIBSection( hdc, &bmi, DIB_RGB_COLORS, &pTmp, NULL, 0 );
if( bmp == NULL )
return NULL;
// set the out param pBits to image buffer pTmp;
*pBits = pTmp;
HDC hdcMem = CreateCompatibleDC( hdc );
if( hdcMem == NULL)
{
DeleteObject(bmp);
return NULL;
}
SelectObject( hdcMem, bmp );
StretchBlt( hdcMem, 0, 0, zw, zh, hdc, x, y, w, h, SRCCOPY );
//BitBlt( hdc, 0, 0,w, h, hdcMem, 0, 0, SRCCOPY );
DIBSECTION ds;
GetObject( bmp, sizeof(ds), (PVOID)&ds );
//cout << ds.dsBmih.biClrUsed << endl;
if( ds.dsBm.bmBitsPixel == 8 )
{
int clrGetNum;
SelectObject( hdcMem, bmp );
clrGetNum = GetDIBColorTable( hdcMem, 0, ds.dsBmih.biClrUsed,
(RGBQUAD*)(sizeof(BITMAPINFOHEADER) +(char*)pbmih ) );
if( 0 == clrGetNum )
{
DeleteDC( hdcMem );
DeleteObject( bmp );
return NULL;
}
}
CopyMemory( (void*)pbmih, &(ds.dsBmih), sizeof(BITMAPINFOHEADER) );
// 计算并输出图像所需存储空间的大小
//cout << (((w * wBitCount) +31) & ~31) / 8 * h << endl;
DeleteDC( hdcMem );
return bmp;
}
VOID
WINAPI InitResponseHead(
PRCARESPONSEHEADER prresh,
DWORD dwStatusCode,
DWORD dwSize
)
{
lstrcpy( prresh->rcaID, "RCA" );
prresh->dwStatusCode = dwStatusCode;
prresh->dwTotalBytes = dwSize;
}
char ___s[256];
char * WINAPI WSAErrorString( int WSAError )
{
switch( WSAError )
{
case WSAEACCES: // 10013
lstrcpy( ___s, "拒绝访问 10013" );
break;
case WSAEADDRINUSE: // 10048
lstrcpy( ___s, "地址已经使用 10048" );
break;
case WSAEADDRNOTAVAIL: // 10049
lstrcpy( ___s, "请求的地址无效 10049" );
break;
case WSAEAFNOSUPPORT: // 10047
lstrcpy( ___s, "地址家族不支持 10047" );
break;
case WSAEALREADY: // 10037
lstrcpy( ___s, "操作已经在进行中 10037" );
break;
case WSAECONNABORTED: // 10053
lstrcpy( ___s, "软件原因连接被中断 10053" );
break;
case WSAECONNREFUSED: // 10061
lstrcpy( ___s, "连接被拒绝 10061" );
break;
case WSAECONNRESET: // 10054
lstrcpy( ___s, "连接被重置 10054" );
break;
case WSAEDESTADDRREQ: // 10039
lstrcpy( ___s, "必须指定目的地址 10039" );
break;
case WSAEFAULT:
lstrcpy( ___s, "地址错误 10014" );
break;
case WSAEHOSTDOWN:
lstrcpy( ___s, "远程主机死机了( 蓝屏?) 10064" );
break;
case WSAEHOSTUNREACH:
lstrcpy( ___s, "无法找到主机 10065" );
break;
case WSAEINPROGRESS:
lstrcpy( ___s, "阻塞操作正在进行 10036" );
break;
case WSAEINTR:
lstrcpy( ___s, "阻塞操作被打断 10004" );
break;
case WSAEINVAL:
lstrcpy( ___s, "参数无效 10022" );
break;
case WSAEISCONN:
lstrcpy( ___s, "套接字已经连接 10056" );
break;
case WSAEMFILE:
lstrcpy( ___s, "打开的套接字太多 10024" );
break;
case WSAEMSGSIZE:
lstrcpy( ___s, "消息太长 10040" );
break;
case WSAENETDOWN:
lstrcpy( ___s, "网络系统, 网络接口, 本地网络有错误 10050" );
break;
case WSAENETRESET:
lstrcpy( ___s, "保持活动的连接在操作中出现错误 10052" );
break;
case WSAENETUNREACH:
lstrcpy( ___s, "网络无法到达 10051" );
break;
case WSAENOBUFS:
lstrcpy( ___s, "没有可用的缓冲区 10055" );
break;
case WSAENOPROTOOPT:
lstrcpy( ___s, "错误的协议选项 10042" );
break;
case WSAENOTCONN:
lstrcpy( ___s, "套接字没有连接 10057" );
break;
case WSAENOTSOCK:
lstrcpy( ___s, "套接字句柄无效 10038" );
break;
case WSAEOPNOTSUPP:
lstrcpy( ___s, "操作不支持 10045" );
break;
case WSAEPFNOSUPPORT:
lstrcpy( ___s, "协议族不支持 10046" );
break;
case WSAEPROCLIM:
lstrcpy( ___s, "使用 WinSock 的进程太多 10067" );
break;
case WSAEPROTONOSUPPORT:
lstrcpy( ___s, "协议不支持 10043" );
break;
case WSAEPROTOTYPE:
lstrcpy( ___s, "协议类型错误 10041" );
break;
case WSAESHUTDOWN:
lstrcpy( ___s, "套接字关闭后无法进行发送操作 10058" );
break;
case WSAESOCKTNOSUPPORT:
lstrcpy( ___s, "套接字类型不支持 10044" );
break;
case WSAETIMEDOUT:
lstrcpy( ___s, "连接超时 10060" );
break;
case WSATYPE_NOT_FOUND:
lstrcpy( ___s, "指定的类没有发现 10109" );
break;
case WSAEWOULDBLOCK:
lstrcpy( ___s, "资源暂时无法获得 10035" );
break;
case WSAHOST_NOT_FOUND:
lstrcpy( ___s, "主机没有发现 11001" );
break;
case WSA_INVALID_HANDLE:
lstrcpy( ___s, "无效句柄 (OS dependent)" );
break;
case WSA_INVALID_PARAMETER:
lstrcpy( ___s, "无效参数 (OS dependent)" );
break;
// case WSAINVALIDPROCTABLE:
// lstrcpy( ___s, "无效的过程表 (OS dependent)" );
// break;
// case WSAINVALIDPROVIDER:
// lstrcpy( ___s, "无效的提供者版本 (OS dependent)" );
// break;
case WSA_IO_INCOMPLETE:
lstrcpy( ___s, "重叠 I/O 事件对象不在通知状态 (OS dependent)" );
break;
case WSA_IO_PENDING:
lstrcpy( ___s, "重叠操作将在过后完成 (OS dependent)" );
break;
case WSA_NOT_ENOUGH_MEMORY:
lstrcpy( ___s, "内存不足 (OS dependent) " );
break;
case WSANOTINITIALISED:
lstrcpy( ___s, "WSAStartup 函数没有成功的调用 10093" );
break;
case WSANO_DATA:
lstrcpy( ___s, "请求的名字有效, 但没有请求的数据记录 11004" );
break;
case WSANO_RECOVERY:
lstrcpy( ___s, "无法回复错误, 可能服务器数据库文件没有发现,也可能是服务器返回了错误 11003" );
break;
// case WSAPROVIDERFAILEDINIT:
// lstrcpy( ___s, "无法初始化服务提供者 (OS dependent)" );
// break;
case WSASYSCALLFAILURE:
lstrcpy( ___s, "系统调用失败 (OS dependent)" );
break;
case WSASYSNOTREADY:
lstrcpy( ___s, "网络子系统错误 10091" );
break;
case WSATRY_AGAIN:
lstrcpy( ___s, "Nonauthoritative host not found. please try again later 11002" );
break;
case WSAVERNOTSUPPORTED:
lstrcpy( ___s, "请求的版本不支持 10092" );
break;
case WSAEDISCON:
lstrcpy( ___s, "从容关闭正在进行中 10101" );
break;
case WSA_OPERATION_ABORTED:
lstrcpy( ___s, "重叠操作被中断 (OS dependent)" );
break;
default:
lstrcpy( ___s, "未知错误" );
}
return ___s;
}
BOOL WINAPI CreateEventSelectSocket(
SOCKET * s,
HANDLE * hEvent,
LONG lEventFlags
)
{
int ret;
*s = socket( AF_INET, SOCK_STREAM, 0 );
if( *s == INVALID_SOCKET )
return FALSE;
*hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
if( *hEvent == NULL )
{
closesocket( *s );
return FALSE;
}
ret = WSAEventSelect( *s, *hEvent, lEventFlags );
if( ret == SOCKET_ERROR )
{
closesocket( *s );
CloseHandle( hEvent );
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
RCAConnect_EventSelectIO(
SOCKET s,
HANDLE hEventArray[2],
sockaddr* addr,
UINT uExitMsg
)
{
int ret;
BOOL bSunc = FALSE;
DWORD dwRet;
WSANETWORKEVENTS ns;
while(1)
{
ret = connect( s, addr, sizeof(sockaddr) );
if( ret == SOCKET_ERROR )
{
if( WSAGetLastError() != WSAEWOULDBLOCK )
return FALSE;
}
else
{
return TRUE;
}
while(1)
{
dwRet = WaitForMultipleObjects( 2, hEventArray, FALSE, INFINITE );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -