RCAClientLibrary.cpp
上传用户:hyz2004817
上传日期:2022-03-30
资源大小:226k
文件大小:29k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. BOOL 
  3. WINAPI 
  4. DecodeFromJPEGBuffer(
  5.   BYTE * lpJpgBuffer,
  6.   DWORD  dwJpgBufferSize,
  7.   BYTE** lppRgbBuffer,
  8.   DWORD* lpdwWidth,
  9.   DWORD* lpdwHeight,
  10.   DWORD* lpdwNumberOfChannels
  11.   )
  12.  {
  13.  
  14. BOOL  bres;
  15. IJLERR  jerr;
  16. DWORD  dwWholeImageSize;
  17. BYTE*  lpTemp = NULL;
  18. // Allocate the IJL JPEG_CORE_PROPERTIES structure.
  19. JPEG_CORE_PROPERTIES jcprops;
  20. bres = TRUE;
  21. __try
  22. {
  23. // Initialize the Intel(R) JPEG Library.
  24. jerr = ijlInit(&jcprops);
  25. if(IJL_OK != jerr)
  26. {
  27. bres = FALSE;
  28. __leave;
  29.  
  30. // Get information on the JPEG image
  31. // (i.e., width, height, and channels).
  32. jcprops.JPGFile = NULL;
  33. jcprops.JPGBytes = lpJpgBuffer;
  34. jcprops.JPGSizeBytes = dwJpgBufferSize;
  35. jerr = ijlRead(&jcprops, IJL_JBUFF_READPARAMS);
  36. if(IJL_OK != jerr)
  37. {
  38. bres = FALSE;
  39. __leave;
  40. }
  41. // Set the JPG color space ... this will always be
  42. // somewhat of an educated guess at best because JPEG
  43. // is "color blind" (i.e., nothing in the bit stream
  44. // tells you what color space the data was encoded from).
  45. // However, in this example we assume that we are
  46. // reading JFIF files which means that 3 channel images
  47. // are in the YCbCr color space and 1 channel images are
  48. // in the Y color space.
  49. switch(jcprops.JPGChannels)
  50. {
  51. case 1:
  52. {
  53. jcprops.JPGColor = IJL_G;
  54. jcprops.DIBColor = IJL_RGB;
  55. jcprops.DIBChannels = 3;
  56. break;
  57. }
  58. case 3:
  59. {
  60. jcprops.JPGColor = IJL_YCBCR;
  61. jcprops.DIBColor = IJL_RGB;
  62. jcprops.DIBChannels = 3;
  63. break;
  64. }
  65. default:
  66. {
  67. // This catches everything else, but no
  68. // color twist will be performed by the IJL.
  69. jcprops.JPGColor = IJL_OTHER;
  70. jcprops.DIBColor = IJL_OTHER;
  71. jcprops.DIBChannels = jcprops.JPGChannels;
  72. break;
  73. }
  74. }
  75. // Compute size of desired pixel buffer.
  76. dwWholeImageSize = jcprops.JPGWidth * jcprops.JPGHeight *
  77. jcprops.DIBChannels;
  78. // Allocate memory to hold the decompressed image data.
  79. lpTemp = new BYTE [dwWholeImageSize];
  80. if(NULL == lpTemp)
  81. {
  82. bres = FALSE;
  83. __leave;
  84. }
  85. // Set up the info on the desired DIB properties.
  86. jcprops.DIBWidth = jcprops.JPGWidth;
  87. jcprops.DIBHeight = jcprops.JPGHeight;
  88. jcprops.DIBPadBytes = 0;
  89. jcprops.DIBBytes = lpTemp;
  90. // Now get the actual JPEG image data into the pixel buffer.
  91. jerr = ijlRead(&jcprops, IJL_JBUFF_READWHOLEIMAGE);
  92. if(IJL_OK != jerr)
  93. {
  94. bres = FALSE;
  95. __leave;
  96. }
  97. } // __try
  98. __finally
  99. {
  100. if(FALSE == bres)
  101. {
  102. if(NULL != lpTemp)
  103. {
  104. delete [] lpTemp;
  105. lpTemp = NULL;
  106. }
  107. }
  108. // Clean up the Intel(R) JPEG Library.
  109. ijlFree(&jcprops);
  110. *lpdwWidth = jcprops.DIBWidth;
  111. *lpdwHeight = jcprops.DIBHeight;
  112. *lpdwNumberOfChannels = jcprops.DIBChannels;
  113. *lppRgbBuffer = lpTemp;
  114. } // __finally
  115. return bres;
  116.  } // DecodeFromJPEGBuffer()
  117.  //----------------------------------------------------------
  118.  // An example using the Intel(R) JPEG Library:
  119.  // -- Encode Windows DIB to JPEG buffer.
  120.  //----------------------------------------------------------
  121.  BOOL WINAPI EncodeToJPEGBuffer(
  122.  BYTE* lpRgbBuffer,
  123.  DWORD dwWidth,
  124.  DWORD dwHeight,
  125.  BYTE** lppJpgBuffer,
  126.  DWORD* lpdwJpgBufferSize,
  127.  int iQuality
  128. )
  129. {
  130.  BOOL bres;
  131.  IJLERR jerr;
  132.  DWORD dwRgbBufferSize;
  133.  BYTE* lpTemp;
  134.  // Allocate the IJL JPEG_CORE_PROPERTIES structure.
  135.  JPEG_CORE_PROPERTIES jcprops;
  136.  bres = TRUE;
  137.  __try
  138.  {
  139.  // Initialize the Intel(R) JPEG Library.
  140.  jerr = ijlInit(&jcprops);
  141.  if(IJL_OK != jerr)
  142.  {
  143.  bres = FALSE;
  144.  __leave;
  145.  }
  146.  dwRgbBufferSize = dwWidth * dwHeight * 3;
  147.  lpTemp = new BYTE [dwRgbBufferSize];
  148.  if(NULL == lpTemp)
  149.  {
  150.  bres = FALSE;
  151.  __leave;
  152.  }
  153.  // Set up information to write from the pixel buffer.
  154.  jcprops.DIBWidth = dwWidth;
  155.  jcprops.DIBHeight = dwHeight; // Implies a bottom-up DIB.
  156.  jcprops.DIBBytes = lpRgbBuffer;
  157.  jcprops.DIBPadBytes = 0;
  158.  jcprops.DIBChannels = 3;
  159.  jcprops.DIBColor = IJL_RGB;
  160.  jcprops.JPGWidth = dwWidth;
  161.  jcprops.JPGHeight = dwHeight;
  162.  jcprops.JPGFile = NULL;
  163.  jcprops.JPGBytes = lpTemp;
  164.  jcprops.JPGSizeBytes = dwRgbBufferSize;
  165.  jcprops.JPGChannels = 3;
  166.  jcprops.JPGColor = IJL_YCBCR;
  167.  jcprops.JPGSubsampling = IJL_411; // 4:1:1 subsampling.
  168.  jcprops.jquality = (iQuality>=0)&&(iQuality<=100) ? iQuality : 50; // Select "good" image quality
  169.  // Write the actual JPEG image from the pixel buffer.
  170.  jerr = ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE);
  171.  if(IJL_OK != jerr)
  172.  {
  173.  bres = FALSE;
  174.  __leave;
  175.  }
  176.  } // __try
  177.  __finally
  178.  {
  179.  if(FALSE == bres)
  180.  {
  181.  if(NULL != lpTemp)
  182.  {
  183.  delete[] lpTemp;
  184.  lpTemp = NULL;
  185.  }
  186.  }
  187.  *lppJpgBuffer = lpTemp;
  188.  *lpdwJpgBufferSize = jcprops.JPGSizeBytes;
  189.  // Clean up the Intel(R) JPEG Library.
  190.  ijlFree(&jcprops);
  191.  }
  192.  return bres;
  193.  } // EncodeToJPEGBuffer()
  194. ////////////////////////////////////////
  195. //
  196. // SOCKET 异步 IO 帮助函数, 异步模型为 "事件选择模型"
  197. //
  198. // 参数:
  199. // SOCKET s:
  200. // 套接字 s 是一个已成功连接的套接字, 并至少使用 FD_READ 标志作为
  201. // 参数 lNetworkEvents 调用了 WSAEventSelect 成功地将套接字置为异步事件选择模型
  202. //
  203. // HANDLE hEvent: 
  204. // 一个用于网络 IO 事件通知的事件句柄. 
  205. //
  206. // char * buf:
  207. // 接收数据缓冲
  208. //
  209. // int len:
  210. // 接收数据缓冲总长度
  211. //
  212. // BOOL * bExit:
  213. // BOOL 变量的指针, 应用程序可以修改这个值. 这个函数调用 WaitForSingleObject 等待 
  214. // dwMilliseconds 毫秒后, 将检测 bExit 的值, 若为 bExit 为 TRUE, 函数将立即返回.
  215. // 返回时是不管等待是否成功的,或说不论等待结果是 WAIT_TIMEOUT 或者 WAIT_OBJECT_0,
  216. // 都会返回, 只要 bExit 为 TRUE
  217. //
  218. //
  219. // DWORD dwMilliseconds:
  220. // 函数将使用这个值作为第二个参数,调用 WaitForSingleObject. 以毫秒为单位
  221. // INFINITE 为无限等待
  222. //
  223. // 返回值:
  224. // 若第一次调用接收函数时, 连接出现问题, 则返回 0 
  225. //
  226. // 若第一次调用接收函数成功后,以后无论发生任何错误都返回一个整型值,
  227. // 描述已接收了多少数据
  228. //
  229. // 如果返回值与参数 len 相等, 说明成功发送出了所有数据, 若不等,可能是网络错误造成, 
  230. // 也可能是 bExit 被设为 TRUE 后接收操作被强制中断
  231. INT
  232. WINAPI RCARecv_EventSelectIO( 
  233. SOCKET s, 
  234. HANDLE hEventArray[2],
  235. char* buf,
  236. const int len
  237. )
  238. {
  239. if( (buf == NULL) || (len==0) )
  240. return FALSE;
  241. int ret;
  242. DWORD dwret;
  243. int count = len;
  244. int index = 0;
  245. WSANETWORKEVENTS ns;
  246. while( count > 0 )
  247. {
  248. ret = recv( s, &(buf[index]), count, 0 );
  249. if( ret == SOCKET_ERROR )
  250. {
  251. // 如果发送错误,并且错误代码不是"被阻塞", 则返回 FALSE ( 发生了网络错误 )
  252. if( WSAGetLastError() != WSAEWOULDBLOCK )
  253. return len - count;
  254. } else if( ret == 0 )
  255. {
  256. return len - count ;
  257. } else 
  258. {
  259. // 如果成功发送, 则更新缓冲偏移字节数和待发总字节数
  260. index += ret;
  261. count -= ret;
  262. continue;
  263. }
  264. dwret = WaitForMultipleObjects( 
  265. 2, hEventArray, FALSE, INFINITE );
  266. switch ( dwret )
  267. {
  268. case WAIT_FAILED:
  269. return len - count;
  270. case WAIT_OBJECT_0:
  271. break;
  272. case WAIT_OBJECT_0 + 1:
  273. return len - count;
  274. case WAIT_TIMEOUT:
  275. break;
  276. }
  277. ret = WSAEnumNetworkEvents( s, hEventArray[0], &ns );
  278. if( ret == SOCKET_ERROR )
  279. {
  280. return len - count;
  281. }
  282. if( ns.lNetworkEvents & FD_READ )
  283. {
  284. if( ns.iErrorCode[ FD_READ_BIT] != 0 )
  285. {
  286. return len - count;
  287. }
  288. else
  289. {
  290. continue; // 回到循环开始处,再次接收数据(此时,绝对可以接收数据)
  291. }
  292. }
  293. if( ns.lNetworkEvents & FD_CLOSE )
  294. {
  295. return len - count;
  296. }
  297. }
  298. return len - count;
  299. }
  300. ////////////////////////////////////////
  301. //
  302. // SOCKET 异步 IO 帮助函数, 异步模型 事件选择模型
  303. //
  304. // 参数:
  305. // SOCKET s:
  306. // 套接字 s 是一个已成功连接的套接字, 并至少使用 FD_WRITE 标志作为
  307. // 参数 lNetworkEvents 调用了 WSAEventSelect 成功地将套接字置为异步事件选择模型
  308. //
  309. // HANDLE hEvent: 
  310. // 一个用于网络 IO 事件通知的事件句柄. 
  311. //
  312. // char * buf:
  313. // 待发数据缓冲
  314. //
  315. // int len:
  316. // 待发数据缓冲总长度
  317. //
  318. // BOOL * bExit:
  319. // BOOL 变量的指针, 应用程序可以修改这个值. 这个函数调用 WaitForSingleObject 等待 
  320. // dwMilliseconds 毫秒后, 将检测 bExit 的值, 若为 bExit 为 TRUE, 函数将立即返回.
  321. // 返回时是不管等待是否成功的,或说不论等待结果是 WAIT_TIMEOUT 或者 WAIT_OBJECT_0,
  322. // 都会返回, 只要 bExit 为 TRUE
  323. //
  324. //
  325. // DWORD dwMilliseconds:
  326. // 函数将使用这个值作为第二个参数,调用 WaitForSingleObject. 以毫秒为单位
  327. // INFINITE 为无限等待
  328. //
  329. // 返回值:
  330. // 若第一次调用发送函数时, 连接出现问题, 则返回 0 
  331. //
  332. // 若第一次调用发送函数成功后,以后无论发生任何错误都返回一个整型值,
  333. // 描述已发送了多少数据
  334. //
  335. // 如果返回值与参数 len 相等, 说明成功发送出了所有数据, 若不等,可能是网络错误造成, 
  336. // 也可能是 bExit 被设为 TRUE 后发送操作被强制中断
  337. INT 
  338. WINAPI RCASend_EventSelectIO( 
  339. SOCKET s, 
  340. HANDLE hEventArray[2],
  341. char* buf,
  342. const int len
  343. )
  344. {
  345. if( (buf == NULL) || (len==0) )
  346. return FALSE;
  347. int ret;
  348. int count = (int)len;
  349. int index =0;
  350. DWORD dwret;
  351. WSANETWORKEVENTS ns;
  352. while( count > 0 )
  353. {
  354. ret = send( s, &(buf[index]), count, 0 );
  355. if( ret == SOCKET_ERROR )
  356. {
  357. // 如果发送错误,并且错误代码不是"被阻塞", 则返回 FALSE ( 发生了网络错误 )
  358. if( WSAGetLastError() != WSAEWOULDBLOCK )
  359. return len - count;
  360. }
  361. else
  362. {
  363. // 如果成功发送, 则更新缓冲偏移字节数和待发总字节数
  364. cout << ret << endl;
  365. index += ret;
  366. count -= ret;
  367. continue;
  368. }
  369. // 到这里,说明没而待发缓冲区可供使用, 在 AsyncEvent IO 模型中, 可以等待事件通知的到来
  370. // 现在根据 dwMilliseconds 来待待事件通知
  371. dwret = WaitForMultipleObjects( 
  372. 2,  hEventArray, FALSE, INFINITE );
  373. switch( dwret )
  374. {
  375. case WAIT_FAILED:
  376. case WAIT_OBJECT_0 + 1:
  377. return len - count;
  378. case WAIT_OBJECT_0:
  379. break;
  380. case WAIT_TIMEOUT:
  381. continue;
  382. }
  383. ret = WSAEnumNetworkEvents( s, hEventArray[0], &ns );
  384. if( ns.lNetworkEvents & FD_WRITE )
  385. {
  386. if( ns.iErrorCode[ FD_WRITE_BIT] != 0 )
  387. return (len - count);
  388. else
  389. continue; // 回到前边,再次发送数据(此时,绝对可以发送数据)
  390. }
  391. if( ret == SOCKET_ERROR )
  392. return (len - count);
  393. if( ns.lNetworkEvents & FD_CLOSE )
  394. return (len - count);
  395. }
  396. return len - count;
  397. }
  398. ///////////////////////////////////////////
  399. //
  400. // 获得整个屏幕的象素信息
  401. //
  402. // 参数: 
  403. //
  404. // pbmi[in,out] -- BITMAPINFO 结构指针, 函数成功调用后会填充这个结构,这个结构反映了象素信息
  405. //
  406. // x, y, w, h;  矩形的左上角座标, 以及宽高. 如果这些参数不合法,将被修整为合法参数
  407. //
  408. // pBits[in,out] -- void 指针, 函数调用成功后,pBits 将被象素值填充. 如果 pBits 为NULL,
  409. // 函数将修改 dwBufferSize 参数, 指明需要多少缓冲存放象素值
  410. //
  411. //  dwBufferSize -- [in, out] 指明 pBits 的大小. 如果函数成功调用后, dwBufferSize 将会被修改, 
  412. // 指明实际拷贝的象素字节数
  413. // 返回值:
  414. //  BOOL 类型, 函数调用成功后, 将返回 TRUE; 失败,将返回 FALSE;
  415. // 
  416. HBITMAP 
  417. WINAPI GetDCPixel_BMP (
  418. HDC hdc,
  419. int  x,
  420. int  y,
  421. int  w,
  422. int  h,
  423. int zw,
  424. int zh,
  425. WORD wBitCount,
  426. VOID ** pBits,
  427. BITMAPINFOHEADER * pbmih, // 当色深为 8 时, 包含颜色表
  428. DWORD * pdwBitmapInfoSize
  429. )
  430. {
  431. int width = 0;
  432. int height;
  433. // 确定 DC 是而效的, 并获得 DC 的宽高(以像素为单位)
  434. width = GetDeviceCaps( hdc, HORZRES);
  435. if( width == 0 )
  436. return NULL;
  437. height = GetDeviceCaps( hdc, VERTRES);
  438. // 修整请求的矩形
  439. x = (x<0)||(x>(width-1)) ? 0 : x;
  440. x = (y<0)||(y>(height-1)) ? 0 : y;
  441. w = (w>(width-x)) || (w<1) ?  width - x : w;
  442. h = (h>(height-y)) || (h<1) ?  height - y : h;
  443. zw = zw <= 0 ? w : zw;
  444. zh = zh <= 0 ? h : zh;
  445. // 修整请求的色深
  446. if( wBitCount <= 8 )
  447. wBitCount = 8;
  448. else if( wBitCount <=16 )
  449. wBitCount = 16;
  450. else if( wBitCount <= 24 )
  451. wBitCount = 24;
  452. else if( wBitCount >=32 )
  453. wBitCount = 32;
  454. // 计算存储图象所需空间的大小
  455. //DWORD tmp = (((w * wBitCount) +31) & ~31) / 8 * h;
  456. if( pbmih != NULL )
  457. {
  458. if( wBitCount == 8 )
  459. {
  460. if( *pdwBitmapInfoSize < (sizeof(RGBQUAD)*256 + sizeof(BITMAPINFOHEADER) ))
  461. return NULL;
  462. else 
  463. {
  464. if( *pdwBitmapInfoSize < sizeof( BITMAPINFOHEADER) )
  465. return NULL;
  466. }
  467. else
  468. {
  469. *pdwBitmapInfoSize = (sizeof(RGBQUAD)*256 + sizeof(BITMAPINFOHEADER) );
  470. return NULL;
  471. }
  472. HBITMAP bmp;
  473. PVOID pTmp = NULL;
  474. BITMAPINFO bmi;
  475. bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  476. bmi.bmiHeader.biWidth = zw;
  477. bmi.bmiHeader.biHeight = zh;
  478. bmi.bmiHeader.biPlanes = 1;
  479. bmi.bmiHeader.biBitCount = wBitCount;
  480. bmi.bmiHeader.biCompression = BI_RGB;
  481. bmi.bmiHeader.biSizeImage = 0;
  482. bmi.bmiHeader.biXPelsPerMeter = 0;
  483. bmi.bmiHeader.biYPelsPerMeter = 0;
  484. bmi.bmiHeader.biClrUsed = 0;
  485. bmi.bmiHeader.biClrImportant = 0;
  486. // create a DIB section bitmap;
  487.     bmp = CreateDIBSection( hdc, &bmi, DIB_RGB_COLORS, &pTmp, NULL, 0 );
  488. if( bmp == NULL )
  489. return NULL;
  490. // set the out param pBits to image buffer pTmp;
  491. *pBits = pTmp;
  492. HDC hdcMem = CreateCompatibleDC( hdc );
  493. if( hdcMem == NULL)
  494. {
  495. DeleteObject(bmp);
  496. return NULL;
  497. }
  498. SelectObject( hdcMem, bmp );
  499. StretchBlt( hdcMem, 0, 0, zw, zh, hdc, x, y, w, h, SRCCOPY );
  500. //BitBlt( hdc, 0, 0,w, h, hdcMem, 0, 0, SRCCOPY );
  501. DIBSECTION ds;
  502. GetObject( bmp, sizeof(ds), (PVOID)&ds );
  503. //cout << ds.dsBmih.biClrUsed << endl;
  504. if( ds.dsBm.bmBitsPixel == 8 )
  505. {
  506. int clrGetNum;
  507. SelectObject( hdcMem, bmp );
  508. clrGetNum = GetDIBColorTable( hdcMem, 0, ds.dsBmih.biClrUsed, 
  509. (RGBQUAD*)(sizeof(BITMAPINFOHEADER) +(char*)pbmih ) ); 
  510. if(  0 == clrGetNum )
  511. {
  512. DeleteDC( hdcMem );
  513. DeleteObject( bmp );
  514. return NULL;
  515. }
  516. }
  517. CopyMemory( (void*)pbmih, &(ds.dsBmih), sizeof(BITMAPINFOHEADER) );
  518. // 计算并输出图像所需存储空间的大小
  519. //cout << (((w * wBitCount) +31) & ~31) / 8 * h << endl;
  520. DeleteDC( hdcMem );
  521. return bmp;
  522. }
  523. VOID
  524. WINAPI InitResponseHead(
  525. PRCARESPONSEHEADER prresh,
  526. DWORD dwStatusCode,
  527. DWORD dwSize
  528. )
  529. {
  530. lstrcpy( prresh->rcaID, "RCA" );
  531. prresh->dwStatusCode = dwStatusCode;
  532. prresh->dwTotalBytes = dwSize;
  533. }
  534. char ___s[256];
  535. char * WINAPI WSAErrorString( int WSAError )
  536. {
  537. switch( WSAError )
  538. {
  539. case WSAEACCES: // 10013
  540. lstrcpy( ___s, "拒绝访问 10013" ); 
  541. break;
  542. case WSAEADDRINUSE: // 10048 
  543. lstrcpy( ___s, "地址已经使用 10048" );
  544. break;
  545. case WSAEADDRNOTAVAIL: // 10049
  546. lstrcpy( ___s, "请求的地址无效 10049" );
  547. break;
  548. case WSAEAFNOSUPPORT: // 10047
  549. lstrcpy( ___s, "地址家族不支持 10047" );
  550. break;
  551. case WSAEALREADY: // 10037
  552. lstrcpy( ___s, "操作已经在进行中 10037" );
  553. break;
  554. case WSAECONNABORTED: // 10053
  555. lstrcpy( ___s, "软件原因连接被中断 10053" );
  556. break;
  557. case WSAECONNREFUSED: // 10061
  558. lstrcpy( ___s, "连接被拒绝 10061" );
  559. break;
  560. case WSAECONNRESET: // 10054
  561. lstrcpy( ___s, "连接被重置 10054" );
  562. break;
  563. case WSAEDESTADDRREQ: // 10039
  564. lstrcpy( ___s, "必须指定目的地址 10039" );
  565. break;
  566. case WSAEFAULT:
  567. lstrcpy( ___s, "地址错误 10014" );
  568. break;
  569. case WSAEHOSTDOWN:
  570. lstrcpy( ___s, "远程主机死机了( 蓝屏?) 10064" );
  571. break;
  572. case WSAEHOSTUNREACH:
  573. lstrcpy( ___s, "无法找到主机 10065" );
  574. break;
  575. case WSAEINPROGRESS:
  576. lstrcpy( ___s, "阻塞操作正在进行 10036" );
  577. break;
  578. case WSAEINTR:
  579. lstrcpy( ___s, "阻塞操作被打断 10004" );
  580. break;
  581. case WSAEINVAL:
  582. lstrcpy( ___s, "参数无效 10022" );
  583. break;
  584. case WSAEISCONN:
  585. lstrcpy( ___s, "套接字已经连接 10056" );
  586. break;
  587. case WSAEMFILE:
  588. lstrcpy( ___s, "打开的套接字太多 10024" );
  589. break;
  590. case WSAEMSGSIZE:
  591. lstrcpy( ___s, "消息太长 10040" );
  592. break;
  593. case WSAENETDOWN:
  594. lstrcpy( ___s, "网络系统, 网络接口, 本地网络有错误 10050" );
  595. break;
  596. case WSAENETRESET:
  597. lstrcpy( ___s, "保持活动的连接在操作中出现错误 10052" );
  598. break;
  599. case WSAENETUNREACH:
  600. lstrcpy( ___s, "网络无法到达 10051" );
  601. break;
  602. case WSAENOBUFS:
  603. lstrcpy( ___s, "没有可用的缓冲区 10055" );
  604. break;
  605. case WSAENOPROTOOPT:
  606. lstrcpy( ___s, "错误的协议选项 10042" );
  607. break;
  608. case WSAENOTCONN:
  609. lstrcpy( ___s, "套接字没有连接 10057" );
  610. break;
  611. case WSAENOTSOCK:
  612. lstrcpy( ___s, "套接字句柄无效 10038" );
  613. break;
  614. case WSAEOPNOTSUPP:
  615. lstrcpy( ___s, "操作不支持 10045" );
  616. break;
  617. case WSAEPFNOSUPPORT:
  618. lstrcpy( ___s, "协议族不支持 10046" );
  619. break;
  620. case WSAEPROCLIM:
  621. lstrcpy( ___s, "使用 WinSock 的进程太多 10067" );
  622. break;
  623. case WSAEPROTONOSUPPORT:
  624. lstrcpy( ___s, "协议不支持 10043" );
  625. break;
  626. case WSAEPROTOTYPE:
  627. lstrcpy( ___s, "协议类型错误 10041" );
  628. break;
  629. case WSAESHUTDOWN:
  630. lstrcpy( ___s, "套接字关闭后无法进行发送操作 10058" );
  631. break;
  632. case WSAESOCKTNOSUPPORT:
  633. lstrcpy( ___s, "套接字类型不支持 10044" );
  634. break;
  635. case WSAETIMEDOUT:
  636. lstrcpy( ___s, "连接超时 10060" );
  637. break;
  638. case WSATYPE_NOT_FOUND:
  639. lstrcpy( ___s, "指定的类没有发现 10109" );
  640. break;
  641. case WSAEWOULDBLOCK:
  642. lstrcpy( ___s, "资源暂时无法获得 10035" );
  643. break;
  644. case WSAHOST_NOT_FOUND:
  645. lstrcpy( ___s, "主机没有发现 11001" );
  646. break;
  647. case WSA_INVALID_HANDLE:
  648. lstrcpy( ___s, "无效句柄 (OS dependent)" );
  649. break;
  650. case WSA_INVALID_PARAMETER:
  651. lstrcpy( ___s, "无效参数 (OS dependent)" );
  652. break;
  653. // case WSAINVALIDPROCTABLE:
  654. // lstrcpy( ___s, "无效的过程表 (OS dependent)" );
  655. // break;
  656. // case WSAINVALIDPROVIDER:
  657. // lstrcpy( ___s, "无效的提供者版本 (OS dependent)" );
  658. // break;
  659. case WSA_IO_INCOMPLETE:
  660. lstrcpy( ___s, "重叠 I/O 事件对象不在通知状态 (OS dependent)" );
  661. break;
  662. case WSA_IO_PENDING:
  663. lstrcpy( ___s, "重叠操作将在过后完成 (OS dependent)" );
  664. break;
  665. case WSA_NOT_ENOUGH_MEMORY:
  666. lstrcpy( ___s, "内存不足 (OS dependent) " );
  667. break;
  668. case WSANOTINITIALISED:
  669. lstrcpy( ___s, "WSAStartup 函数没有成功的调用 10093" );
  670. break;
  671. case WSANO_DATA:
  672. lstrcpy( ___s, "请求的名字有效, 但没有请求的数据记录 11004" );
  673. break;
  674. case WSANO_RECOVERY:
  675. lstrcpy( ___s, "无法回复错误, 可能服务器数据库文件没有发现,也可能是服务器返回了错误 11003" );
  676. break;
  677. // case WSAPROVIDERFAILEDINIT:
  678. // lstrcpy( ___s, "无法初始化服务提供者 (OS dependent)" );
  679. // break;
  680. case WSASYSCALLFAILURE:
  681. lstrcpy( ___s, "系统调用失败 (OS dependent)" );
  682. break;
  683. case WSASYSNOTREADY:
  684. lstrcpy( ___s, "网络子系统错误 10091" );
  685. break;
  686. case WSATRY_AGAIN:
  687. lstrcpy( ___s, "Nonauthoritative host not found. please try again later 11002" );
  688. break;
  689. case WSAVERNOTSUPPORTED:
  690. lstrcpy( ___s, "请求的版本不支持 10092" );
  691. break;
  692. case WSAEDISCON:
  693. lstrcpy( ___s, "从容关闭正在进行中 10101" );
  694. break;
  695. case WSA_OPERATION_ABORTED:
  696. lstrcpy( ___s, "重叠操作被中断 (OS dependent)" );
  697. break;
  698. default:
  699. lstrcpy( ___s, "未知错误" );
  700. }
  701. return ___s;
  702. }
  703. BOOL WINAPI CreateEventSelectSocket( 
  704. SOCKET * s,
  705. HANDLE * hEvent,
  706. LONG     lEventFlags
  707. )
  708. {
  709. int ret;
  710. *s = socket( AF_INET, SOCK_STREAM, 0 );
  711. if( *s == INVALID_SOCKET )
  712. return FALSE;
  713. *hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
  714. if( *hEvent == NULL )
  715. {
  716. closesocket( *s );
  717. return FALSE;
  718. }
  719. ret = WSAEventSelect( *s, *hEvent, lEventFlags );
  720. if( ret == SOCKET_ERROR )
  721. {
  722. closesocket( *s );
  723. CloseHandle( hEvent );
  724. return FALSE;
  725. }
  726. return TRUE;
  727. }
  728. BOOL
  729. WINAPI
  730. RCAConnect_EventSelectIO(
  731. SOCKET s,
  732. HANDLE hEventArray[2],
  733. sockaddr* addr,
  734. UINT uExitMsg
  735. )
  736. {
  737. int ret;
  738. BOOL bSunc = FALSE;
  739. DWORD dwRet;
  740. WSANETWORKEVENTS ns;
  741. while(1)
  742. {
  743. ret = connect( s, addr, sizeof(sockaddr) );
  744. if( ret == SOCKET_ERROR )
  745. {
  746. if( WSAGetLastError() != WSAEWOULDBLOCK )
  747. return FALSE;
  748. }
  749. else
  750. {
  751. return TRUE;
  752. }
  753. while(1)
  754. {
  755. dwRet = WaitForMultipleObjects( 2,  hEventArray, FALSE, INFINITE );
  756. if( dwRet == (WAIT_OBJECT_0 + 1 ) )
  757. {
  758. return FALSE;
  759. }
  760. ret = WSAEnumNetworkEvents( s, hEventArray[0],  &ns );
  761. if( ret == SOCKET_ERROR )
  762. break;
  763. if( ns.lNetworkEvents & FD_CONNECT )
  764. {
  765. if( ns.iErrorCode[ FD_CONNECT_BIT ] != 0 )
  766. {
  767. return FALSE;
  768. }
  769. else
  770. return TRUE;
  771. }
  772. }
  773. }
  774. // never run to here;
  775. return TRUE;
  776. }
  777. VOID
  778. WINAPI
  779. InitRCARequestHead (
  780. RCAREQUESTHEADER * rreqh,
  781. WORD wMajorVersion, // 主版本号
  782. WORD wMinorVersion, // 次版本号
  783. DWORD dwRequestID,
  784. DWORD dwRequestBytes
  785. )
  786. {
  787. rreqh->dwRequestID = dwRequestID;
  788. rreqh->requestBytes = dwRequestBytes;
  789. rreqh->wMajorVersion = wMajorVersion;
  790. rreqh->wMinorVersion = wMinorVersion;
  791. lstrcpy( rreqh->rcaID, "RCA" );
  792. }
  793. BOOL 
  794. WINAPI
  795. RCASendRequest_0X10_EventSelectIO(
  796. SOCKET s,
  797. HANDLE hEventArray[2],
  798. HWND hwnd,
  799. PSTR pOperation,
  800. PSTR pFile,
  801. PSTR pParameters,
  802. PSTR pDirectory,
  803. INT nShowCmd
  804. )
  805. {
  806. DWORD dwCountSize;
  807. INT ret;
  808. DWORD nOperation = lstrlen( pOperation ) +1;
  809. DWORD nFile = lstrlen( pFile ) +1;
  810. DWORD nParameters = lstrlen( pParameters ) +1;
  811. DWORD nDirectory = lstrlen( pDirectory ) +1;
  812. dwCountSize = 
  813. 4 + // hwnd
  814. 4 + nOperation + // pOperation
  815. 4 + nFile + // pFile
  816. 4 + nParameters + // pParameters
  817. 4 + nDirectory + // pDirectory
  818. 4; // nShowCmd
  819. RCAREQUESTHEADER rreqh;
  820. InitRCARequestHead( &rreqh, 1, 0, 0x10, dwCountSize + sizeof(RCAREQUESTHEADER) );
  821. // 发送请求头
  822. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(RCAREQUESTHEADER));
  823. if( ret != sizeof(RCAREQUESTHEADER) )
  824. return FALSE;
  825. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&hwnd, sizeof(HWND));
  826. if( ret != sizeof(HWND) )
  827. return FALSE;
  828. if( nOperation == 0 )
  829. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nOperation, sizeof(int));
  830. else {
  831. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nOperation, sizeof(int));
  832. if( ret != sizeof(int) )
  833. return FALSE;
  834. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pOperation, nOperation);
  835. if( ret != nOperation )
  836. return FALSE;
  837. }
  838. if( nFile == 0 )
  839. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nFile, sizeof(int));
  840. else {
  841. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nFile, sizeof(int));
  842. if( ret != sizeof(int) )
  843. return FALSE;
  844. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pFile, nFile);
  845. if( ret != nFile )
  846. return FALSE;
  847. }
  848. if( nParameters == 0 )
  849. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nParameters, sizeof(int));
  850. else {
  851. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nParameters, sizeof(int));
  852. if( ret != sizeof(int) )
  853. return FALSE;
  854. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pParameters, nParameters);
  855. if( ret != nParameters )
  856. return FALSE;
  857. }
  858. if( nDirectory == 0 )
  859. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nDirectory, sizeof(int));
  860. else {
  861. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nDirectory, sizeof(int));
  862. if( ret != sizeof(int) )
  863. return FALSE;
  864. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pDirectory, nDirectory);
  865. if( ret != nDirectory )
  866. return FALSE;
  867. }
  868. return TRUE;
  869. }
  870. BOOL
  871. WINAPI
  872. RCASendRequest_0X20_EventSelectIO(
  873. SOCKET s,
  874. HANDLE hEventArray[2],
  875. RCAGETIMAGEDATA * pgm
  876. )
  877. {
  878. if( pgm->dwImageFormat != IMAGE_FORMAT_BMP )
  879. if( pgm->dwImageFormat != IMAGE_FORMAT_JPEG )
  880. return FALSE;
  881. // DWORD dwRet;
  882. int ret;
  883. RCAREQUESTHEADER rreqh;
  884. rreqh.dwRequestID = 0x20;
  885. rreqh.requestBytes = sizeof(rreqh) + sizeof(RCAGETIMAGEDATA);
  886. rreqh.wMajorVersion = 1;
  887. rreqh.wMinorVersion = 0;
  888. lstrcpy( rreqh.rcaID, "RCA" );
  889. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(RCAREQUESTHEADER));
  890. if( ret != sizeof( RCAREQUESTHEADER ) )
  891. return FALSE;
  892. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pgm, sizeof(RCAGETIMAGEDATA));
  893. if( ret != sizeof( RCAGETIMAGEDATA ) )
  894. return FALSE;
  895. return TRUE;
  896. }
  897. HBITMAP
  898. WINAPI
  899. RCARecvImageData(
  900. SOCKET s,
  901. HANDLE hEventArray[2],
  902. DWORD dwImageFormat 
  903. )
  904. {
  905. int ret;
  906. // DWORD dwRet;
  907. RCARESPONSEHEADER rresh;
  908. // 接收响应头
  909. ret = RCARecv_EventSelectIO( s, hEventArray, (char*)&rresh, 
  910. sizeof(RCARESPONSEHEADER));
  911. if ( ret != sizeof(RCARESPONSEHEADER) )
  912. return FALSE;
  913. DWORD dwRecvCount = rresh.dwTotalBytes - sizeof(rresh);
  914. if ( dwRecvCount <= 0 )
  915. return FALSE;
  916. // 分配内存, 接收剩余的像素数据
  917. char * buf = (char*)new BYTE[dwRecvCount];
  918. if ( buf == NULL )
  919. return FALSE;
  920. // 接收图象数据
  921. ret = RCARecv_EventSelectIO( s, hEventArray, buf, dwRecvCount);
  922. if ( ret != dwRecvCount )
  923. return FALSE;
  924. if ( dwImageFormat == IMAGE_FORMAT_BMP )
  925. {
  926. // 通过 BMP 格式的数据创建 HBITMAP
  927. PBITMAPFILEHEADER pbmfh = (PBITMAPFILEHEADER)buf;
  928. HDC hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
  929. if( hdc == NULL )
  930. {
  931. delete[] buf;
  932. return FALSE;
  933. }
  934. PBYTE pBits = (PBYTE)buf;
  935. pBits += pbmfh->bfOffBits;
  936. PBITMAPINFO pbmih = (PBITMAPINFO) ( pbmfh+1 );
  937. PVOID p;
  938. HBITMAP hbm = CreateDIBSection( hdc, pbmih, DIB_RGB_COLORS, &p, NULL, NULL );
  939. if ( hbm == NULL )
  940. {
  941. DeleteDC( hdc );
  942. delete[] buf;
  943. return FALSE;
  944. }
  945. CopyMemory( p, pBits, pbmih->bmiHeader.biSizeImage );
  946. DeleteDC( hdc );
  947. delete[] buf;
  948. return hbm;
  949. } else if ( dwImageFormat == IMAGE_FORMAT_JPEG )
  950. {
  951. // 创建 DC 以备在上面绘制 JPEG 像素
  952. HDC hdc = CreateDC( "DISPLAY" , NULL, NULL, NULL);
  953. if ( hdc == NULL )
  954. {
  955. delete[] buf;
  956. return FALSE;
  957. }
  958. PBYTE pJPEGBuffer = (PBYTE)buf; // JPEG 缓冲区
  959. DWORD dwJPEGBufferSize = rresh.dwTotalBytes - 40; // JPEG 缓冲区大小
  960. BYTE* pRGBBuffer = NULL;
  961. DWORD width; // 图象宽
  962. DWORD   height; // 图象高
  963. DWORD channels; // 图象颜色通道数目
  964. if ( FALSE == DecodeFromJPEGBuffer( pJPEGBuffer, dwJPEGBufferSize,
  965. &pRGBBuffer, &width, &height, &channels ) )
  966. {
  967. delete[] buf;
  968. DeleteDC( hdc );
  969. return FALSE;
  970. }
  971. BITMAPINFO bmi;
  972. bmi.bmiHeader.biSize = sizeof(bmi);
  973. bmi.bmiHeader.biBitCount = 24;
  974. bmi.bmiHeader.biClrImportant = 0;
  975. bmi.bmiHeader.biClrUsed = 0;
  976. bmi.bmiHeader.biCompression = BI_RGB;
  977. bmi.bmiHeader.biWidth = width;
  978. bmi.bmiHeader.biHeight = height;
  979. bmi.bmiHeader.biPlanes = 1;
  980. bmi.bmiHeader.biSizeImage = width * height * 3;
  981. bmi.bmiHeader.biXPelsPerMeter = 0;
  982. bmi.bmiHeader.biYPelsPerMeter = 0;
  983. bmi.bmiColors[0].rgbRed = (BYTE)0xff;
  984. bmi.bmiColors[0].rgbGreen = (BYTE)0xff;
  985. bmi.bmiColors[0].rgbBlue = (BYTE)0xff;
  986. bmi.bmiColors[0].rgbReserved = (BYTE)0x0;
  987. PVOID p=NULL;
  988. HBITMAP hbm = CreateDIBSection( hdc, &bmi, DIB_RGB_COLORS, &p, NULL, NULL );
  989. if( hbm == NULL )
  990. {
  991. DeleteDC( hdc );
  992. delete[] buf;
  993. delete[] pRGBBuffer;
  994. return FALSE;
  995. }
  996. CopyMemory( p, pRGBBuffer, bmi.bmiHeader.biSizeImage );
  997. DeleteDC( hdc );
  998. delete[] buf;
  999. delete[] pRGBBuffer;
  1000. return hbm;
  1001. }
  1002. // never run to here
  1003. return NULL;
  1004. }
  1005. BOOL
  1006. WINAPI
  1007. RCASendMouseInput_EventSelectIO(
  1008. SOCKET s,
  1009. HANDLE hEventArray[2],
  1010. RCAMOUSEINPUT * pMouseInput,
  1011. DWORD dwArraySize
  1012. )
  1013. {
  1014. if ( dwArraySize > 20 )
  1015. return FALSE;
  1016. int ret;
  1017. RCAREQUESTHEADER rreqh;
  1018. InitRCARequestHead( &rreqh, 1, 0, 0x40, 
  1019. sizeof(rreqh) + sizeof(RCAMOUSEINPUT) * dwArraySize );
  1020. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(rreqh));
  1021. if( ret != sizeof(rreqh) )
  1022. return FALSE;
  1023. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pMouseInput, 
  1024.  sizeof(RCAMOUSEINPUT)*dwArraySize );
  1025. if( ret != sizeof(RCAMOUSEINPUT) * dwArraySize )
  1026. return FALSE;
  1027. return TRUE;
  1028. }
  1029. BOOL
  1030. WINAPI
  1031. RCASendKeybdInput_EventSelectIO(
  1032. SOCKET s,
  1033. HANDLE hEventArray[2],
  1034. RCAKEYBDINPUT * pKeybdInput,
  1035. DWORD dwArraySize
  1036. )
  1037. {
  1038. if( dwArraySize > 20 )
  1039. return FALSE;
  1040. int ret;
  1041. DWORD dwSize = sizeof(RCAKEYBDINPUT) * dwArraySize;
  1042. RCAREQUESTHEADER rreqh;
  1043. InitRCARequestHead( &rreqh, 1, 0, 0x41, dwSize + sizeof(rreqh) );
  1044. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(rreqh));
  1045. if( ret != sizeof(rreqh ) )
  1046. return FALSE;
  1047. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pKeybdInput, dwSize);
  1048. if( ret != dwSize )
  1049. return FALSE;
  1050. return TRUE;
  1051. }
  1052. BOOL
  1053. WINAPI
  1054. CreateMouseInput(
  1055. RCAMOUSEINPUT* pmi,
  1056. UINT msg,
  1057. WPARAM w,
  1058. LPARAM l,
  1059. float fWidthScale,
  1060. float fHeightScale
  1061. )
  1062. {
  1063. pmi->dwExtraInfo = 0;
  1064. pmi->mouseData = 0;
  1065. pmi->time = 0;
  1066. switch( msg )
  1067. {
  1068. case WM_MOUSEMOVE:
  1069. pmi->dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
  1070. pmi->dx = (LONG)(( w & 0x0000ffff ) * fWidthScale);
  1071. pmi->dy = (LONG)(( w >> 16 ) * fHeightScale );
  1072. return TRUE;
  1073. case WM_LBUTTONDOWN:
  1074. pmi->dwFlags = MOUSEEVENTF_LEFTDOWN;
  1075. return TRUE;
  1076. case WM_RBUTTONDOWN:
  1077. pmi->dwFlags = MOUSEEVENTF_RIGHTDOWN;
  1078. return TRUE;
  1079. case WM_LBUTTONUP:
  1080. pmi->dwFlags = MOUSEEVENTF_LEFTUP;
  1081. return TRUE;
  1082. case WM_RBUTTONUP:
  1083. pmi->dwFlags = MOUSEEVENTF_RIGHTUP;
  1084. return TRUE;
  1085. default:
  1086. break;
  1087. }
  1088. return FALSE;
  1089. }
  1090. BOOL
  1091. WINAPI
  1092. CreateKeybdInput(
  1093. RCAKEYBDINPUT* pbi,
  1094. UINT msg,
  1095. WPARAM w,
  1096. LPARAM l
  1097. )
  1098. {
  1099. pbi->dwExtraInfo = 0;
  1100. pbi->time  = 0;
  1101. pbi->wScan  = 0;
  1102. switch( msg )
  1103. {
  1104. case WM_KEYDOWN:
  1105. pbi->wVk = (WORD)w;
  1106. pbi->dwFlags = 0;
  1107. return TRUE;
  1108. case WM_KEYUP:
  1109. pbi->wVk = (WORD)w;
  1110. pbi->dwFlags = KEYEVENTF_KEYUP;
  1111. return TRUE;
  1112. default:
  1113. break;
  1114. }
  1115. return FALSE;
  1116. }