PeeperLib.cpp
Upload User: xztxsm
Upload Date: 2007-02-12
Package Size: 150k
Code Size: 42k
Category:

Remote Control

Development Platform:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // 远程控制软件-偷窥者  开发库                                               //
  3. // 日期:2001/10/02                                                           //
  4. // 作者:刘东发                                                               //
  5. // Email:dongfa@yeah.net                                                     //
  6. // http://dongfa.yeah.net                                                    //
  7. // OICQ:5584173  阿东                                                        //
  8. // 作者声明:                                                                 //
  9. //     此部分代码全是作者所写,可以随便传播,但要保持文件的完整性,有问题     //
  10. // 或者意见请来信,谢谢!                                                      //
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #include "stdafx.h"
  13. #include "PeeperLib.h"
  14. #include "PeeperZip.h"
  15. #include "Base64.h"
  16. #include <afxinet.h>
  17. #pragma comment(lib, "Wininet.lib")
  18. BOOL WINAPI PL_InitSocket()
  19. {
  20. #define MAJOR_VERSION 1
  21. #define MINOR_VERSION 2
  22. int nStatus = 0;
  23. WORD wMajorVersion = MAJOR_VERSION;
  24. WORD wMinorVersion = MINOR_VERSION;
  25. WORD wVersionReqd = MAKEWORD(wMajorVersion, wMinorVersion);
  26. WSADATA lpmyWSAData;
  27. nStatus = ::WSAStartup(wVersionReqd, &lpmyWSAData);
  28. if(nStatus != 0)
  29. {
  30. return FALSE;
  31. }
  32. return TRUE;
  33. }
  34. BOOL WINAPI PL_TermSocket()
  35. {
  36. return (::WSACleanup() == 0)?TRUE : FALSE;
  37. }
  38. int WINAPI PL_SendSocketData(SOCKET s, BYTE *chData, int nLen, BYTE chFlag, UINT uFlag)
  39. {
  40. int nRet = INVALID_SOCKET;
  41. if(s != INVALID_SOCKET)
  42. {
  43. char *chTemp = new char[nLen + 3];
  44. ZeroMemory(chTemp, nLen + 3);
  45. if(chFlag == PL_NONE) // only data
  46. {
  47. if(chData != NULL)
  48. {
  49. if(uFlag == MSG_OOB)
  50. {
  51. //实际数据大小为N,以MSG_OOB发送时数据长度要加1
  52. nLen += 1;
  53. }
  54. nRet = ::send(s, (char *)chData, nLen, uFlag);
  55. }
  56. else
  57. {
  58. nRet = 0;
  59. }
  60. }
  61. else 
  62. {
  63. chTemp[0] = chFlag;
  64. if(chData != NULL)
  65. {
  66. memcpy(chTemp + 1, chData, nLen);
  67. }
  68. else
  69. {
  70. nLen = 0;
  71. }
  72. if(uFlag == MSG_OOB)
  73. {
  74. //实际数据大小为N,以MSG_OOB发送时数据长度要加1
  75. nLen += 1;
  76. }
  77. nRet = ::send(s, chTemp, nLen+1, uFlag);
  78. }
  79. delete []chTemp;
  80. }
  81. return nRet;
  82. }
  83. int WINAPI PL_ReadSocketData(SOCKET s, BYTE *chData, int nLen, BYTE *chFlag, UINT uFlag)
  84. {
  85. int nRet = INVALID_SOCKET;
  86. if(s != INVALID_SOCKET)
  87. {
  88. nRet = ::recv(s, (char *)chData, nLen, uFlag);
  89. if(nRet > 0)
  90. {
  91. if(chFlag != NULL)
  92. {
  93. *chFlag = chData[0];
  94. }
  95. }
  96. }
  97. return nRet;
  98. }
  99. HGLOBAL WINAPI PL_LZ77_Zip(HGLOBAL hUnZip)
  100. {
  101. int _n = ::GetTickCount();
  102. int nSize = ::GlobalSize(hUnZip);
  103. LPBYTE lpData = (LPBYTE)::GlobalLock(hUnZip);
  104. HGLOBAL hZip = NULL;
  105. if(nSize > 0 && lpData != NULL)
  106. {
  107. const int nMax = 65536;
  108. BYTE byTemp[nMax + 16];
  109. CCompressLZ77 cc;
  110. WORD wFlag1 = 0;
  111. WORD wFlag2 = 0;
  112. int nLast = nSize;
  113. int nReal = 0;
  114. hZip = ::GlobalAlloc(GHND, nMax+16);
  115. LPBYTE lpZipData = (LPBYTE)::GlobalLock(hZip);
  116. int nPos = 0;
  117. int nZipPos = 0;
  118. while(nLast > 0)
  119. {
  120. nReal = min(nLast, nMax);
  121. nLast -= nReal;
  122. if(nReal == nMax)
  123. {
  124. wFlag1 = 0;
  125. }
  126. else
  127. {
  128. wFlag1 = nReal;
  129. }
  130. memcpy(lpZipData + nZipPos, &wFlag1, sizeof(WORD));
  131. nZipPos += sizeof(WORD);
  132. int nRetLen = 0;
  133. nRetLen = cc.Compress(lpData + nPos, nReal, byTemp);
  134. if(nRetLen == 0) // can't compress the block
  135. {
  136. wFlag2 = wFlag1;
  137. memcpy(lpZipData + nZipPos, &wFlag2, sizeof(WORD));
  138. nZipPos += sizeof(WORD);
  139. memcpy(lpZipData + nZipPos, lpData + nPos, nReal);
  140. nZipPos += nReal;
  141. }
  142. else
  143. {
  144. wFlag2 = (WORD)nRetLen;
  145. memcpy(lpZipData + nZipPos, &wFlag2, sizeof(WORD));
  146. nZipPos += sizeof(WORD);
  147. memcpy(lpZipData + nZipPos, byTemp, nRetLen);
  148. nZipPos += nRetLen;
  149. }
  150. nPos += nReal;
  151. ::GlobalUnlock(hZip);
  152. if(nLast > 0)
  153. {
  154. hZip = ::GlobalReAlloc(hZip, nZipPos + nMax, 0);
  155. }
  156. else
  157. {
  158. hZip = ::GlobalReAlloc(hZip, nZipPos, 0);
  159. }
  160. lpZipData = (LPBYTE)::GlobalLock(hZip);
  161. }
  162. ::GlobalUnlock(hZip);
  163. }
  164. TRACE(_T("PL_LZ77_Zip--Time:%d, %d-->%d.n"),
  165. GetTickCount() - _n, GlobalSize(hUnZip), GlobalSize(hZip));
  166. return hZip;
  167. }
  168. HGLOBAL WINAPI PL_LZ77_UnZip(HGLOBAL hZip)
  169. {
  170. int _n = ::GetTickCount();
  171. int nSize = ::GlobalSize(hZip);
  172. LPBYTE lpZipData = (LPBYTE)::GlobalLock(hZip);
  173. HGLOBAL hUnZip = NULL;
  174. if(nSize > 0 && lpZipData != NULL)
  175. {
  176. const int nMax = 65536;
  177. BYTE byTemp[nMax + 16];
  178. CCompressLZ77 cc;
  179. WORD wFlag1 = 0;
  180. WORD wFlag2 = 0;
  181. int nLast = nSize;
  182. int nReal = 0;
  183. hUnZip = ::GlobalAlloc(GHND, nMax+16);
  184. LPBYTE lpData = (LPBYTE)::GlobalLock(hUnZip);
  185. int nPos = 0;
  186. int nZipPos = 0;
  187. while(nLast > 0)
  188. {
  189. memcpy(&wFlag1, lpZipData + nZipPos, sizeof(WORD));
  190. nZipPos += sizeof(WORD);
  191. memcpy(&wFlag2, lpZipData + nZipPos, sizeof(WORD));
  192. nZipPos += sizeof(WORD);
  193. nLast -= 2*sizeof(WORD);
  194. if(wFlag1 == 0)
  195. {
  196. nReal = nMax;
  197. }
  198. else
  199. {
  200. nReal = wFlag1;
  201. }
  202. nLast -= wFlag2 ? (wFlag2) : nReal;
  203. if(wFlag2 == wFlag1)
  204. {
  205. memcpy(byTemp, lpZipData + nZipPos, nReal);
  206. nZipPos += nReal;
  207. }
  208. else
  209. {
  210. // if(AfxIsValidAddress(lpZipData + nZipPos, nReal))
  211. {
  212. if(!cc.Decompress(byTemp, nReal, lpZipData + nZipPos))
  213. {
  214. break ;
  215. }
  216. }
  217. nZipPos += wFlag2;
  218. }
  219. memcpy(lpData + nPos, byTemp, nReal);
  220. nPos += nReal;
  221. ::GlobalUnlock(hUnZip);
  222. if(nLast > 0)
  223. {
  224. if((::GlobalSize(hUnZip) - nPos) < nMax)
  225. {
  226. hUnZip = ::GlobalReAlloc(hUnZip, nPos + nMax, 0);
  227. }
  228. }
  229. else
  230. {
  231. hUnZip = ::GlobalReAlloc(hUnZip, nPos, 0);
  232. }
  233. lpData = (LPBYTE)::GlobalLock(hUnZip);
  234. }
  235. ::GlobalUnlock(hUnZip);
  236. }
  237. TRACE(_T("PL_LZ77_UnZip--Time:%d, %d-->%d.n"),
  238. GetTickCount() - _n, GlobalSize(hZip), GlobalSize(hUnZip));
  239. return hUnZip;
  240. }
  241. HGLOBAL WINAPI PL_LZSS_Zip(HGLOBAL hUnZip)
  242. {
  243. int _n = ::GetTickCount();
  244. HGLOBAL hZip = NULL;
  245. LPBYTE lpData = (LPBYTE)::GlobalLock(hUnZip);
  246. if(lpData != NULL)
  247. {
  248. int nLen = ::GlobalSize(hUnZip);
  249. C_LZSS lz;
  250. hZip = lz.Encode((char *)lpData, nLen);
  251. ::GlobalUnlock(hUnZip);
  252. }
  253. TRACE(_T("PL_LZSS_Zip--Time:%d, %d-->%d.n"),
  254. GetTickCount() - _n, GlobalSize(hUnZip), GlobalSize(hZip));
  255. return hZip;
  256. }
  257. HGLOBAL WINAPI PL_LZSS_UnZip(HGLOBAL hZip)
  258. {
  259. int _n = ::GetTickCount();
  260. HGLOBAL hUnZip = NULL;
  261. LPBYTE lpData = (LPBYTE)::GlobalLock(hZip);
  262. if(lpData != NULL)
  263. {
  264. int nLen = ::GlobalSize(hZip);
  265. C_LZSS lz;
  266. hUnZip = lz.Decode((char *)lpData, nLen);
  267. ::GlobalUnlock(hZip);
  268. }
  269. TRACE(_T("PL_LZSS_UnZip--Time:%d, %d-->%d.n"),
  270. GetTickCount() - _n, GlobalSize(hZip), GlobalSize(hUnZip));
  271. return hUnZip;
  272. }
  273. HGLOBAL WINAPI PL_ARI_Zip(HGLOBAL hUnZip)
  274. {
  275. int _n = ::GetTickCount();
  276. HGLOBAL hZip = NULL;
  277. LPBYTE lpData = (LPBYTE)::GlobalLock(hUnZip);
  278. if(lpData != NULL)
  279. {
  280. int nLen = ::GlobalSize(hUnZip);
  281. C_ARI lz;
  282. hZip = lz.Encode((char *)lpData, nLen);
  283. ::GlobalUnlock(hUnZip);
  284. }
  285. TRACE(_T("PL_ARI_Zip--Time:%d, %d-->%d.n"),
  286. GetTickCount() - _n, GlobalSize(hUnZip), GlobalSize(hZip));
  287. return hZip;
  288. }
  289. HGLOBAL WINAPI PL_ARI_UnZip(HGLOBAL hZip)
  290. {
  291. int _n = ::GetTickCount();
  292. HGLOBAL hUnZip = NULL;
  293. LPBYTE lpData = (LPBYTE)::GlobalLock(hZip);
  294. if(lpData != NULL)
  295. {
  296. int nLen = ::GlobalSize(hZip);
  297. C_ARI lz;
  298. hUnZip = lz.Decode((char *)lpData, nLen);
  299. ::GlobalUnlock(hZip);
  300. }
  301. TRACE(_T("PL_ARI_UnZip--Time:%d, %d-->%d.n"),
  302. GetTickCount() - _n, GlobalSize(hZip), GlobalSize(hUnZip));
  303. return hUnZip;
  304. }
  305. HGLOBAL WINAPI PL_LZW_Zip(HGLOBAL hUnZip)
  306. {
  307. int _n = ::GetTickCount();
  308. HGLOBAL hZip = NULL;
  309. LPBYTE lpData = (LPBYTE)::GlobalLock(hUnZip);
  310. if(lpData != NULL)
  311. {
  312. int nLen = ::GlobalSize(hUnZip);
  313. C_LZW lz;
  314. hZip = lz.Encode((char *)lpData, nLen);
  315. ::GlobalUnlock(hUnZip);
  316. }
  317. TRACE(_T("PL_LZW_Zip--Time:%d, %d-->%d.n"),
  318. GetTickCount() - _n, GlobalSize(hUnZip), GlobalSize(hZip));
  319. return hZip;
  320. }
  321. HGLOBAL WINAPI PL_LZW_UnZip(HGLOBAL hZip)
  322. {
  323. int _n = ::GetTickCount();
  324. HGLOBAL hUnZip = NULL;
  325. LPBYTE lpData = (LPBYTE)::GlobalLock(hZip);
  326. if(lpData != NULL)
  327. {
  328. int nLen = ::GlobalSize(hZip);
  329. C_LZW lz;
  330. hUnZip = lz.Decode((char *)lpData, nLen);
  331. ::GlobalUnlock(hZip);
  332. }
  333. TRACE(_T("PL_LZW_UnZip--Time:%d, %d-->%d.n"),
  334. GetTickCount() - _n, GlobalSize(hZip), GlobalSize(hUnZip));
  335. return hUnZip;
  336. }
  337. BOOL WINAPI PL_Bmp2Gry(HBITMAP hBmp, LPBYTE *lpGryData, SIZE *szGrySize)
  338. {
  339. //目前只支持256色
  340. LPBYTE lpBitsData = NULL;
  341. int nBmpSize = 0;
  342. BITMAPINFO *pInfo = NULL;
  343. BITMAP  bm;
  344. GetObject(hBmp, sizeof(BITMAP), &bm);
  345. if(bm.bmBitsPixel != 8)
  346. {
  347. return FALSE;
  348. }
  349. szGrySize->cx = bm.bmWidth; szGrySize->cy = bm.bmHeight;
  350. nBmpSize = ((((bm.bmWidth * bm.bmBitsPixel) + 31) & ~31) >> 3) * bm.bmHeight;
  351. lpBitsData = new BYTE[nBmpSize];
  352. memset(lpBitsData, 0, nBmpSize);
  353. pInfo = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD)];
  354. pInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  355. pInfo->bmiHeader.biWidth = bm.bmWidth;
  356. pInfo->bmiHeader.biHeight = bm.bmHeight;
  357. pInfo->bmiHeader.biPlanes = bm.bmPlanes;
  358. pInfo->bmiHeader.biBitCount = bm.bmBitsPixel;
  359. pInfo->bmiHeader.biCompression = BI_RGB;
  360. pInfo->bmiHeader.biSizeImage = nBmpSize;
  361. pInfo->bmiHeader.biXPelsPerMeter = 0;
  362. pInfo->bmiHeader.biYPelsPerMeter = 0;
  363. pInfo->bmiHeader.biClrUsed = 0;
  364. pInfo->bmiHeader.biClrImportant = 0;
  365. HDC           hMemDC;
  366. HBITMAP       hOldBitmap;
  367. RGBQUAD       rgb[256];
  368. memset(rgb, 0, 256);
  369. hMemDC = CreateCompatibleDC(NULL);
  370. hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBmp);
  371. // Get the DIBSection's color table
  372. GetDIBColorTable(hMemDC, 0, 256, rgb);
  373. // Populate BITMAPINFO header info
  374. // Now actually get the bits
  375. CClientDC cdc( CWnd::GetDesktopWindow() );
  376. ::GetDIBits(cdc.GetSafeHdc(), hBmp,
  377. 0, (WORD)bm.bmHeight, lpBitsData, pInfo, DIB_RGB_COLORS);
  378. *lpGryData = new BYTE[nBmpSize];
  379. memset(*lpGryData, 0, nBmpSize);
  380. for(int i = 0; i < nBmpSize; i ++)
  381. {
  382. int nIndex = lpBitsData[i];
  383. double r = (double)(rgb[nIndex].rgbRed);
  384. double g = (double)(rgb[nIndex].rgbGreen);
  385. double b = (double)(rgb[nIndex].rgbBlue);
  386. BYTE c = (BYTE)(r*0.29900 + g*0.58700 + b*0.11400);
  387. int pos = ((bm.bmHeight - (i/bm.bmWidth) - 1)*bm.bmWidth) + (i % bm.bmWidth);
  388. (*lpGryData)[pos] = c;
  389. }
  390. SelectObject(hMemDC, hOldBitmap);
  391. DeleteDC(hMemDC);
  392. delete []lpBitsData;
  393. lpBitsData = NULL;
  394. return TRUE;
  395. }
  396. BOOL WINAPI PL_DrawGry(HDC hDC, LPBYTE lpGryData, SIZE szGrySize)
  397. {
  398. //暂不实现
  399. return TRUE;
  400. }
  401. HBITMAP WINAPI PL_GetBitmap(HWND hWnd)
  402. {
  403. HDC hWndDC = NULL;
  404. HDC hMemDC = NULL;
  405. HBITMAP hMemBmp = NULL;
  406. HBITMAP hOldBmp = NULL;
  407. RECT rect;
  408. int w = 0, h = 0;
  409. if(hWnd == NULL)
  410. {
  411. hWnd = ::GetDesktopWindow();
  412. }
  413. hWndDC = ::GetWindowDC(hWnd);
  414. hMemDC = ::CreateCompatibleDC(hWndDC);
  415. ::GetWindowRect(hWnd, &rect);
  416. w = rect.right - rect.left;
  417. h = rect.bottom - rect.top;
  418. hMemBmp = ::CreateCompatibleBitmap(hWndDC, w, h);
  419. hOldBmp = (HBITMAP)::SelectObject(hMemDC, hMemBmp);
  420. ::BitBlt(hMemDC, 0, 0, w, h, hWndDC, 0, 0, SRCCOPY);
  421. // Why???
  422. hMemBmp = (HBITMAP)::SelectObject(hMemDC, hOldBmp);
  423. ::DeleteObject(hOldBmp);
  424. ::ReleaseDC(NULL, hMemDC);
  425. ::ReleaseDC(NULL, hWndDC);
  426. return hMemBmp;
  427. }
  428. BOOL WINAPI PL_DrawBmp(HDC hDC, LPRECT lpDCRect, HBITMAP hBmp, LPRECT lpBmpRect, CPalette* pPal)
  429. {
  430. HDC hMemDC = NULL;
  431. BITMAP bm;
  432. hMemDC = ::CreateCompatibleDC(hDC);
  433. ::GetObject(hBmp, sizeof(bm), &bm);
  434. ::SelectObject(hMemDC, hBmp);
  435. if(lpBmpRect == NULL)
  436. {
  437. if(lpDCRect != NULL)
  438. {
  439. ::SetStretchBltMode(hDC, COLORONCOLOR);
  440. ::StretchBlt(hDC, lpDCRect->left, lpDCRect->top, RECTWIDTH(lpDCRect), RECTHEIGHT(lpDCRect),
  441. hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
  442. }
  443. else
  444. {
  445. ::BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
  446. }
  447. }
  448. else
  449. {
  450. if(lpDCRect != NULL)
  451. {
  452. ::SetStretchBltMode(hDC, COLORONCOLOR);
  453. ::StretchBlt(hDC, lpDCRect->left, lpDCRect->top, RECTWIDTH(lpDCRect), RECTHEIGHT(lpDCRect), 
  454. hMemDC, lpBmpRect->left, lpBmpRect->top, RECTWIDTH(lpBmpRect), RECTHEIGHT(lpBmpRect), SRCCOPY);
  455. }
  456. else
  457. {
  458. ::BitBlt(hDC, 0, 0, RECTWIDTH(lpBmpRect), RECTHEIGHT(lpBmpRect), 
  459. hMemDC, lpDCRect->left, lpDCRect->top, SRCCOPY);
  460. }
  461. }
  462. ::ReleaseDC(NULL, hMemDC);
  463. return TRUE;
  464. }
  465. int WINAPI PL_ColorsNum(LPBYTE lpbi)
  466. {
  467. WORD wBitCount = 0;
  468. if(IS_WIN30_DIB(lpbi))
  469. {
  470. DWORD dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
  471. if(dwClrUsed != 0)
  472. return dwClrUsed;
  473. }
  474. if(IS_WIN30_DIB(lpbi))
  475. wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
  476. else
  477. wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
  478. switch (wBitCount)
  479. {
  480. case 1:
  481. return 2;
  482. case 4:
  483. return 16;
  484. case 8:
  485. return 256;
  486. default:
  487. return 0;
  488. }
  489. }
  490. int WINAPI PL_DIBWidth(LPBYTE lpDIB)
  491. {
  492. LPBITMAPINFOHEADER lpbmi;
  493. LPBITMAPCOREHEADER lpbmc;
  494. lpbmi = (LPBITMAPINFOHEADER)lpDIB;
  495. lpbmc = (LPBITMAPCOREHEADER)lpDIB;
  496. if (IS_WIN30_DIB(lpDIB))
  497. return lpbmi->biWidth;
  498. else
  499. return lpbmc->bcWidth;
  500. }
  501. int WINAPI PL_DIBHeight(LPBYTE lpDIB)
  502. {
  503. LPBITMAPINFOHEADER lpbmi;
  504. LPBITMAPCOREHEADER lpbmc;
  505. lpbmi = (LPBITMAPINFOHEADER)lpDIB;
  506. lpbmc = (LPBITMAPCOREHEADER)lpDIB;
  507. if (IS_WIN30_DIB(lpDIB))
  508. return lpbmi->biHeight;
  509. else
  510. return lpbmc->bcHeight;
  511. }
  512. int WINAPI PL_PaletteSize(LPBYTE lpbi)
  513. {
  514.    if(IS_WIN30_DIB(lpbi))
  515.   return (WORD)(::PL_ColorsNum(lpbi)*sizeof(RGBQUAD));
  516.    else
  517.   return (WORD)(::PL_ColorsNum(lpbi)*sizeof(RGBTRIPLE));
  518. }
  519. HDIB WINAPI PL_BmpToDIB(HBITMAP hBitmap, HPALETTE hPal, int nBits)
  520. {
  521.     BITMAP              bm;
  522.     BITMAPINFOHEADER    bi;
  523.     LPBITMAPINFOHEADER  lpbi;
  524.     DWORD               dwLen;
  525.     HANDLE              hDIB, h;
  526.     HDC                 hDC;
  527.     WORD                biBits;
  528.     if(!hBitmap)
  529.         return NULL;
  530.     if(!GetObject(hBitmap, sizeof(bm), (LPSTR)&bm))
  531.         return NULL;
  532.     if (hPal == NULL)
  533.         hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
  534.     biBits = bm.bmPlanes * bm.bmBitsPixel;
  535.     if (biBits <= 1)
  536.         biBits = 1;
  537.     else if (biBits <= 4)
  538.         biBits = 4;
  539.     else if (biBits <= 8)
  540.         biBits = 8;
  541.     else
  542.         biBits = 24;
  543. if(nBits != -1)
  544. {
  545. if(nBits == 1 || nBits == 4 || nBits == 8 || nBits == 24)
  546. {
  547. biBits = nBits;
  548. }
  549. }
  550.     bi.biSize = sizeof(BITMAPINFOHEADER);
  551.     bi.biWidth = bm.bmWidth;
  552.     bi.biHeight = bm.bmHeight;
  553.     bi.biPlanes = 1;
  554.     bi.biBitCount = biBits;
  555.     bi.biCompression = BI_RGB;
  556.     bi.biSizeImage = 0;
  557.     bi.biXPelsPerMeter = 0;
  558.     bi.biYPelsPerMeter = 0;
  559.     bi.biClrUsed = 0;
  560.     bi.biClrImportant = 0;
  561.     dwLen = bi.biSize + PL_PaletteSize((LPBYTE)&bi);
  562.     hDC = GetDC(NULL);
  563.     hPal = SelectPalette(hDC, hPal, FALSE);
  564.     RealizePalette(hDC);
  565.     hDIB = GlobalAlloc(GHND, dwLen);
  566.     if (!hDIB)
  567.     {
  568.       SelectPalette(hDC, hPal, TRUE);
  569.       RealizePalette(hDC);
  570.       ReleaseDC(NULL, hDC);
  571.       return NULL;
  572.     }
  573.     lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  574.     *lpbi = bi;
  575.     GetDIBits(hDC, hBitmap, 0, (UINT)bi.biHeight, NULL, (LPBITMAPINFO)lpbi,
  576.         DIB_RGB_COLORS);
  577.     bi = *lpbi;
  578.     GlobalUnlock(hDIB);
  579.     if (bi.biSizeImage == 0)
  580.         bi.biSizeImage = WIDTHBYTES((DWORD)bm.bmWidth * biBits) * bm.bmHeight;
  581.     dwLen = bi.biSize + PL_PaletteSize((LPBYTE)&bi) + bi.biSizeImage;
  582.     if (h = GlobalReAlloc(hDIB, dwLen, 0))
  583.         hDIB = h;
  584.     else
  585.     {
  586.         GlobalFree(hDIB);
  587.         hDIB = NULL;
  588.         SelectPalette(hDC, hPal, TRUE);
  589.         RealizePalette(hDC);
  590.         ReleaseDC(NULL, hDC);
  591.         return NULL;
  592.     }
  593.     lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  594.     if (GetDIBits(hDC, hBitmap, 0, (UINT)bi.biHeight, (LPSTR)lpbi +
  595.             (WORD)lpbi->biSize + PL_PaletteSize((LPBYTE)lpbi), (LPBITMAPINFO)lpbi,
  596.             DIB_RGB_COLORS) == 0)
  597.     {
  598.         GlobalUnlock(hDIB);
  599.         hDIB = NULL;
  600.         SelectPalette(hDC, hPal, TRUE);
  601.         RealizePalette(hDC);
  602.         ReleaseDC(NULL, hDC);
  603.         return NULL;
  604.     }
  605.     bi = *lpbi;
  606.     GlobalUnlock(hDIB);
  607.     SelectPalette(hDC, hPal, TRUE);
  608.     RealizePalette(hDC);
  609.     ReleaseDC(NULL, hDC);
  610.     return (HDIB) hDIB;
  611. }
  612. BOOL WINAPI PL_CreateDIBPalette(HDIB hDIB, CPalette* pPal)
  613. {
  614. LPLOGPALETTE lpPal = NULL;
  615. HANDLE hLogPal = NULL;
  616. HPALETTE hPal = NULL;
  617. int i;                   // loop index
  618. WORD wNumColors;         // number of colors in color table
  619. LPSTR lpbi;              // pointer to packed-DIB
  620. LPBITMAPINFO lpbmi;      // pointer to BITMAPINFO structure (Win3.0)
  621. LPBITMAPCOREINFO lpbmc;  // pointer to BITMAPCOREINFO structure (old)
  622. BOOL bWinStyleDIB;       // flag which signifies whether this is a Win3.0 DIB
  623. BOOL bResult = FALSE;
  624. if (hDIB == NULL)
  625. return FALSE;
  626. lpbi = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  627. lpbmi = (LPBITMAPINFO)lpbi;
  628. lpbmc = (LPBITMAPCOREINFO)lpbi;
  629. wNumColors = ::PL_ColorsNum((LPBYTE)lpbi);
  630. if (wNumColors != 0)
  631. {
  632. hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
  633. + sizeof(PALETTEENTRY) * wNumColors);
  634. if (hLogPal == 0)
  635. {
  636. ::GlobalUnlock((HGLOBAL) hDIB);
  637. return FALSE;
  638. }
  639. lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);
  640. lpPal->palVersion = PALVERSION;
  641. lpPal->palNumEntries = (WORD)wNumColors;
  642. bWinStyleDIB = IS_WIN30_DIB(lpbi);
  643. for (i = 0; i < (int)wNumColors; i++)
  644. {
  645. if (bWinStyleDIB)
  646. {
  647. lpPal->palPalEntry[i].peRed = lpbmi->bmiColors[i].rgbRed;
  648. lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
  649. lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue;
  650. lpPal->palPalEntry[i].peFlags = 0;
  651. }
  652. else
  653. {
  654. lpPal->palPalEntry[i].peRed = lpbmc->bmciColors[i].rgbtRed;
  655. lpPal->palPalEntry[i].peGreen = lpbmc->bmciColors[i].rgbtGreen;
  656. lpPal->palPalEntry[i].peBlue = lpbmc->bmciColors[i].rgbtBlue;
  657. lpPal->palPalEntry[i].peFlags = 0;
  658. }
  659. }
  660. bResult = pPal->CreatePalette(lpPal);
  661. ::GlobalUnlock((HGLOBAL) hLogPal);
  662. ::GlobalFree((HGLOBAL) hLogPal);
  663. }
  664. ::GlobalUnlock((HGLOBAL) hDIB);
  665. return bResult;
  666. }
  667. LPBYTE WINAPI PL_DIBBits(LPBYTE lpbi)
  668. {
  669. return (lpbi + *(LPDWORD)lpbi + ::PL_PaletteSize(lpbi));
  670. }
  671. BOOL WINAPI PL_DrawDIB(HDC hDC, LPRECT lpDCRect, HDIB hDIB, 
  672.    LPRECT lpDIBRect, CPalette* pPal)
  673. {
  674. LPSTR    lpDIBHdr;
  675. LPSTR    lpDIBBits;
  676. BOOL     bSuccess = FALSE;
  677. HPALETTE hPal = NULL;
  678. HPALETTE hOldPal = NULL;
  679. if(hDIB == NULL)
  680. return -1;
  681. lpDIBHdr  = (LPSTR)::GlobalLock((HGLOBAL) hDIB);
  682. lpDIBBits = (LPSTR)::PL_DIBBits((LPBYTE)lpDIBHdr);
  683. if(pPal != NULL)
  684. {
  685. hPal = (HPALETTE) pPal->m_hObject;
  686. hOldPal = ::SelectPalette(hDC, hPal, TRUE);
  687. }
  688. if(lpDIBRect == NULL)
  689. {
  690. if(lpDCRect != NULL)
  691. {
  692. ::SetStretchBltMode(hDC, COLORONCOLOR);
  693. bSuccess = ::StretchDIBits(hDC, lpDCRect->left, lpDCRect->top,
  694. RECTWIDTH(lpDCRect), RECTHEIGHT(lpDCRect), 0, 0, 
  695. PL_DIBWidth((LPBYTE)lpDIBHdr), PL_DIBHeight((LPBYTE)lpDIBHdr),
  696. lpDIBBits, (LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS, SRCCOPY);
  697. }
  698. else
  699. {
  700. bSuccess = ::SetDIBitsToDevice(hDC, 0, 0,
  701. PL_DIBWidth((LPBYTE)lpDIBHdr), PL_DIBHeight((LPBYTE)lpDIBHdr),
  702. 0, 0, 0, PL_DIBHeight((LPBYTE)lpDIBHdr),
  703. lpDIBBits, (LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS);
  704. }
  705. }
  706. else
  707. {
  708. if(lpDCRect != NULL)
  709. {
  710. ::SetStretchBltMode(hDC, COLORONCOLOR);
  711. bSuccess = ::StretchDIBits(hDC, lpDCRect->left, lpDCRect->top,
  712. RECTWIDTH(lpDCRect), RECTHEIGHT(lpDCRect),
  713. lpDIBRect->left, lpDIBRect->top, 
  714. RECTWIDTH(lpDIBRect), RECTHEIGHT(lpDIBRect),
  715. lpDIBBits, (LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS, SRCCOPY);
  716. }
  717. else
  718. {
  719. bSuccess = ::SetDIBitsToDevice(hDC, 0, 0,
  720. RECTWIDTH(lpDIBRect), RECTHEIGHT(lpDIBRect),
  721. 0, 0, 0, RECTHEIGHT(lpDIBRect),
  722. lpDIBBits, (LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS);
  723. }
  724. }
  725. ::GlobalUnlock((HGLOBAL)hDIB);
  726. if (hOldPal != NULL)
  727. {
  728. ::SelectPalette(hDC, hOldPal, TRUE);
  729. }
  730. return bSuccess;
  731. }
  732. SIZE WINAPI PL_GetScreenSize()
  733. {
  734. SIZE sz;
  735. sz.cx = ::GetSystemMetrics(SM_CXSCREEN);
  736. sz.cy = ::GetSystemMetrics(SM_CYSCREEN);
  737. return sz;
  738. }
  739. void WINAPI PL_MouseMove(POINT point)
  740. {
  741. ::SetCursorPos(point.x, point.y);
  742. }
  743. void WINAPI PL_MouseLButtonDown(POINT point, BOOL bMove)
  744. {
  745. if(bMove)
  746. {
  747. ::PL_MouseMove(point);
  748. }
  749. ::mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);
  750. }
  751. void WINAPI PL_MouseLButtonUp(POINT point, BOOL bMove)
  752. {
  753. if(bMove)
  754. {
  755. ::PL_MouseMove(point);
  756. }
  757. ::mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);
  758. }
  759. void WINAPI PL_MouseRButtonDown(POINT point, BOOL bMove)
  760. {
  761. if(bMove)
  762. {
  763. ::PL_MouseMove(point);
  764. }
  765. ::mouse_event(MOUSEEVENTF_RIGHTDOWN, point.x, point.y, 0, 0);
  766. }
  767. void WINAPI PL_MouseRButtonUp(POINT point, BOOL bMove)
  768. {
  769. if(bMove)
  770. {
  771. ::PL_MouseMove(point);
  772. }
  773. ::mouse_event(MOUSEEVENTF_RIGHTUP, point.x, point.y, 0, 0);
  774. }
  775. void WINAPI PL_MouseLButtonDblClk(POINT point, BOOL bMove)
  776. {
  777. if(bMove)
  778. {
  779. ::PL_MouseMove(point);
  780. }
  781. ::PL_MouseLButtonDown(point);
  782. ::PL_MouseLButtonUp(point);
  783. ::PL_MouseLButtonDown(point);
  784. ::PL_MouseLButtonUp(point);
  785. }
  786. void WINAPI PL_MouseRButtonDblClk(POINT point, BOOL bMove)
  787. {
  788. if(bMove)
  789. {
  790. ::PL_MouseMove(point);
  791. }
  792. ::PL_MouseRButtonDown(point);
  793. ::PL_MouseRButtonUp(point);
  794. ::PL_MouseRButtonDown(point);
  795. ::PL_MouseRButtonUp(point);
  796. }
  797. void WINAPI PL_KeyDown(UINT uChar, UINT uFlag)
  798. {
  799. ::keybd_event((BYTE)uChar, (BYTE)uChar, 0, 0);
  800. }
  801. void WINAPI PL_KeyUp(UINT uChar, UINT uFlag)
  802. {
  803. ::keybd_event((BYTE)uChar, (BYTE)uChar, KEYEVENTF_KEYUP, 0);
  804. }
  805. BOOL WINAPI PL_GetHostName(char *chIP, char *chName)
  806. {
  807. BOOL bRet = FALSE;
  808. char chTemp[256];
  809. hostent* pEnt = NULL;
  810. ZeroMemory(chTemp, 256);
  811. int nRet = ::gethostname(chTemp, 256);
  812. if(nRet == 0)
  813. {
  814. if(AfxIsValidAddress(chName, strlen(chTemp)))
  815. {
  816. strcpy(chName, chTemp);
  817. bRet = TRUE;
  818. }
  819. if(AfxIsValidAddress(chIP, 16))
  820. {
  821. pEnt = ::gethostbyname(chTemp);
  822. if(pEnt)
  823. {
  824. sprintf(chIP, "%d.%d.%d.%d", 
  825. BYTE(pEnt->h_addr_list[0][0]), BYTE(pEnt->h_addr_list[0][1]),
  826. BYTE(pEnt->h_addr_list[0][2]), BYTE(pEnt->h_addr_list[0][3]));
  827. bRet = TRUE;
  828. }
  829. else
  830. {
  831. bRet = FALSE;
  832. }
  833. }
  834. }
  835. return bRet;
  836. }
  837. int WINAPI PL_ExecuteCommand(char *chCommandLine)
  838. {
  839. return ::WinExec(chCommandLine, SW_NORMAL);
  840. }
  841. void WINAPI PL_LockDesktop(BOOL bLock)
  842. {
  843. ::ShowCursor(!bLock);
  844. ::SystemParametersInfo(SPI_SETFASTTASKSWITCH, (int)(!bLock), NULL, 0);
  845. ::SystemParametersInfo(SPI_SCREENSAVERRUNNING, (int)bLock, NULL, 0);
  846. ::EnableWindow(::GetDesktopWindow(), !bLock);
  847. }
  848. BOOL WINAPI PL_ExitWindow(UINT uFlag)
  849. {
  850. HANDLE hToken = NULL;
  851. TOKEN_PRIVILEGES tkp;
  852. BOOL fResult = FALSE;
  853. if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  854. {
  855. if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
  856. {
  857. tkp.PrivilegeCount = 1;
  858. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
  859. if(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0))
  860. {
  861. return ::ExitWindowsEx(uFlag, 0);
  862. }
  863. }
  864. }
  865. return ::ExitWindowsEx(uFlag, 0);
  866. }
  867. void WINAPI PL_Send_CtrlAltDel()
  868. {
  869. ::PL_KeyDown(VK_CONTROL, 0);
  870. ::PL_KeyDown(VK_MENU, 0);
  871. ::PL_KeyDown(VK_DELETE, 0);
  872. ::Sleep(2000);
  873. ::PL_KeyUp(VK_CONTROL, 0);
  874. ::PL_KeyUp(VK_MENU, 0);
  875. ::PL_KeyUp(VK_DELETE, 0);
  876. }
  877. BOOL WINAPI PL_CopyFileClient(CString strIP, UINT uPort, char *chSrc, 
  878.   BOOL bSend, HWND hNotifyWnd)
  879. {
  880. BOOL bRet = FALSE;
  881. CSocket sckClient;
  882. CFile file;
  883. do
  884. {
  885. if(bSend)
  886. {
  887. bRet = file.Open(chSrc, CFile::modeRead);
  888. }
  889. else
  890. {
  891. bRet = file.Open(chSrc, CFile::modeCreate | CFile::modeWrite);
  892. }
  893. if(!bRet)
  894. {
  895. break ;
  896. }
  897. bRet = sckClient.Create();
  898. if(!bRet)
  899. {
  900. break ;
  901. }
  902. bRet = sckClient.Connect(strIP, uPort);
  903. if(!bRet)
  904. {
  905. break ;
  906. }
  907. BYTE *chFileData = new BYTE[PL_SOCKET_MAXBYTES+1];
  908. char chData[10];
  909. int nSize = 0;
  910. if(bSend)
  911. {
  912. nSize = file.GetLength();
  913. int nRead = nSize;
  914. ZeroMemory(chData, 10);
  915. memcpy(chData, &nSize, sizeof(int));
  916. int nRet = sckClient.Send(chData, sizeof(int));
  917. if(nRet <= 0)
  918. {
  919. bRet = FALSE;
  920. break ;
  921. }
  922. while(nRead > 0)
  923. {
  924. int n1 = min(nRead, PL_SOCKET_MAXBYTES);
  925. int n2 = file.Read(chFileData, n1);
  926. nRead -= n2;
  927. nRet = sckClient.Send(chFileData, n2);
  928. if(nRet <= 0)
  929. {
  930. bRet = FALSE;
  931. break ;
  932. }
  933. if(hNotifyWnd != NULL)
  934. {
  935. int nProgress = (int)(((float)(nSize - nRead))*100.0f/((float)nSize));
  936. ::PostMessage(hNotifyWnd, PL_PEEPER_NOTIFY_COPYFILE, 
  937. (WPARAM)nProgress, NULL);
  938. }
  939. bRet = TRUE;
  940. }
  941. }
  942. else
  943. {
  944. char chData[10];
  945. ZeroMemory(chData, 10);
  946. nSize = 0;
  947. int nRet = sckClient.Receive(chData, 10);//读文件大小
  948. if(nRet <= 0)
  949. {
  950. bRet = FALSE;
  951. break ;
  952. }
  953. nSize = *((int*)(chData));
  954. if(nSize <= 0)
  955. {
  956. bRet = FALSE;
  957. break ;
  958. }
  959. BYTE *chFileData = new BYTE[PL_SOCKET_MAXBYTES+1];
  960. int nWrite = 0;
  961. while(nWrite < nSize)
  962. {
  963. nRet = sckClient.Receive(chFileData, PL_SOCKET_MAXBYTES);
  964. if(nRet <= 0)
  965. {
  966. bRet = FALSE;
  967. break ;
  968. }
  969. file.Write(chFileData, nRet);
  970. nWrite += nRet;
  971. if(hNotifyWnd != NULL)
  972. {
  973. int nProgress = (int)(((float)nWrite)*100.0f/((float)nSize));
  974. ::PostMessage(hNotifyWnd, PL_PEEPER_NOTIFY_COPYFILE, 
  975. (WPARAM)nProgress, NULL);
  976. }
  977. bRet = TRUE;
  978. }
  979. }
  980. delete []chFileData;
  981. if(!bRet) // 送文件数据出错.
  982. {
  983. break ;
  984. }
  985. }while(0);
  986. if(sckClient.m_hSocket != INVALID_SOCKET)
  987. {
  988. sckClient.Close();
  989. }
  990. if(file.m_hFile != CFile::hFileNull)
  991. {
  992. file.Close();
  993. }
  994. return bRet;
  995. }
  996. BOOL WINAPI PL_CopyFileServer(UINT uPort, char *chDes, BOOL bSend, HWND hNotifyWnd)
  997. {
  998. BOOL bRet = FALSE;
  999. CFile file;
  1000. CSocket sckServer;
  1001. CSocket sckClient;
  1002. do
  1003. {
  1004. if(!bSend)
  1005. {
  1006. bRet = file.Open(chDes, CFile::modeCreate | CFile::modeWrite);
  1007. }
  1008. else
  1009. {
  1010. bRet = file.Open(chDes, CFile::modeRead);
  1011. }
  1012. if(!bRet)
  1013. {
  1014. break ;
  1015. }
  1016. bRet = sckServer.Create(uPort);
  1017. if(!bRet)
  1018. {
  1019. break ;
  1020. }
  1021. bRet = sckServer.Listen();
  1022. if(!bRet)
  1023. {
  1024. break ;
  1025. }
  1026. bRet = sckServer.Accept(sckClient);
  1027. if(!bRet)
  1028. {
  1029. break ;
  1030. }
  1031. char chData[10];
  1032. BYTE *chFileData = new BYTE[PL_SOCKET_MAXBYTES+1];
  1033. int nSize = 0;
  1034. if(!bSend)
  1035. {
  1036. ZeroMemory(chData, 10);
  1037. int nRet = sckClient.Receive(chData, 10);//读文件大小
  1038. if(nRet <= 0)
  1039. {
  1040. bRet = FALSE;
  1041. break ;
  1042. }
  1043. nSize = *((int*)(chData));
  1044. if(nSize <= 0)
  1045. {
  1046. bRet = FALSE;
  1047. break ;
  1048. }
  1049. int nWrite = 0;
  1050. while(nWrite < nSize)
  1051. {
  1052. nRet = sckClient.Receive(chFileData, PL_SOCKET_MAXBYTES);
  1053. if(nRet <= 0)
  1054. {
  1055. bRet = FALSE;
  1056. break ;
  1057. }
  1058. file.Write(chFileData, nRet);
  1059. nWrite += nRet;
  1060. if(hNotifyWnd != NULL)
  1061. {
  1062. int nProgress = (int)(((float)nWrite)*100.0f/((float)nSize));
  1063. ::PostMessage(hNotifyWnd, PL_PEEPER_NOTIFY_COPYFILE, 
  1064. (WPARAM)nProgress, NULL);
  1065. }
  1066. bRet = TRUE;
  1067. }
  1068. }
  1069. else
  1070. {
  1071. nSize = file.GetLength();
  1072. int nRead = nSize;
  1073. ZeroMemory(chData, 10);
  1074. memcpy(chData, &nSize, sizeof(int));
  1075. int nRet = sckClient.Send(chData, sizeof(int));
  1076. if(nRet <= 0)
  1077. {
  1078. bRet = FALSE;
  1079. break ;
  1080. }
  1081. while(nRead > 0)
  1082. {
  1083. int n1 = min(nRead, PL_SOCKET_MAXBYTES);
  1084. int n2 = file.Read(chFileData, n1);
  1085. nRead -= n2;
  1086. nRet = sckClient.Send(chFileData, n2);
  1087. if(nRet <= 0)
  1088. {
  1089. bRet = FALSE;
  1090. break ;
  1091. }
  1092. if(hNotifyWnd != NULL)
  1093. {
  1094. int nProgress = (int)(((float)(nSize - nRead))*100.0f/((float)nSize));
  1095. ::PostMessage(hNotifyWnd, PL_PEEPER_NOTIFY_COPYFILE, 
  1096. (WPARAM)nProgress, NULL);
  1097. }
  1098. bRet = TRUE;
  1099. }
  1100. }
  1101. delete []chFileData;
  1102. }while(0);
  1103. if(sckClient.m_hSocket != INVALID_SOCKET)
  1104. {
  1105. sckClient.Close();
  1106. }
  1107. if(sckServer.m_hSocket != INVALID_SOCKET)
  1108. {
  1109. sckServer.Close();
  1110. }
  1111. if(file.m_hFile != CFile::hFileNull)
  1112. {
  1113. file.Close();
  1114. }
  1115. return bRet;
  1116. }
  1117. BOOL WINAPI PL_DeleteFile(char *chFileName)
  1118. {
  1119. BOOL bRet = FALSE;
  1120. DWORD dwFlag = ::SetFileAttributes(chFileName, FILE_ATTRIBUTE_NORMAL);
  1121. if(dwFlag != 0xFFFFFFFF)
  1122. {
  1123. bRet = ::DeleteFile(chFileName);
  1124. }
  1125. return bRet;
  1126. }
  1127. BOOL WINAPI PL_MoveFile(char *chSrcFileName, char *chDesFileName)
  1128. {
  1129. BOOL bRet = FALSE;
  1130. DWORD dwFlag = ::SetFileAttributes(chSrcFileName, FILE_ATTRIBUTE_NORMAL);
  1131. if(dwFlag != 0xFFFFFFFF)
  1132. {
  1133. bRet = ::MoveFile(chSrcFileName, chDesFileName);
  1134. }
  1135. return bRet;
  1136. }
  1137. BOOL WINAPI PL_SendMail(CString strSMTP, CString strFrom, 
  1138. CString strTo, CString strSubject, CString strBody)
  1139. {
  1140. BOOL bRet = FALSE;
  1141. CSocket sckSmtp;
  1142. if(sckSmtp.Create())
  1143. {
  1144. char chMonth[][12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", 
  1145. "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
  1146. SYSTEMTIME sm;
  1147. ::GetLocalTime(&sm);
  1148. CString strDate;
  1149. //                  日  月  年    时  分  秒  
  1150. strDate.Format(_T("%02d %s %02d %02d:%02d:%02d"), 
  1151. sm.wDay, chMonth[sm.wMonth-1], sm.wYear%100, 
  1152. sm.wHour, sm.wMinute, sm.wSecond);
  1153. char chTemp[1024];
  1154. int nRet = -1;
  1155. if(sckSmtp.Connect(strSMTP, 25))
  1156. {
  1157. do
  1158. {
  1159. //接收信息
  1160. ZeroMemory(chTemp, 1024);
  1161. nRet = sckSmtp.Receive(chTemp, 1024);
  1162. if(nRet < 0)
  1163. break ;
  1164. if(strncmp(chTemp, "220", 3) != 0 &&
  1165.    strncmp(chTemp, "250", 3) != 0 &&
  1166.    strncmp(chTemp, "354", 3) != 0 &&
  1167.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1168. break ;
  1169. //欢迎用户
  1170. TCHAR local_host[80];
  1171. ZeroMemory(local_host, 80*sizeof(TCHAR));
  1172. ::gethostname(local_host, 80);
  1173. CString strUser = CString(local_host);
  1174. ZeroMemory(chTemp, 1024);
  1175. sprintf(chTemp, "HELO %srn", strUser);
  1176. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1177. if(nRet < 0)
  1178. break ;
  1179. //接收信息
  1180. ZeroMemory(chTemp, 1024);
  1181. nRet = sckSmtp.Receive(chTemp, 1024);
  1182. if(nRet < 0)
  1183. break ;
  1184. if(strncmp(chTemp, "220", 3) != 0 &&
  1185.    strncmp(chTemp, "250", 3) != 0 &&
  1186.    strncmp(chTemp, "354", 3) != 0 &&
  1187.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1188. break ;
  1189. //mail from
  1190. ZeroMemory(chTemp, 1024);
  1191. sprintf(chTemp, "MAIL FROM: <%s>rn", strFrom);
  1192. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1193. if(nRet < 0)
  1194. break ;
  1195. //接收信息
  1196. ZeroMemory(chTemp, 1024);
  1197. nRet = sckSmtp.Receive(chTemp, 1024);
  1198. if(nRet < 0)
  1199. break ;
  1200. if(strncmp(chTemp, "220", 3) != 0 &&
  1201.    strncmp(chTemp, "250", 3) != 0 &&
  1202.    strncmp(chTemp, "354", 3) != 0 &&
  1203.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1204. break ;
  1205. //rcpt to
  1206. ZeroMemory(chTemp, 1024);
  1207. sprintf(chTemp, "RCPT TO: <%s>rn", strTo);
  1208. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1209. if(nRet < 0)
  1210. break ;
  1211. //接收信息
  1212. ZeroMemory(chTemp, 1024);
  1213. nRet = sckSmtp.Receive(chTemp, 1024);
  1214. if(nRet < 0)
  1215. break ;
  1216. if(strncmp(chTemp, "220", 3) != 0 &&
  1217.    strncmp(chTemp, "250", 3) != 0 &&
  1218.    strncmp(chTemp, "354", 3) != 0 &&
  1219.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1220. break ;
  1221. //Data
  1222. ZeroMemory(chTemp, 1024);
  1223. sprintf(chTemp, "DATArn");
  1224. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1225. if(nRet < 0)
  1226. break ;
  1227. //接收信息
  1228. ZeroMemory(chTemp, 1024);
  1229. nRet = sckSmtp.Receive(chTemp, 1024);
  1230. if(nRet < 0)
  1231. break ;
  1232. if(strncmp(chTemp, "220", 3) != 0 &&
  1233.    strncmp(chTemp, "250", 3) != 0 &&
  1234.    strncmp(chTemp, "354", 3) != 0 &&
  1235.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1236. break ;
  1237. //信件内容
  1238. //时间
  1239. ZeroMemory(chTemp, 1024);
  1240. sprintf(chTemp, "Date: %srn", strDate);
  1241. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1242. if(nRet < 0)
  1243. break ;
  1244. //From
  1245. ZeroMemory(chTemp, 1024);
  1246. sprintf(chTemp, "From:%srn", strFrom);
  1247. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1248. if(nRet < 0)
  1249. break ;
  1250. //To
  1251. ZeroMemory(chTemp, 1024);
  1252. sprintf(chTemp, "To:%srn", strTo);
  1253. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1254. if(nRet < 0)
  1255. break ;
  1256. //CC
  1257. // ZeroMemory(chTemp, 1024);
  1258. // sprintf(chTemp, "CC:%srn", strCC);
  1259. // sckSmtp.Send(chTemp, strlen(chTemp));
  1260. //Subject
  1261. ZeroMemory(chTemp, 1024);
  1262. sprintf(chTemp, "Subject:%srn", strSubject);
  1263. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1264. if(nRet < 0)
  1265. break ;
  1266. //内容
  1267. int nLen = strBody.GetLength() + 5;
  1268. char *chBody = new char[nLen];
  1269. ZeroMemory(chBody, nLen);
  1270. sprintf(chBody, "%srn", strBody);
  1271. nRet = sckSmtp.Send(chBody, strlen(chBody));
  1272. delete []chBody;
  1273. if(nRet < 0)
  1274. break ;
  1275. //结束
  1276. ZeroMemory(chTemp, 1024);
  1277. sprintf(chTemp, ".rn");
  1278. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1279. if(nRet < 0)
  1280. break ;
  1281. //接收信息
  1282. ZeroMemory(chTemp, 1024);
  1283. nRet = sckSmtp.Receive(chTemp, 1024);
  1284. if(nRet < 0)
  1285. break ;
  1286. if(strncmp(chTemp, "220", 3) != 0 &&
  1287.    strncmp(chTemp, "250", 3) != 0 &&
  1288.    strncmp(chTemp, "354", 3) != 0 &&
  1289.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1290. break ;
  1291. //退出
  1292. ZeroMemory(chTemp, 1024);
  1293. sprintf(chTemp, "QUITrn");
  1294. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1295. if(nRet < 0)
  1296. break ;
  1297. bRet = TRUE;
  1298. }while(0);
  1299. }
  1300. sckSmtp.Close();
  1301. }
  1302. return bRet;
  1303. }
  1304. BOOL WINAPI PL_SendMail2(CString strSMTP, CString strFrom, CString strAuth, 
  1305.   CString strPass, CString strTo, CString strSubject, 
  1306.   CString strBody)
  1307. {
  1308. BOOL bRet = FALSE;
  1309. CSocket sckSmtp;
  1310. if(sckSmtp.Create())
  1311. {
  1312. char chMonth[][12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", 
  1313. "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
  1314. SYSTEMTIME sm;
  1315. ::GetLocalTime(&sm);
  1316. CString strDate;
  1317. //                  日  月  年    时  分  秒  
  1318. strDate.Format(_T("%02d %s %02d %02d:%02d:%02d"), 
  1319. sm.wDay, chMonth[sm.wMonth-1], sm.wYear%100, 
  1320. sm.wHour, sm.wMinute, sm.wSecond);
  1321. char chTemp[1024];
  1322. int nRet = -1;
  1323. if(sckSmtp.Connect(strSMTP, 25))
  1324. {
  1325. do
  1326. {
  1327. //接收信息
  1328. ZeroMemory(chTemp, 1024);
  1329. nRet = sckSmtp.Receive(chTemp, 1024);
  1330. if(nRet < 0)
  1331. break ;
  1332. if(strncmp(chTemp, "220", 3) != 0 &&
  1333.    strncmp(chTemp, "250", 3) != 0 &&
  1334.    strncmp(chTemp, "334", 3) != 0 &&
  1335.    strncmp(chTemp, "235", 3) != 0 &&
  1336.    strncmp(chTemp, "354", 3) != 0 &&
  1337.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1338. break ;
  1339. //欢迎用户
  1340. char local_host[80];
  1341. ZeroMemory(local_host, 80);
  1342. DWORD dwLen = 80;
  1343. GetUserName(local_host, &dwLen);
  1344. ZeroMemory(chTemp, 1024);
  1345. sprintf(chTemp, "EHLO %srn", local_host);
  1346. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1347. if(nRet < 0)
  1348. break ;
  1349. //接收信息
  1350. ZeroMemory(chTemp, 1024);
  1351. nRet = sckSmtp.Receive(chTemp, 1024);
  1352. if(nRet < 0)
  1353. break ;
  1354. if(strncmp(chTemp, "220", 3) != 0 &&
  1355.    strncmp(chTemp, "250", 3) != 0 &&
  1356.    strncmp(chTemp, "334", 3) != 0 &&
  1357.    strncmp(chTemp, "235", 3) != 0 &&
  1358.    strncmp(chTemp, "354", 3) != 0 &&
  1359.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1360. break ;
  1361. // auto login
  1362. ZeroMemory(chTemp, 1024);
  1363. sprintf(chTemp, "AUTH LOGINrn");
  1364. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1365. if(nRet < 0)
  1366. break ;
  1367. ZeroMemory(chTemp, 1024);
  1368. nRet = sckSmtp.Receive(chTemp, 1024);
  1369. if(nRet < 0)
  1370. break ;
  1371. if(strncmp(chTemp, "220", 3) != 0 &&
  1372.    strncmp(chTemp, "250", 3) != 0 &&
  1373.    strncmp(chTemp, "334", 3) != 0 &&
  1374.    strncmp(chTemp, "235", 3) != 0 &&
  1375.    strncmp(chTemp, "354", 3) != 0 &&
  1376.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1377. break ;
  1378. // verify user(Base64)
  1379. CBase64 cb;
  1380. ZeroMemory(chTemp, 1024);
  1381. sprintf(chTemp, "%srn", cb.Encode(strAuth.GetBuffer(0), strAuth.GetLength()));
  1382. strAuth.ReleaseBuffer();
  1383. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1384. if(nRet < 0)
  1385. break ;
  1386. ZeroMemory(chTemp, 1024);
  1387. nRet = sckSmtp.Receive(chTemp, 1024);
  1388. if(nRet < 0)
  1389. break ;
  1390. if(strncmp(chTemp, "220", 3) != 0 &&
  1391.    strncmp(chTemp, "250", 3) != 0 &&
  1392.    strncmp(chTemp, "334", 3) != 0 &&
  1393.    strncmp(chTemp, "235", 3) != 0 &&
  1394.    strncmp(chTemp, "354", 3) != 0 &&
  1395.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1396. break ;
  1397. // verify password
  1398. ZeroMemory(chTemp, 1024);
  1399. sprintf(chTemp, "%srn", cb.Encode(strPass.GetBuffer(0), strPass.GetLength()));
  1400. strPass.ReleaseBuffer();
  1401. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1402. if(nRet < 0)
  1403. break ;
  1404. ZeroMemory(chTemp, 1024);
  1405. nRet = sckSmtp.Receive(chTemp, 1024);
  1406. if(nRet < 0)
  1407. break ;
  1408. if(strncmp(chTemp, "220", 3) != 0 &&
  1409.    strncmp(chTemp, "250", 3) != 0 &&
  1410.    strncmp(chTemp, "334", 3) != 0 &&
  1411.    strncmp(chTemp, "235", 3) != 0 &&
  1412.    strncmp(chTemp, "354", 3) != 0 &&
  1413.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1414. break ;
  1415. //mail from
  1416. ZeroMemory(chTemp, 1024);
  1417. sprintf(chTemp, "MAIL FROM: <%s>rn", strFrom);
  1418. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1419. if(nRet < 0)
  1420. break ;
  1421. //接收信息
  1422. ZeroMemory(chTemp, 1024);
  1423. nRet = sckSmtp.Receive(chTemp, 1024);
  1424. if(nRet < 0)
  1425. break ;
  1426. if(strncmp(chTemp, "220", 3) != 0 &&
  1427.    strncmp(chTemp, "250", 3) != 0 &&
  1428.    strncmp(chTemp, "334", 3) != 0 &&
  1429.    strncmp(chTemp, "235", 3) != 0 &&
  1430.    strncmp(chTemp, "354", 3) != 0 &&
  1431.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1432. break ;
  1433. //rcpt to
  1434. ZeroMemory(chTemp, 1024);
  1435. sprintf(chTemp, "RCPT TO: <%s>rn", strTo);
  1436. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1437. if(nRet < 0)
  1438. break ;
  1439. //接收信息
  1440. ZeroMemory(chTemp, 1024);
  1441. nRet = sckSmtp.Receive(chTemp, 1024);
  1442. if(nRet < 0)
  1443. break ;
  1444. if(strncmp(chTemp, "220", 3) != 0 &&
  1445.    strncmp(chTemp, "250", 3) != 0 &&
  1446.    strncmp(chTemp, "334", 3) != 0 &&
  1447.    strncmp(chTemp, "235", 3) != 0 &&
  1448.    strncmp(chTemp, "354", 3) != 0 &&
  1449.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1450. break ;
  1451. //Data
  1452. ZeroMemory(chTemp, 1024);
  1453. sprintf(chTemp, "DATArn");
  1454. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1455. if(nRet < 0)
  1456. break ;
  1457. //接收信息
  1458. ZeroMemory(chTemp, 1024);
  1459. nRet = sckSmtp.Receive(chTemp, 1024);
  1460. if(nRet < 0)
  1461. break ;
  1462. if(strncmp(chTemp, "220", 3) != 0 &&
  1463.    strncmp(chTemp, "250", 3) != 0 &&
  1464.    strncmp(chTemp, "334", 3) != 0 &&
  1465.    strncmp(chTemp, "235", 3) != 0 &&
  1466.    strncmp(chTemp, "354", 3) != 0 &&
  1467.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1468. break ;
  1469. //信件内容
  1470. //时间
  1471. ZeroMemory(chTemp, 1024);
  1472. sprintf(chTemp, "Date: %srn", strDate);
  1473. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1474. if(nRet < 0)
  1475. break ;
  1476. //From
  1477. ZeroMemory(chTemp, 1024);
  1478. sprintf(chTemp, "From:%srn", strFrom);
  1479. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1480. if(nRet < 0)
  1481. break ;
  1482. //To
  1483. ZeroMemory(chTemp, 1024);
  1484. sprintf(chTemp, "To:%srn", strTo);
  1485. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1486. if(nRet < 0)
  1487. break ;
  1488. //CC
  1489. // ZeroMemory(chTemp, 1024);
  1490. // sprintf(chTemp, "CC:%srn", strCC);
  1491. // sckSmtp.Send(chTemp, strlen(chTemp));
  1492. //Subject
  1493. ZeroMemory(chTemp, 1024);
  1494. sprintf(chTemp, "Subject:%srn", strSubject);
  1495. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1496. if(nRet < 0)
  1497. break ;
  1498. //内容
  1499. int nLen = strBody.GetLength() + 5;
  1500. char *chBody = new char[nLen];
  1501. ZeroMemory(chBody, nLen);
  1502. sprintf(chBody, "%srn", strBody);
  1503. nRet = sckSmtp.Send(chBody, strlen(chBody));
  1504. delete []chBody;
  1505. if(nRet < 0)
  1506. break ;
  1507. //结束
  1508. ZeroMemory(chTemp, 1024);
  1509. sprintf(chTemp, ".rn");
  1510. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1511. if(nRet < 0)
  1512. break ;
  1513. //接收信息
  1514. ZeroMemory(chTemp, 1024);
  1515. nRet = sckSmtp.Receive(chTemp, 1024);
  1516. if(nRet < 0)
  1517. break ;
  1518. if(strncmp(chTemp, "220", 3) != 0 &&
  1519.    strncmp(chTemp, "250", 3) != 0 &&
  1520.    strncmp(chTemp, "334", 3) != 0 &&
  1521.    strncmp(chTemp, "235", 3) != 0 &&
  1522.    strncmp(chTemp, "354", 3) != 0 &&
  1523.    strncmp(chTemp, "221", 3) != 0) // 220, 250, 354, 221成功
  1524. break ;
  1525. //退出
  1526. ZeroMemory(chTemp, 1024);
  1527. sprintf(chTemp, "QUITrn");
  1528. nRet = sckSmtp.Send(chTemp, strlen(chTemp));
  1529. if(nRet < 0)
  1530. break ;
  1531. bRet = TRUE;
  1532. }while(0);
  1533. }
  1534. sckSmtp.Close();
  1535. }
  1536. return bRet;
  1537. }
  1538. BOOL WINAPI PL_DetectInternetConnect(CString strHTTP)
  1539. {
  1540. BOOL bRet = FALSE;
  1541. HINTERNET hSession = NULL;
  1542. hSession = ::InternetOpen(_T("peeper"), PRE_CONFIG_INTERNET_ACCESS, NULL, NULL, 0);
  1543. if(hSession)
  1544. {
  1545. HINTERNET hHTTPSession = ::InternetOpenUrl(hSession,
  1546. strHTTP, NULL, 0, INTERNET_FLAG_RELOAD, 0);
  1547. if(hHTTPSession)
  1548. {
  1549. bRet = TRUE;
  1550. ::InternetCloseHandle(hHTTPSession);
  1551. }
  1552. ::InternetCloseHandle(hSession);
  1553. }
  1554. return bRet;
  1555. }
  1556. HGLOBAL WINAPI PL_ReadDataFromFile(CString strFile)
  1557. {
  1558. HGLOBAL hData = NULL;
  1559. CFile file;
  1560. if(file.Open(strFile, CFile::modeRead))
  1561. {
  1562. int nLen = file.GetLength();
  1563. hData = ::GlobalAlloc(GHND, nLen);
  1564. if(hData != NULL)
  1565. {
  1566. LPVOID lpData = ::GlobalLock(hData);
  1567. file.ReadHuge(lpData, nLen);
  1568. GlobalUnlock(hData);
  1569. }
  1570. file.Close();
  1571. }
  1572. return hData;
  1573. }
  1574. BOOL WINAPI PL_WriteDataToFile(CString strFile, HGLOBAL hData)
  1575. {
  1576. BOOL bRet = FALSE;
  1577. CFile file;
  1578. if(file.Open(strFile, CFile::modeCreate | CFile::modeWrite))
  1579. {
  1580. if(hData != NULL)
  1581. {
  1582. int nLen = ::GlobalSize(hData);
  1583. LPVOID lpData = ::GlobalLock(hData);
  1584. file.WriteHuge(lpData, nLen);
  1585. GlobalUnlock(hData);
  1586. bRet = TRUE;
  1587. }
  1588. file.Close();
  1589. }
  1590. return bRet;
  1591. }