Global.cpp 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165
  1. // Global.cpp : 应用程序的全局变量、函数源文件
  2. //
  3. // 代码生成在 2014年9月25日, 09:55
  4. #include "StdAfx.h"
  5. #include "Global.h"
  6. #include <io.h> // _access_s头文件;
  7. #include "afxcoll.h"
  8. #include "afxtempl.h"
  9. #include "atlconv.h"
  10. #include <tlhelp32.h>
  11. #include <WinSock.h>
  12. #include "..\\lzari.h"
  13. #include "..\helper\ffsco.h"
  14. //#include <WS2tcpip.h>
  15. // 升级包版本号;
  16. WORD g_arrFileVersion[4] = { 0 };
  17. TCHAR g_szLoginUser[MAX_PATH] = _T(""); // 当前软件的登陆用户名;
  18. TCHAR g_szLoginPsw[MAX_PATH] = _T(""); // 当前软件的登陆密码;
  19. TCHAR g_szModulePath[MAX_PATH] = _T(""); // 软件目录;
  20. TCHAR g_szModuleFileName[MAX_PATH] = _T(""); // 软件全名称;
  21. TCHAR g_szConnectString[MAX_PATH] = _T(""); // DB连接串;
  22. // 主机信息;
  23. TCHAR g_szHostComputerIP[MAX_PATH] = _T(""); // 服务端主机名称;
  24. DWORD g_dwCSPort = 5678; // 服务端主机通信TCP端口;
  25. // 数据库信息;
  26. TCHAR g_szDBSource[MAX_PATH] = _T(""); // 数据库源(服务所在IP或计算机名);
  27. TCHAR g_szDBSourcePort[MAX_PATH] = _T(""); // 数据库源端口;
  28. DWORD g_dwDBServerPort = 0; // 数据库源端口;
  29. TCHAR g_szDBAccount[MAX_PATH] = _T(""); // 数据库登录用户;
  30. TCHAR g_szDBPassWord[MAX_PATH] = _T(""); // 数据库登录密码;
  31. TCHAR g_szDBName[MAX_PATH] = _T(""); // 数据库名称;
  32. // 相片存储目录;
  33. TCHAR g_szShareHost[MAX_PATH] = _T(""); // 共享主机名;
  34. TCHAR g_szOriginalFolder[MAX_PATH] = _T(""); // 原片目录;
  35. TCHAR g_szOriginalBkFolder[MAX_PATH] = _T(""); // 原片备份目录;
  36. TCHAR g_szEarlyRepairFolder[MAX_PATH] = _T(""); // 初修片目录;
  37. TCHAR g_szEarlyRepairBkFolder[MAX_PATH] = _T(""); // 初修片备份目录;
  38. TCHAR g_szFurtherRepairFolder[MAX_PATH] = _T(""); // 精修片目录;
  39. TCHAR g_szFurtherRepairBkFolder[MAX_PATH] = _T(""); // 精修片备份目录;
  40. TCHAR g_szDesignFolder[MAX_PATH] = _T(""); // 设计片目录;
  41. TCHAR g_szDesignBkFolder[MAX_PATH] = _T(""); // 设计片备份目录;
  42. TCHAR g_szTelRecordingFolder[MAX_PATH] = _T(""); // 电话录音目录;
  43. TCHAR g_szFullDressImageFolder[MAX_PATH] = _T(""); // 礼服图片目录;
  44. // 软件所用加密狗是否已注册; // Jeff,应该放在SoftKey做为静态变量使用;
  45. BOOL g_bSoftWareReg = FALSE;
  46. // 加密狗中的字符信息S1:如 201409062003558789.ly.com
  47. // 该全局变量在旧软件名称是:g_sdomain;
  48. // 该变量在数据库表字段[path].[path1]中存储;
  49. CString g_strDogMainInfo = "";
  50. // 未知用途;
  51. // 该全局变量在旧软件中名称是:CString g_bMain;
  52. // 与集团版有关联性;
  53. // 有可能是主店名称;
  54. CString g_strMain = "";
  55. // 分店名称数组;旧软件中名称:g_branchnamearray
  56. CStringArray g_strArrayOfBranchName;
  57. // ??
  58. CStringArray g_strArrayOfBranchName2;
  59. // 分店IP地址数组;
  60. CStringArray g_strArrayOfBranchIPAdress;
  61. // 分店的加密狗S1信息数组;
  62. CStringArray g_strArrayOfBranchDogMainInfo;
  63. // 座席版允许连接数(从加密狗中获取);
  64. unsigned int g_nCountOfAllowToConn = 0;
  65. DWORD g_nLeng = 0;
  66. BYTE *g_pData = NULL;
  67. DWORD g_nLeng2 = 0;
  68. BYTE *g_pData2 = NULL;
  69. SENDHEAD g_sendhead;
  70. BOOL g_bRedSkin = 0;
  71. COLORREF g_gridcol1 = RGB(204, 204, 204);
  72. COLORREF g_gridcol2 = RGB(190, 190, 190);
  73. COLORREF g_bkcol = RGB(184, 184, 184);
  74. CString g_date;
  75. CString g_title;
  76. CArray<CStringArray, CStringArray>g_userarray;
  77. CArray<CStringArray, CStringArray>g_cominfoarray;
  78. CArray<CStringArray, CStringArray>g_cominfoarraylocal;
  79. CArray<DWORD, DWORD>g_lengarray;
  80. CArray<DWORD, DWORD>g_btnlengarray;
  81. CArray<BYTE*, BYTE*>g_pointerarray;
  82. CBrush g_editbkbrush;
  83. DWORD g_btnleng[8];
  84. int g_btnlengpos = -1;
  85. int g_nYearpos = -1;
  86. CString g_branchname = ""; // Jeff.集团版:????本分店名称;
  87. CString g_branchip = "";
  88. CString g_branchip2 = "";
  89. BOOL g_bBranchModify = 0;
  90. BOOL g_bShowOK = 0; // Jeff:?
  91. BOOL g_bStaffAchievementShow = 0; // 此机用于员工业绩查看;
  92. BOOL g_bSaveUploadTask1 = 0;
  93. BOOL g_bSaveUploadTask2 = 0;
  94. BOOL g_bSaveUploadTask3 = 0;
  95. BOOL g_bSaveUploadTask4 = 0;
  96. BOOL g_bSearchFilter = 0;
  97. CString g_waiter1;
  98. CString g_waiter2;
  99. CString g_waiter3;
  100. CString g_waiter4;
  101. CString g_waiter5;
  102. CString g_filterdate1;
  103. CString g_filterdate2;
  104. CString g_filterdate3;
  105. CString g_filterdate4;
  106. CString g_filterdate5;
  107. CString g_filterdate6;
  108. CString g_filterbranch;
  109. USER g_user;
  110. CString g_mainpath; // 软件目录
  111. CString g_id; //
  112. CString g_server; // 服务端地址
  113. CStringArray g_serverarray; //
  114. CString g_serverbak; //
  115. CString g_path1; /* 共享目录 <客户原片(管理软件)$> 如:"\\lyfz-pc\客户原片(管理软件)$" */
  116. CString g_path2; /* 共享目录 <修好的片(管理软件)$> 如:"\\lyfz-pc\修好的片(管理软件)$" */
  117. CString g_path3; /* 共享目录 <设计好的片(管理软件$)> 如:""> */
  118. CString g_path4; /* 共享目录 <精修好的片(管理软件$)> 如:""> */
  119. CString g_path5; /* 共享目录 <礼服图片(管理软件$)> 如:""> */
  120. CString g_path6; /* 共享目录 <电话录音(管理软件$)> 如:""> */
  121. CString g_path7; /* 共享目录 <客户原片(管理软件$)\效果图> 如:""> */
  122. CString g_path1bak;
  123. CString g_path2bak;
  124. CString g_path3bak;
  125. CString g_path4bak;
  126. CString g_path5bak;
  127. CString g_path6bak;
  128. CString g_path7bak;
  129. CDatabase g_db;
  130. DWORD g_ncount;
  131. CFont g_titlefont;
  132. DWORD g_nSendCode = 0;
  133. BOOL g_bSendOK = 0;
  134. CString g_temp;
  135. CArray<CStringArray, CStringArray>g_hisyeararray;
  136. CArray<CStringArray, CStringArray>g_brancharray;
  137. CArray<CStringArray, CStringArray>g_oldclientarray; // client表;
  138. BOOL g_bNoConnDlg = 0;
  139. BOOL g_bInSkin = 0;
  140. BOOL g_bGenBranchData = 0;
  141. BOOL g_bSortAscending = FALSE;
  142. CFont g_listctrlfont;
  143. float g_fscalex; // x坐标刻度
  144. float g_fscaley; // y坐标刻度
  145. int g_screenwid; // 桌面宽
  146. int g_screenhei; // 桌面高
  147. float g_WidthScale2 = 1;
  148. float g_HeightScale2 = 1;
  149. RESDATA2 g_resdata2;
  150. BOOL g_bAlphaWnd = 0;
  151. BYTE g_bNeedDrawParent = 0;
  152. BOOL g_bAllBranch = 0;
  153. CString g_domain;
  154. CString g_sInfo;
  155. int g_ncot = 0; // Jeff:订单总数(包含历史订单在内),该变量作用是当订单总数大于1000时,向公司服务器发送数据;
  156. int g_conpos = 0;
  157. int g_nAutoShowStaffAchievement = -1;
  158. BOOL g_bShowBar = 1;
  159. int g_bookingtype = 0;
  160. BOOL g_bNoLoginLia = 0;
  161. BOOL g_bConnLYFZ = 0;
  162. BOOL g_bSendLYFZ = 0;
  163. int g_ntimeout = 30000; // 客户端超时值;
  164. float g_WidthScale;
  165. float g_HeightScale;
  166. int g_dx = 0;
  167. int g_dy = 0;
  168. BOOL g_bNeedCoon = 1; // remark by Jeff:是否需要重新连接服务端;
  169. CStringArray g_menubranchname;
  170. CArray<CStringArray, CStringArray>g_List1array;
  171. /************************************************************************/
  172. /*
  173. Jeff:g_conntype
  174. g_conntype == 0 :表示正常连接?(或是连接本地服务器?)
  175. g_conntype == 1 :表示连接公司服务器(http://lijiafz.vicp.net)
  176. g_conntype == 2 :http://www.lyfz.net/download/ip.txt
  177. g_conntype == 3 :http://photo.bjlyfz.com/download/ip.txt
  178. g_conntype == 4 :
  179. */
  180. /************************************************************************/
  181. int g_conntype = 0;//正常
  182. //0 正常
  183. //1 连接1
  184. //2 连接2
  185. //3 连接3
  186. //4 连接4
  187. //************************************//
  188. // 数据库地址;
  189. // 数据库端口;
  190. // 数据库管理员账号;
  191. // 数据库管理员密码;
  192. // 数据库名称;
  193. //
  194. // [函数]:GetIniInfo
  195. // [描述]:获取指定ini信息;
  196. // [参数]:
  197. // szPath:ini所在目录;
  198. // szIniName:ini名;
  199. // [返回]:void
  200. //************************************//
  201. int GetSysIniInfo(const char *szPath, const char *szIniName)
  202. {
  203. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  204. TCHAR szDir[_MAX_DIR] = { 0 };
  205. TCHAR szFna[_MAX_DIR] = { 0 };
  206. TCHAR szExt[_MAX_DIR] = { 0 };
  207. ::GetModuleFileName(NULL, g_szModuleFileName, sizeof(g_szModuleFileName) / sizeof(TCHAR));
  208. sprintf(g_szModulePath, _T("%s"), g_szModuleFileName);
  209. _tsplitpath(g_szModulePath, szDrive, szDir, szFna, szExt);
  210. _tcscpy(g_szModulePath, szDrive);
  211. _tcscat(g_szModulePath, szDir);
  212. // -----------------------------------------------------//
  213. TCHAR szFile[MAX_PATH + 1] = "";
  214. if (szPath != NULL && szIniName != NULL)
  215. wsprintf(szFile, _T("%s\\%s"), szPath, szIniName);
  216. else
  217. wsprintf(szFile, _T("%s\\HostInfo.ini"), g_szModulePath);
  218. TRACE("szFile =%s\n", szFile);
  219. OFSTRUCT ofStruct;
  220. OpenFile(szFile, &ofStruct, OF_EXIST); // Jeff 这是为了兼容16位系统遗留的函数,不应该使用;
  221. if (ERROR_FILE_NOT_FOUND == GetLastError())
  222. {
  223. // 如果没找到,使用默认连接;
  224. strcpy(g_szHostComputerIP, _T("."));
  225. g_dwCSPort = 5678;
  226. // 不存在则创建;
  227. CFile fp;
  228. if( fp.Open(szFile,CFile::modeCreate|CFile::modeWrite) )
  229. {
  230. fp.Close();
  231. }
  232. WritePrivateProfileString(_T("NetWorkInfo"),_T("Host"),_T("127.0.0.1"),szFile);
  233. WritePrivateProfileString(_T("NetWorkInfo"),_T("CSPort"),_T("5678"),szFile);
  234. }
  235. // 获取服务器端TCP信息;
  236. GetPrivateProfileString(_T("NetWorkInfo"), _T("Host"), _T(""), g_szHostComputerIP, MAX_PATH, szFile);
  237. g_dwCSPort = GetPrivateProfileInt(_T("NetWorkInfo"), _T("CSPort"), 0, szFile);
  238. g_ntimeout = GetPrivateProfileInt(_T("NetWorkInfo"), _T("TimeOut"), 30000, szFile);
  239. return 0;
  240. }
  241. //----------------------------------------------------------
  242. // 函数:IsFileExist
  243. // 描述:判断某文件是否存在;
  244. // 参数:
  245. // pFileFullName: 指定的文件名;
  246. // 返回:TRUE表示文件存在;
  247. //----------------------------------------------------------
  248. BOOL IsFileExist(const TCHAR *pFileFullName)
  249. {
  250. int err = 0;
  251. // Check for existence.
  252. if ((err = _access(pFileFullName, 0)) == 0)
  253. {
  254. //printf_s( "File crt_access_s.c exists.\n" );
  255. // Check for write permission.
  256. if ((err = _access(pFileFullName, 2)) == 0)
  257. {
  258. //printf_s( "File crt_access_s.c does have ""write permission.\n" );
  259. }
  260. else
  261. {
  262. //printf_s( "File crt_access_s.c does not have ""write permission.\n" );
  263. }
  264. }
  265. else
  266. {
  267. //printf_s( "File crt_access_s.c does not exist.\n" );
  268. return FALSE;
  269. }
  270. return TRUE;
  271. }
  272. // Pump messages while waiting for event
  273. //----------------------------------------------------------
  274. // 函数:WaitWithMessageLoop
  275. // 描述:等待某内核事件触发;
  276. // 参数:
  277. // hEvent: 被等待响应的内核事件对象;
  278. // nTimeout: 超时值;
  279. // 返回:TRUE返回触发成功;
  280. //----------------------------------------------------------
  281. BOOL WaitWithMessageLoop(HANDLE hEvent, int nTimeout)
  282. {
  283. DWORD dwRet = 0;
  284. while (1)
  285. {
  286. // wait for event or message, if it's a message, process it and return to waiting state
  287. dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, nTimeout, QS_ALLINPUT);
  288. if (dwRet == WAIT_OBJECT_0)
  289. {
  290. TRACE0("WaitWithMessageLoop() event triggered.\n");
  291. return TRUE;
  292. }
  293. else
  294. if (dwRet == WAIT_OBJECT_0 + 1)
  295. {
  296. // process window messages
  297. AfxGetApp()->PumpMessage();
  298. }
  299. else
  300. if (dwRet == WAIT_TIMEOUT)
  301. {
  302. // timed out !
  303. return FALSE;
  304. }
  305. else
  306. {
  307. // WAIT_ABANDONED_0 ...
  308. return TRUE;
  309. }
  310. }
  311. }
  312. //----------------------------------------------------------
  313. // 函数:DeleteDirectory
  314. // 描述:删除指定目录下的所有文件;
  315. // 参数:strDir:指定要删除的文件目录;
  316. // 返回:;
  317. //----------------------------------------------------------
  318. void DeleteDirectory(CString strDir)
  319. {
  320. try
  321. {
  322. // 首先删除文件及子文件夹
  323. CFileFind ff;
  324. BOOL bFound = ff.FindFile(strDir + "\\*", 0);
  325. while (bFound)
  326. {
  327. bFound = ff.FindNextFile();
  328. if (ff.GetFileName() == "." || ff.GetFileName() == "..")
  329. continue;
  330. // 去掉文件(夹)只读等属性
  331. SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL);
  332. if (ff.IsDirectory())
  333. { // 递归删除子文件夹
  334. DeleteDirectory(ff.GetFilePath());
  335. RemoveDirectory(ff.GetFilePath());
  336. }
  337. else
  338. {
  339. DeleteFile(ff.GetFilePath()); // 删除文件
  340. }
  341. }
  342. ff.Close();
  343. // 然后删除该文件夹
  344. RemoveDirectory(strDir);
  345. }
  346. catch (...)
  347. {
  348. //WriteLogin("出错在函数deldir中");
  349. }
  350. // int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp );
  351. }
  352. // Jeff.注册控件函数;2014.09.11
  353. //----------------------------------------------------------
  354. // 函数:RegisterOcx
  355. // 描述:注册指定的组件文件;
  356. // 参数:ocxfile指定要注册的组件文件名;
  357. // 返回:TRUE表示注册成功;
  358. //----------------------------------------------------------
  359. BOOL RegisterOcx(LPCTSTR ocxfile)
  360. {
  361. HKEY hKey;
  362. bool bRet;
  363. USES_CONVERSION;
  364. ITypeLib* pTypeLib;
  365. CString CLSIDStr;
  366. CLSID clsid;
  367. LPOLESTR wRes = NULL;
  368. if (LoadTypeLib(T2OLE(ocxfile), &pTypeLib) == S_OK)
  369. {
  370. TLIBATTR tlibAttr, *ptlibAttr;
  371. ptlibAttr = &tlibAttr;
  372. pTypeLib->GetLibAttr(&ptlibAttr);
  373. clsid = ptlibAttr->guid;
  374. pTypeLib->Release();
  375. }
  376. ::StringFromCLSID(clsid, &wRes);
  377. CLSIDStr = OLE2CT(wRes);
  378. if ((RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID\\" + CLSIDStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS) || (RegOpenKeyEx(HKEY_CLASSES_ROOT, "Wow6432Node\\TypeLib\\" + CLSIDStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS))
  379. {
  380. return true;
  381. }
  382. else
  383. {
  384. HINSTANCE hLib = LoadLibrary(ocxfile);
  385. if (hLib < (HINSTANCE)HINSTANCE_ERROR)
  386. {
  387. MessageBox(0, "权限不足,不能载入OCX文件!无法注册控件!", "结果", MB_OK);
  388. bRet = false;
  389. }
  390. else
  391. {
  392. FARPROC lpDllEntryPoint;
  393. lpDllEntryPoint = GetProcAddress(hLib, _T("DllRegisterServer"));
  394. if (lpDllEntryPoint != NULL)
  395. {
  396. if (FAILED((*lpDllEntryPoint)()))
  397. {
  398. MessageBox(0, "调用注册函数(DllRegisterServer)失败!无法注册控件!", "结果", MB_OK);
  399. bRet = false;
  400. }
  401. else
  402. bRet = true;
  403. }
  404. else
  405. {
  406. MessageBox(0, "调用注册函数(DllRegisterServer)失败!无法注册控件!", "结果", MB_OK);
  407. bRet = false;
  408. }
  409. }
  410. FreeLibrary(hLib);
  411. return bRet;
  412. }
  413. }
  414. // Jeff.Hacker. WINDOWS NT 以上的内核需要提权,才能对系统进行高级管理;
  415. //----------------------------------------------------------
  416. // 函数:GetDebugPriv
  417. // 描述:对程序提权;
  418. // 参数:
  419. // 返回:TRUE表示程序提权成功;
  420. //----------------------------------------------------------
  421. BOOL GetDebugPriv()
  422. {
  423. // 返回的访问令牌指针;
  424. HANDLE hToken;
  425. // 接收所返回的制定特权名称的信息;
  426. LUID sedebugnameValue;
  427. // 新特权信息的指针(结构体);
  428. TOKEN_PRIVILEGES tkp;
  429. DWORD dwCurProcId = GetCurrentProcessId();
  430. // 要修改访问权限的进程句柄;
  431. HANDLE hCurProc;
  432. hCurProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwCurProcId);
  433. if (!::OpenProcessToken(hCurProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  434. {
  435. ShowSystemErrorInfo(CString("提权OpenProcessToken失败。"), GetLastError());
  436. return FALSE;
  437. }
  438. if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
  439. {
  440. ShowSystemErrorInfo(CString("提权LookupPrivilegeValue失败。"), GetLastError());
  441. CloseHandle(hToken);
  442. return FALSE;
  443. }
  444. tkp.PrivilegeCount = 1;
  445. tkp.Privileges[0].Luid = sedebugnameValue;
  446. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  447. if (!::AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
  448. {
  449. ShowSystemErrorInfo(CString("提权AdjustTokenPrivileges失败。"), GetLastError());
  450. CloseHandle(hToken);
  451. return FALSE;
  452. }
  453. CloseHandle(hCurProc);
  454. CloseHandle(hToken);
  455. return TRUE;
  456. }
  457. //----------------------------------------------------------
  458. // 函数:GetFileVersion
  459. // 描述:获取指定模块的文件版本信息
  460. // 参数:
  461. // hModule: 指定的模块(如果为NULL,表示获取自身文件版本信息);
  462. // pBuffer: 返回的文件版本信息;
  463. //
  464. // 返回:TRUE表示获取模块文件版本信息成功;
  465. //----------------------------------------------------------
  466. bool GetFileVersion(HMODULE hModule, WORD *pBuffer)
  467. {
  468. TCHAR fname[MAX_PATH];
  469. VS_FIXEDFILEINFO *pVi;
  470. DWORD dwHandle;
  471. std::string str;
  472. if (::GetModuleFileName(hModule, fname, MAX_PATH))
  473. {
  474. int size = GetFileVersionInfoSize(fname, &dwHandle);
  475. if (size > 0)
  476. {
  477. BYTE *buffer = new BYTE[size];
  478. memset(buffer, 0, size);
  479. if (GetFileVersionInfo(fname, dwHandle, size, buffer))
  480. {
  481. if (VerQueryValue(buffer, _T("\\"), (LPVOID *)&pVi, (PUINT)&size))
  482. {
  483. pBuffer[0] = HIWORD(pVi->dwFileVersionMS);
  484. pBuffer[1] = LOWORD(pVi->dwFileVersionMS);
  485. pBuffer[2] = HIWORD(pVi->dwFileVersionLS);
  486. pBuffer[3] = LOWORD(pVi->dwFileVersionLS);
  487. delete buffer;
  488. return true;
  489. }
  490. }
  491. delete buffer;
  492. }
  493. }
  494. return false;
  495. }
  496. //----------------------------------------------------------
  497. // 函数:CheckInternalIP
  498. // 描述:判断IP(网络字节序)地址是否为外网地址;
  499. // 参数:ip_addr:主机IP(必须为网络字节序);
  500. //
  501. // 返回:TRUE表示主机IP为外网IP; FALSE表示内网IP;
  502. //----------------------------------------------------------
  503. BOOL CheckInternalIPV4(const unsigned int &ip_addr)
  504. {
  505. // 三段保留IP段,做为私有地址,不在在公网上使用,只作内网IP;
  506. // A类:10.0.0.0 ~ 10.255.255.255 = 0A.00.00.00 ~ 0A.FF.FF.FF
  507. // B类:172.16.0.0 ~ 172.31.255.255 = AC.10.00.00 ~ AC.1F.FF.FF
  508. // C类:192.168.0.0 ~ 192.168.255.255 = C0.A8.00.00 ~ C0.A8.FF.FF
  509. // D类:127.0.0.0 ~ 127.255.255.255 = 7F.00.00.00 ! 7F.FF.FF.FF (环回地址)
  510. #if 0
  511. //检查3类地址是否属于公网;
  512. if ((ip_addr >= 0x0A000000 && ip_addr <= 0x0AFFFFFF) ||
  513. (ip_addr >= 0xAC100000 && ip_addr <= 0xAC1FFFFF) ||
  514. (ip_addr >= 0xC0A80000 && ip_addr <= 0xC0A8FFFF)
  515. )
  516. {
  517. return FALSE;
  518. }
  519. return TRUE;
  520. #endif
  521. #if 0
  522. //检查3类地址是否属于内网;
  523. // 0xa -- "10.0.0.0">>24;
  524. // 0xc0a8--"192.168.0.0.">>16;
  525. // 0x2b0--"127.17.0.1">>22
  526. if ((ip_addr >> 24 == 0xa) || (ip_addr >> 16 == 0xc0a8) || (ip_addr >> 22 == 0x2b0))
  527. return FALSE;
  528. else
  529. return TRUE;
  530. #endif
  531. #if 1
  532. // 回环地址也算进去!
  533. if ((ip_addr >> 24 == 0x0A) || (ip_addr >> 20 == 0xAC1) || (ip_addr >> 16 == 0xC0A8) || (ip_addr >> 26 == 0x7))
  534. return FALSE;
  535. else
  536. return TRUE;
  537. #endif
  538. }
  539. //----------------------------------------------------------
  540. // 函数:IsValidIPV4
  541. // 描述:判断字符串是否是有效的IPV4;
  542. // 参数:szIP:主机IP;
  543. //
  544. // 返回:TRUE表示字符串为有效的IPV4;
  545. //----------------------------------------------------------
  546. BOOL IsValidIPV4(const TCHAR *szIP)
  547. {
  548. int nIndex = 0;
  549. int nPointCount = 0; // "."IPV4有3个;
  550. int nLen = strlen(szIP);
  551. for (int i = 0; i < nLen; i++)
  552. {
  553. if (szIP[i] == '.')
  554. {
  555. if (i == 0 || i == nLen - 1)
  556. {
  557. return FALSE;
  558. }
  559. else
  560. {
  561. if (++nIndex != i)
  562. {
  563. nIndex = i;
  564. nPointCount++;
  565. }
  566. else
  567. return FALSE;
  568. }
  569. continue;
  570. }
  571. if (isdigit(szIP[i]) == 0)
  572. return FALSE;
  573. }
  574. if (nPointCount != 3)
  575. return FALSE;
  576. return TRUE;
  577. }
  578. //----------------------------------------------------------
  579. // 函数:GetHostAllOfIP
  580. // 描述:返回指定主机名称的所有IPV4地址;
  581. // 参数:
  582. // pHostName: 主机名;
  583. // vtHostIPV4:指定主机名的所有IPV4地址;
  584. //
  585. // 返回:TRUE表示字符串为有效的IPV4;
  586. //----------------------------------------------------------
  587. int GetHostAllOfIP(const TCHAR *pHostName, std::vector<std::string> &vtHostIPV4)
  588. {
  589. #if 0
  590. WSADATA wsa = { 0 };
  591. WSAStartup(MAKEWORD(2, 2), &wsa);
  592. #endif
  593. #if 0 // YLGL项目使用不了,因为包含了旧的系统头文件;
  594. addrinfo hint, *answer, *curr;
  595. memset(&hint, 0, sizeof(addrinfo));
  596. hint.ai_family = AF_INET;
  597. hint.ai_socktype = SOCK_STREAM;
  598. int nRet = GetAddrInfo(pHostName, NULL, &hint, &answer);
  599. //int nRet = GetAddrInfo(pHostName, "5678", &hint, &answer);
  600. if (nRet != 0)
  601. {
  602. DWORD dwError = GetLastError();
  603. return;
  604. }
  605. TCHAR szIP[MAX_PATH];
  606. for (curr = answer; curr != NULL; curr = curr->ai_next)
  607. {
  608. //std::string ipstr;
  609. memset(szIP, 0, MAX_PATH);
  610. inet_ntop(AF_INET, &(((sockaddr_in*)(curr->ai_addr))->sin_addr), szIP, MAX_PATH);
  611. vtHostIPV4.push_back(szIP);
  612. }
  613. freeaddrinfo(answer);
  614. #endif
  615. return 0;
  616. }
  617. void DataToArray(CArray<CStringArray, CStringArray>*pArrayOfString, int datapos)
  618. {
  619. try
  620. {
  621. pArrayOfString->RemoveAll();
  622. if (g_nLeng == 0)
  623. {
  624. return;
  625. }
  626. // 1.code[0]数组:用作发送时,存储着操作指令;用作接收时,存储着接收数据大小???;
  627. if (g_sendhead.code[0])
  628. {
  629. // 1.1.将g_pData全局变量里保存的数据进行解压,并存储在lpszOut数组里;
  630. BYTE *lpszOut = NULL;
  631. int nOutSize = 0;
  632. LZARI Lzari;
  633. Lzari.UnCompress(g_pData, g_nLeng, lpszOut, nOutSize);
  634. // 1.2.将解压后的数据lpszOut附加到内存文件里;
  635. CMemFile memfile;
  636. memfile.Attach(lpszOut, nOutSize);
  637. Lzari.Release();
  638. // 1.3.将内存文件序列化保存到CArchive对象里;
  639. CArchive ar(&memfile, CArchive::load);
  640. pArrayOfString->SetSize(g_sendhead.count[0]);
  641. // 1.4.将CArchive对象里的数据,序列化到指定的CArray对象里;
  642. for (int ii = 0; ii < pArrayOfString->GetSize(); ii++)
  643. {
  644. pArrayOfString->ElementAt(ii).Serialize(ar);
  645. }
  646. // 1.5.完成数据的导出任务,释放内存;
  647. ar.Close();
  648. memfile.Detach();
  649. }
  650. else
  651. {
  652. CMemFile memfile;
  653. memfile.Attach(g_pData, g_nLeng);
  654. CArchive ar(&memfile, CArchive::load);
  655. pArrayOfString->SetSize(g_sendhead.count[0]);
  656. for (int ii = 0; ii < pArrayOfString->GetSize(); ii++)
  657. {
  658. pArrayOfString->ElementAt(ii).Serialize(ar);
  659. }
  660. ar.Close();
  661. memfile.Detach();
  662. }
  663. }
  664. catch (...)
  665. {
  666. }
  667. }
  668. void DataToArray(
  669. CArray<CStringArray, CStringArray>*pArrayOfString1,
  670. CArray<CStringArray, CStringArray>*pArrayOfString2,
  671. int datapos)
  672. {
  673. try
  674. {
  675. CArray<CStringArray, CStringArray>*parray[2] = { pArrayOfString1, pArrayOfString2 };
  676. DWORD bytereads = 0;
  677. for (int i = 0; i < 2; i++)
  678. {
  679. parray[i]->RemoveAll();
  680. if (g_sendhead.length[i] == 0)
  681. continue;
  682. if (g_sendhead.code[i])
  683. {
  684. // 1.1.将g_pData全局变量里保存的数据进行解压,并存储在lpszOut数组里;
  685. BYTE *lpszOut = NULL;
  686. int nOutSize = 0;
  687. LZARI Lzari;
  688. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  689. // 1.2.将解压后的数据lpszOut附加到内存文件里;
  690. CMemFile memfile;
  691. memfile.Attach(lpszOut, nOutSize);
  692. Lzari.Release();
  693. // 1.3.将内存文件序列化保存到CArchive对象里;
  694. bytereads += g_sendhead.length[i];
  695. CArchive ar(&memfile, CArchive::load);
  696. parray[i]->SetSize(g_sendhead.count[i]);
  697. // 1.4.将CArchive对象里的数据,序列化到指定的CArray对象里;
  698. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  699. {
  700. parray[i]->ElementAt(ii).Serialize(ar);
  701. }
  702. // 1.5.完成数据的导出任务,释放内存;
  703. ar.Close();
  704. memfile.Detach();
  705. }
  706. else
  707. {
  708. CMemFile memfile;
  709. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  710. bytereads += g_sendhead.length[i];
  711. CArchive ar(&memfile, CArchive::load);
  712. parray[i]->SetSize(g_sendhead.count[i]);
  713. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  714. {
  715. parray[i]->ElementAt(ii).Serialize(ar);
  716. }
  717. ar.Close();
  718. memfile.Detach();
  719. }
  720. }
  721. }
  722. catch (...)
  723. {
  724. }
  725. }
  726. void DataToArray(
  727. CArray<CStringArray, CStringArray>*pArrayOfString1,
  728. CArray<CStringArray, CStringArray>*pArrayOfString2,
  729. CArray<CStringArray, CStringArray>*pArrayOfString3,
  730. int datapos)
  731. {
  732. try
  733. {
  734. CArray<CStringArray, CStringArray>*parray[3] = { pArrayOfString1, pArrayOfString2, pArrayOfString3 };
  735. DWORD bytereads = 0;
  736. for (int i = 0; i < 3; i++)
  737. {
  738. parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue;
  739. if (g_sendhead.code[i])
  740. {
  741. BYTE *lpszOut = NULL;
  742. int nOutSize = 0;
  743. LZARI Lzari;
  744. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  745. CMemFile memfile;
  746. memfile.Attach(lpszOut, nOutSize);
  747. Lzari.Release();
  748. bytereads += g_sendhead.length[i];
  749. CArchive ar(&memfile, CArchive::load);
  750. parray[i]->SetSize(g_sendhead.count[i]);
  751. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  752. {
  753. parray[i]->ElementAt(ii).Serialize(ar);
  754. }
  755. ar.Close();
  756. memfile.Detach();
  757. }
  758. else
  759. {
  760. CMemFile memfile;
  761. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  762. bytereads += g_sendhead.length[i];
  763. CArchive ar(&memfile, CArchive::load);
  764. parray[i]->SetSize(g_sendhead.count[i]);
  765. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  766. {
  767. parray[i]->ElementAt(ii).Serialize(ar);
  768. }
  769. ar.Close();
  770. memfile.Detach();
  771. }
  772. }
  773. }
  774. catch (...)
  775. {
  776. }
  777. }
  778. void DataToArray(
  779. CArray<CStringArray, CStringArray>*pArrayOfString1,
  780. CArray<CStringArray, CStringArray>*pArrayOfString2,
  781. CArray<CStringArray, CStringArray>*pArrayOfString3,
  782. CArray<CStringArray, CStringArray>*pArrayOfString4,
  783. int datapos)
  784. {
  785. try
  786. {
  787. CArray<CStringArray, CStringArray>*parray[4] =
  788. {
  789. pArrayOfString1,
  790. pArrayOfString2,
  791. pArrayOfString3,
  792. pArrayOfString4
  793. };
  794. DWORD bytereads = 0;
  795. for (int i = 0; i < 4; i++)
  796. {
  797. parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue;
  798. if (g_sendhead.code[i])
  799. {
  800. BYTE *lpszOut = NULL;
  801. int nOutSize = 0;
  802. LZARI Lzari;
  803. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  804. CMemFile memfile;
  805. memfile.Attach(lpszOut, nOutSize);
  806. Lzari.Release();
  807. bytereads += g_sendhead.length[i];
  808. CArchive ar(&memfile, CArchive::load);
  809. parray[i]->SetSize(g_sendhead.count[i]);
  810. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  811. {
  812. parray[i]->ElementAt(ii).Serialize(ar);
  813. }
  814. ar.Close();
  815. memfile.Detach();
  816. }
  817. else
  818. {
  819. CMemFile memfile;
  820. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  821. bytereads += g_sendhead.length[i];
  822. CArchive ar(&memfile, CArchive::load);
  823. parray[i]->SetSize(g_sendhead.count[i]);
  824. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  825. {
  826. parray[i]->ElementAt(ii).Serialize(ar);
  827. }
  828. ar.Close();
  829. memfile.Detach();
  830. }
  831. }
  832. }
  833. catch (...)
  834. {
  835. }
  836. }
  837. void DataToArray(
  838. CArray<CStringArray, CStringArray>*pArrayOfString1,
  839. CArray<CStringArray, CStringArray>*pArrayOfString2,
  840. CArray<CStringArray, CStringArray>*pArrayOfString3,
  841. CArray<CStringArray, CStringArray>*pArrayOfString4,
  842. CArray<CStringArray, CStringArray>*pArrayOfString5,
  843. int datapos)
  844. {
  845. try
  846. {
  847. CArray<CStringArray, CStringArray>*parray[5] =
  848. {
  849. pArrayOfString1,
  850. pArrayOfString2,
  851. pArrayOfString3,
  852. pArrayOfString4,
  853. pArrayOfString5
  854. };
  855. DWORD bytereads = 0;
  856. for (int i = 0; i < 5; i++)
  857. {
  858. parray[i]->RemoveAll();
  859. if (g_sendhead.length[i] == 0)
  860. continue;
  861. if (g_sendhead.code[i])
  862. {
  863. BYTE *lpszOut = NULL;
  864. int nOutSize = 0;
  865. LZARI Lzari;
  866. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  867. CMemFile memfile;
  868. memfile.Attach(lpszOut, nOutSize);
  869. Lzari.Release();
  870. bytereads += g_sendhead.length[i];
  871. CArchive ar(&memfile, CArchive::load);
  872. parray[i]->SetSize(g_sendhead.count[i]);
  873. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  874. {
  875. parray[i]->ElementAt(ii).Serialize(ar);
  876. }
  877. ar.Close();
  878. memfile.Detach();
  879. }
  880. else
  881. {
  882. CMemFile memfile;
  883. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  884. bytereads += g_sendhead.length[i];
  885. CArchive ar(&memfile, CArchive::load);
  886. parray[i]->SetSize(g_sendhead.count[i]);
  887. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  888. {
  889. parray[i]->ElementAt(ii).Serialize(ar);
  890. }
  891. ar.Close();
  892. memfile.Detach();
  893. }
  894. }
  895. }
  896. catch (...)
  897. {
  898. }
  899. }
  900. void DataToArray(
  901. CArray<CStringArray, CStringArray>*pArrayOfString1,
  902. CArray<CStringArray, CStringArray>*pArrayOfString2,
  903. CArray<CStringArray, CStringArray>*pArrayOfString3,
  904. CArray<CStringArray, CStringArray>*pArrayOfString4,
  905. CArray<CStringArray, CStringArray>*pArrayOfString5,
  906. CArray<CStringArray, CStringArray>*pArrayOfString6,
  907. int datapos)
  908. {
  909. try
  910. {
  911. CArray<CStringArray, CStringArray>*parray[6] =
  912. {
  913. pArrayOfString1,
  914. pArrayOfString2,
  915. pArrayOfString3,
  916. pArrayOfString4,
  917. pArrayOfString5,
  918. pArrayOfString6
  919. };
  920. DWORD bytereads = 0;
  921. for (int i = 0; i < 6; i++)
  922. {
  923. parray[i]->RemoveAll();
  924. if (g_sendhead.length[i] == 0)continue;
  925. if (g_sendhead.code[i])
  926. {
  927. BYTE *lpszOut = NULL;
  928. int nOutSize = 0;
  929. LZARI Lzari;
  930. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  931. CMemFile memfile;
  932. memfile.Attach(lpszOut, nOutSize);
  933. Lzari.Release();
  934. bytereads += g_sendhead.length[i];
  935. CArchive ar(&memfile, CArchive::load);
  936. parray[i]->SetSize(g_sendhead.count[i]);
  937. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  938. {
  939. parray[i]->ElementAt(ii).Serialize(ar);
  940. }
  941. ar.Close();
  942. memfile.Detach();
  943. }
  944. else
  945. {
  946. CMemFile memfile;
  947. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  948. bytereads += g_sendhead.length[i];
  949. CArchive ar(&memfile, CArchive::load);
  950. parray[i]->SetSize(g_sendhead.count[i]);
  951. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  952. {
  953. parray[i]->ElementAt(ii).Serialize(ar);
  954. }
  955. ar.Close();
  956. memfile.Detach();
  957. }
  958. }
  959. }
  960. catch (...)
  961. {
  962. }
  963. }
  964. void DataToArray(
  965. CArray<CStringArray, CStringArray>*pArrayOfString1,
  966. CArray<CStringArray, CStringArray>*pArrayOfString2,
  967. CArray<CStringArray, CStringArray>*pArrayOfString3,
  968. CArray<CStringArray, CStringArray>*pArrayOfString4,
  969. CArray<CStringArray, CStringArray>*pArrayOfString5,
  970. CArray<CStringArray, CStringArray>*pArrayOfString6,
  971. CArray<CStringArray, CStringArray>*pArrayOfString7,
  972. int datapos)
  973. {
  974. try
  975. {
  976. CArray<CStringArray, CStringArray>*parray[7] =
  977. {
  978. pArrayOfString1,
  979. pArrayOfString2,
  980. pArrayOfString3,
  981. pArrayOfString4,
  982. pArrayOfString5,
  983. pArrayOfString6,
  984. pArrayOfString7
  985. };
  986. DWORD bytereads = 0;
  987. for (int i = 0; i < 7; i++)
  988. {
  989. parray[i]->RemoveAll();
  990. if (g_sendhead.length[i] == 0)continue;
  991. if (g_sendhead.code[i])
  992. {
  993. BYTE *lpszOut = NULL;
  994. int nOutSize = 0;
  995. LZARI Lzari;
  996. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  997. CMemFile memfile;
  998. memfile.Attach(lpszOut, nOutSize);
  999. Lzari.Release();
  1000. bytereads += g_sendhead.length[i];
  1001. CArchive ar(&memfile, CArchive::load);
  1002. parray[i]->SetSize(g_sendhead.count[i]);
  1003. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  1004. {
  1005. parray[i]->ElementAt(ii).Serialize(ar);
  1006. }
  1007. ar.Close();
  1008. memfile.Detach();
  1009. }
  1010. else
  1011. {
  1012. CMemFile memfile;
  1013. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  1014. bytereads += g_sendhead.length[i];
  1015. CArchive ar(&memfile, CArchive::load);
  1016. parray[i]->SetSize(g_sendhead.count[i]);
  1017. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  1018. {
  1019. parray[i]->ElementAt(ii).Serialize(ar);
  1020. }
  1021. ar.Close();
  1022. memfile.Detach();
  1023. }
  1024. }
  1025. }
  1026. catch (...)
  1027. {
  1028. }
  1029. }
  1030. void DataToArray(
  1031. CArray<CStringArray, CStringArray>*pArrayOfString1,
  1032. CArray<CStringArray, CStringArray>*pArrayOfString2,
  1033. CArray<CStringArray, CStringArray>*pArrayOfString3,
  1034. CArray<CStringArray, CStringArray>*pArrayOfString4,
  1035. CArray<CStringArray, CStringArray>*pArrayOfString5,
  1036. CArray<CStringArray, CStringArray>*pArrayOfString6,
  1037. CArray<CStringArray, CStringArray>*pArrayOfString7,
  1038. CArray<CStringArray, CStringArray>*pArrayOfString8,
  1039. int datapos)
  1040. {
  1041. try
  1042. {
  1043. CArray<CStringArray, CStringArray>*parray[8] =
  1044. {
  1045. pArrayOfString1,
  1046. pArrayOfString2,
  1047. pArrayOfString3,
  1048. pArrayOfString4,
  1049. pArrayOfString5,
  1050. pArrayOfString6,
  1051. pArrayOfString7,
  1052. pArrayOfString8
  1053. };
  1054. DWORD bytereads = 0;
  1055. for (int i = 0; i < 8; i++)
  1056. {
  1057. parray[i]->RemoveAll();
  1058. if (g_sendhead.length[i] == 0)continue;
  1059. if (g_sendhead.code[i])
  1060. {
  1061. BYTE *lpszOut = NULL;
  1062. int nOutSize = 0;
  1063. LZARI Lzari;
  1064. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  1065. CMemFile memfile;
  1066. memfile.Attach(lpszOut, nOutSize);
  1067. Lzari.Release();
  1068. bytereads += g_sendhead.length[i];
  1069. CArchive ar(&memfile, CArchive::load);
  1070. parray[i]->SetSize(g_sendhead.count[i]);
  1071. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  1072. {
  1073. parray[i]->ElementAt(ii).Serialize(ar);
  1074. }
  1075. ar.Close();
  1076. memfile.Detach();
  1077. }
  1078. else
  1079. {
  1080. CMemFile memfile;
  1081. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  1082. bytereads += g_sendhead.length[i];
  1083. CArchive ar(&memfile, CArchive::load);
  1084. parray[i]->SetSize(g_sendhead.count[i]);
  1085. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  1086. {
  1087. parray[i]->ElementAt(ii).Serialize(ar);
  1088. }
  1089. ar.Close();
  1090. memfile.Detach();
  1091. }
  1092. }
  1093. }
  1094. catch (...)
  1095. {
  1096. }
  1097. }
  1098. void DataToArray(
  1099. CArray<CStringArray, CStringArray>*pArrayOfString1,
  1100. CArray<CStringArray, CStringArray>*pArrayOfString2,
  1101. CArray<CStringArray, CStringArray>*pArrayOfString3,
  1102. CArray<CStringArray, CStringArray>*pArrayOfString4,
  1103. CArray<CStringArray, CStringArray>*pArrayOfString5,
  1104. CArray<CStringArray, CStringArray>*pArrayOfString6,
  1105. CArray<CStringArray, CStringArray>*pArrayOfString7,
  1106. CArray<CStringArray, CStringArray>*pArrayOfString8,
  1107. CArray<CStringArray, CStringArray>*pArrayOfString9,
  1108. CArray<CStringArray, CStringArray>*pArrayOfString10,
  1109. int datapos)
  1110. {
  1111. try
  1112. {
  1113. CArray<CStringArray, CStringArray>*parray[10] =
  1114. {
  1115. pArrayOfString1,
  1116. pArrayOfString2,
  1117. pArrayOfString3,
  1118. pArrayOfString4,
  1119. pArrayOfString5,
  1120. pArrayOfString6,
  1121. pArrayOfString7,
  1122. pArrayOfString8,
  1123. pArrayOfString9,
  1124. pArrayOfString10
  1125. };
  1126. DWORD bytereads = 0;
  1127. for (int i = 0; i < 10; i++)
  1128. {
  1129. parray[i]->RemoveAll();
  1130. if (g_sendhead.length[i] == 0)continue;
  1131. if (g_sendhead.code[i])
  1132. {
  1133. BYTE *lpszOut = NULL;
  1134. int nOutSize = 0;
  1135. LZARI Lzari;
  1136. Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
  1137. CMemFile memfile;
  1138. memfile.Attach(lpszOut, nOutSize);
  1139. Lzari.Release();
  1140. bytereads += g_sendhead.length[i];
  1141. CArchive ar(&memfile, CArchive::load);
  1142. parray[i]->SetSize(g_sendhead.count[i]);
  1143. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  1144. {
  1145. parray[i]->ElementAt(ii).Serialize(ar);
  1146. }
  1147. ar.Close();
  1148. memfile.Detach();
  1149. }
  1150. else
  1151. {
  1152. CMemFile memfile;
  1153. memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
  1154. bytereads += g_sendhead.length[i];
  1155. CArchive ar(&memfile, CArchive::load);
  1156. parray[i]->SetSize(g_sendhead.count[i]);
  1157. for (int ii = 0; ii < parray[i]->GetSize(); ii++)
  1158. {
  1159. parray[i]->ElementAt(ii).Serialize(ar);
  1160. }
  1161. ar.Close();
  1162. memfile.Detach();
  1163. }
  1164. }
  1165. }
  1166. catch (...)
  1167. {
  1168. }
  1169. }
  1170. // 从缓存中加载图片;
  1171. void LoadImageFromBuf(Bitmap **img, BYTE *pData, DWORD leng)
  1172. {
  1173. try
  1174. {
  1175. if (pData == NULL)return;
  1176. if (*img)delete *img;
  1177. *img = NULL;
  1178. // Allocate global memory on which to create stream
  1179. HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, leng);
  1180. if (m_hMem == NULL)return;
  1181. BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
  1182. memcpy(pmem, pData, leng);
  1183. IStream* pstm;
  1184. CreateStreamOnHGlobal(m_hMem, TRUE, &pstm);
  1185. // load from stream
  1186. *img = Gdiplus::Bitmap::FromStream(pstm);
  1187. // free/release stuff
  1188. GlobalUnlock(m_hMem);
  1189. pstm->Release();
  1190. }
  1191. catch (...)
  1192. {
  1193. }
  1194. }
  1195. void LoadImageFromFile(Image **img, CString path)
  1196. {
  1197. try
  1198. {
  1199. if (!PathFileExists(path))return;
  1200. if (*img)delete *img;
  1201. *img = NULL;
  1202. BSTR bstr = path.AllocSysString();
  1203. *img = Image::FromFile(bstr);
  1204. SysFreeString(bstr);
  1205. }
  1206. catch (...)
  1207. {
  1208. }
  1209. }
  1210. void LoadImageFromFile(Bitmap **img, CString path)
  1211. {
  1212. try
  1213. {
  1214. if (!PathFileExists(path))return;
  1215. if (*img)delete *img;
  1216. *img = NULL;
  1217. BSTR bstr = path.AllocSysString();
  1218. *img = Bitmap::FromFile(bstr);
  1219. SysFreeString(bstr);
  1220. }
  1221. catch (...)
  1222. {
  1223. }
  1224. }
  1225. void LoadImageFromBuf(Image **img, BYTE *pData, DWORD leng)
  1226. {
  1227. try
  1228. {
  1229. if (pData == NULL)return;
  1230. if (*img)delete *img;
  1231. *img = NULL;
  1232. // Allocate global memory on which to create stream
  1233. HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, leng);
  1234. if (m_hMem == NULL)return;
  1235. BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
  1236. memcpy(pmem, pData, leng);
  1237. IStream* pstm;
  1238. CreateStreamOnHGlobal(m_hMem, TRUE, &pstm);
  1239. // load from stream
  1240. *img = Gdiplus::Image::FromStream(pstm);
  1241. // free/release stuff
  1242. GlobalUnlock(m_hMem);
  1243. pstm->Release();
  1244. }
  1245. catch (...)
  1246. {
  1247. }
  1248. }
  1249. void LoadImageFromBuf(Image **img, CString path)
  1250. {
  1251. try
  1252. {
  1253. CFile fp;
  1254. if (fp.Open(path, CFile::modeRead))
  1255. {
  1256. DWORD leng = fp.GetLength();
  1257. BYTE *pData = new BYTE[leng];
  1258. fp.Read(pData, leng);
  1259. fp.Close();
  1260. LoadImageFromBuf(img, pData, leng);
  1261. delete[]pData;
  1262. }
  1263. }
  1264. catch (...)
  1265. {
  1266. }
  1267. }
  1268. void LoadImageFromBuf(Bitmap **img, CString path)
  1269. {
  1270. try
  1271. {
  1272. CFile fp;
  1273. if (fp.Open(path, CFile::modeRead))
  1274. {
  1275. DWORD leng = fp.GetLength();
  1276. BYTE *pData = new BYTE[leng];
  1277. fp.Read(pData, leng);
  1278. fp.Close();
  1279. LoadImageFromBuf(img, pData, leng);
  1280. delete[]pData;
  1281. }
  1282. }
  1283. catch (...)
  1284. {
  1285. }
  1286. }
  1287. void LoadImageFromRes(Image **img, LPCTSTR lpszResourceName, LPCTSTR ResourceType)
  1288. {
  1289. try
  1290. {
  1291. HGLOBAL hGlobal = NULL;
  1292. HRSRC hSource = NULL;
  1293. LPVOID lpVoid = NULL;
  1294. int nSize = 0;
  1295. BOOL bResult = FALSE;
  1296. hSource = FindResource(NULL, lpszResourceName, ResourceType);
  1297. if (hSource == NULL)return;
  1298. hGlobal = LoadResource(NULL, hSource);
  1299. if (hGlobal == NULL)return;
  1300. lpVoid = LockResource(hGlobal);
  1301. if (lpVoid == NULL)return;
  1302. nSize = (UINT)SizeofResource(NULL, hSource);
  1303. LoadImageFromBuf(img, (BYTE*)hGlobal, nSize);
  1304. UnlockResource(hGlobal); // 16Bit Windows Needs This
  1305. FreeResource(hGlobal); // 16Bit Windows Needs This (32Bit - Automatic Release)
  1306. }
  1307. catch (...)
  1308. {
  1309. }
  1310. }
  1311. int GetOrientation(Image *image)
  1312. {
  1313. try
  1314. {
  1315. if (image)
  1316. {
  1317. UINT totalBufferSize;
  1318. UINT numProperties;
  1319. image->GetPropertySize(&totalBufferSize, &numProperties);
  1320. // Allocate the buffer that will receive the property items.
  1321. PropertyItem* pAllItems = (PropertyItem*)malloc(totalBufferSize);
  1322. // Fill the buffer.
  1323. image->GetAllPropertyItems(totalBufferSize, numProperties, pAllItems);
  1324. // Print the id data member of each property item.
  1325. for (UINT j = 0; j < numProperties; ++j)
  1326. {
  1327. if (PropertyTagOrientation == pAllItems[j].id)
  1328. {
  1329. short* ptrLong = (short*)(pAllItems[j].value);
  1330. int ret = (int)*ptrLong;
  1331. free(pAllItems);
  1332. return ret;
  1333. }
  1334. }
  1335. free(pAllItems);
  1336. }
  1337. }
  1338. catch (...)
  1339. {
  1340. }
  1341. return 1;
  1342. }
  1343. int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
  1344. {
  1345. UINT num = 0; // number of image encoders
  1346. UINT size = 0; // size of the image encoder array in bytes
  1347. ImageCodecInfo* pImageCodecInfo = NULL;
  1348. GetImageEncodersSize(&num, &size);
  1349. if (size == 0)
  1350. return -1; // Failure
  1351. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  1352. if (pImageCodecInfo == NULL)
  1353. return -1; // Failure
  1354. GetImageEncoders(num, size, pImageCodecInfo);
  1355. for (UINT j = 0; j < num; ++j)
  1356. {
  1357. if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
  1358. {
  1359. *pClsid = pImageCodecInfo[j].Clsid;
  1360. free(pImageCodecInfo);
  1361. return j; // Success
  1362. }
  1363. }
  1364. free(pImageCodecInfo);
  1365. return -1; // FailureFailure
  1366. }
  1367. void SaveImageToFile(Image *img, CString path)
  1368. {
  1369. try
  1370. {
  1371. if (img == NULL)return;
  1372. CLSID encoderClsid;
  1373. BSTR bstr = path.AllocSysString();
  1374. path.MakeLower();
  1375. if (path.Right(3) == "bmp")
  1376. {
  1377. GetEncoderClsid(L"image/bmp", &encoderClsid);
  1378. img->Save(bstr, &encoderClsid, NULL);
  1379. }
  1380. else if (path.Right(3) == "png")
  1381. {
  1382. GetEncoderClsid(L"image/png", &encoderClsid);
  1383. img->Save(bstr, &encoderClsid, NULL);
  1384. }
  1385. else// if(path.Right (3)=="jpg")
  1386. {
  1387. GetEncoderClsid(L"image/jpeg", &encoderClsid);
  1388. EncoderParameters encoderParameters;
  1389. ULONG quality;
  1390. encoderParameters.Count = 1;
  1391. encoderParameters.Parameter[0].Guid = EncoderQuality;
  1392. encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
  1393. encoderParameters.Parameter[0].NumberOfValues = 1;
  1394. // Save the image as a JPEG with quality level 100.
  1395. quality = 100;
  1396. encoderParameters.Parameter[0].Value = &quality;
  1397. img->Save(bstr, &encoderClsid, &encoderParameters);
  1398. }
  1399. SysFreeString(bstr);
  1400. }
  1401. catch (...)
  1402. {
  1403. }
  1404. }
  1405. void SaveImageToFile2(Image *img, CString path, ULONG quality)
  1406. {
  1407. try
  1408. {
  1409. if (img == NULL)return;
  1410. CLSID encoderClsid;
  1411. BSTR bstr = path.AllocSysString();
  1412. path.MakeLower();
  1413. if (path.Right(3) == "bmp")
  1414. {
  1415. GetEncoderClsid(L"image/bmp", &encoderClsid);
  1416. img->Save(bstr, &encoderClsid, NULL);
  1417. }
  1418. else if (path.Right(3) == "png")
  1419. {
  1420. GetEncoderClsid(L"image/png", &encoderClsid);
  1421. img->Save(bstr, &encoderClsid, NULL);
  1422. }
  1423. else// if(path.Right (3)=="jpg")
  1424. {
  1425. GetEncoderClsid(L"image/jpeg", &encoderClsid);
  1426. EncoderParameters encoderParameters;
  1427. encoderParameters.Count = 1;
  1428. encoderParameters.Parameter[0].Guid = EncoderQuality;
  1429. encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
  1430. encoderParameters.Parameter[0].NumberOfValues = 1;
  1431. // Save the image as a JPEG with quality level 100.
  1432. encoderParameters.Parameter[0].Value = &quality;
  1433. img->Save(bstr, &encoderClsid, &encoderParameters);
  1434. }
  1435. SysFreeString(bstr);
  1436. }
  1437. catch (...)
  1438. {
  1439. }
  1440. }
  1441. void IsWaiter2(CString id, CString name, CArray<CStringArray, CStringArray>*waiterarray, BOOL &bWait1, BOOL &bWait2, float &fscale1, float &fscale2, BOOL bCheckDate, CString date1, CString date2)
  1442. {
  1443. for (int i = 0; i < waiterarray->GetSize(); i++)
  1444. {
  1445. if (id == waiterarray->ElementAt(i).ElementAt(0))
  1446. {
  1447. if (bCheckDate)
  1448. {
  1449. if (waiterarray->ElementAt(i).ElementAt(21) < date1 || waiterarray->ElementAt(i).ElementAt(21) > date2 || waiterarray->ElementAt(i).ElementAt(22) != "OK")
  1450. {
  1451. bWait1 = bWait2 = 0;
  1452. return;
  1453. }
  1454. }
  1455. if (name == waiterarray->ElementAt(i).ElementAt(1))
  1456. {
  1457. bWait1 = 1;
  1458. fscale1 = atof(waiterarray->ElementAt(i).ElementAt(5)) / 100.0;
  1459. if (fscale1 == 0)fscale1 = 1;
  1460. }
  1461. else if (name == waiterarray->ElementAt(i).ElementAt(2))
  1462. {
  1463. bWait1 = 1;
  1464. fscale1 = atof(waiterarray->ElementAt(i).ElementAt(6)) / 100.0;
  1465. }
  1466. else if (name == waiterarray->ElementAt(i).ElementAt(3))
  1467. {
  1468. bWait1 = 1;
  1469. fscale1 = atof(waiterarray->ElementAt(i).ElementAt(7)) / 100.0;
  1470. }
  1471. else if (name == waiterarray->ElementAt(i).ElementAt(4))
  1472. {
  1473. bWait1 = 1;
  1474. fscale1 = atof(waiterarray->ElementAt(i).ElementAt(8)) / 100.0;
  1475. }
  1476. ///////////////////////////////////////////////////////////////////////
  1477. if (name == waiterarray->ElementAt(i).ElementAt(9))
  1478. {
  1479. bWait2 = 1;
  1480. fscale2 = atof(waiterarray->ElementAt(i).ElementAt(13)) / 100.0;
  1481. if (fscale2 == 0)fscale2 = 1;
  1482. }
  1483. else if (name == waiterarray->ElementAt(i).ElementAt(10))
  1484. {
  1485. bWait2 = 1;
  1486. fscale2 = atof(waiterarray->ElementAt(i).ElementAt(14)) / 100.0;
  1487. }
  1488. else if (name == waiterarray->ElementAt(i).ElementAt(11))
  1489. {
  1490. bWait2 = 1;
  1491. fscale2 = atof(waiterarray->ElementAt(i).ElementAt(15)) / 100.0;
  1492. }
  1493. else if (name == waiterarray->ElementAt(i).ElementAt(12))
  1494. {
  1495. bWait2 = 1;
  1496. fscale2 = atof(waiterarray->ElementAt(i).ElementAt(16)) / 100.0;
  1497. }
  1498. return;
  1499. }
  1500. }
  1501. return;
  1502. }
  1503. void IsWaiter3(CString id, CString name, CArray<CStringArray, CStringArray>*waiterarray, BOOL &bWait1, BOOL &bWait2, float &fscale1, float &fscale2)
  1504. {
  1505. bWait1 = bWait2 = 0;
  1506. for (int i = 0; i < waiterarray->GetSize(); i++)
  1507. {
  1508. if (id == waiterarray->ElementAt(i).ElementAt(0))
  1509. {
  1510. if (name == waiterarray->ElementAt(i).ElementAt(17))
  1511. {
  1512. bWait1 = 1;
  1513. fscale1 = atof(waiterarray->ElementAt(i).ElementAt(19)) / 100.0;
  1514. if (fscale1 == 0)fscale1 = 1;
  1515. }
  1516. ///////////////////////////////////////////////////////////////////////
  1517. if (name == waiterarray->ElementAt(i).ElementAt(18))
  1518. {
  1519. bWait2 = 1;
  1520. fscale2 = atof(waiterarray->ElementAt(i).ElementAt(20)) / 100.0;
  1521. }
  1522. return;
  1523. }
  1524. }
  1525. return;
  1526. }
  1527. //------------------------------------------------------------------------------
  1528. // Remark by Jeff;
  1529. // 函数:CheckPhoneType
  1530. // 描述:判断手机号属于哪个运营商的;
  1531. // 参数:
  1532. // phoneno: 欲判断的手机号;
  1533. //
  1534. // 返回:返回0表示移动; 1表示联通; 2表示电信; 3表示小灵通; -1表示未知的;
  1535. //
  1536. // 注意:
  1537. // 移动:
  1538. // 139, 138, 137, 136, 135, 134, 159, 158, 152, 151, 150, 157, 188, 187, 144
  1539. // 联通:
  1540. // 130, 131, 132, 155, 156, 186, 185
  1541. // 电信 :
  1542. // 133, 153, 189, 180, 181
  1543. //------------------------------------------------------------------------------
  1544. int CheckPhoneType(CString &phoneno)
  1545. {
  1546. if (phoneno.IsEmpty())
  1547. return -1;
  1548. for (int i = 0; i < phoneno.GetLength(); i++)
  1549. {
  1550. if (phoneno.GetAt(i) < '0' || phoneno.GetAt(i) > '9')return -1;
  1551. }
  1552. if (phoneno.GetAt(0) == '1')
  1553. {
  1554. if (phoneno.GetLength() != 11)
  1555. return -1;
  1556. int mobile[] = { 139, 138, 137, 136, 135, 134, 159, 158, 152, 151, 150, 157, 188, 187, 144, 182, 147, 183, 184, 178 };
  1557. int unicom[] = { 130, 131, 132, 155, 156, 186, 185, 176 };
  1558. int telecom[] = { 133, 153, 189, 180, 181, 177 };
  1559. for (i = 0; i < sizeof(mobile) / sizeof(int); i++)
  1560. {
  1561. if (mobile[i] == atoi(phoneno.Left(3)))
  1562. {
  1563. return 0;
  1564. }
  1565. }
  1566. for (i = 0; i < sizeof(unicom) / sizeof(int); i++)
  1567. {
  1568. if (unicom[i] == atoi(phoneno.Left(3)))
  1569. {
  1570. return 1;
  1571. }
  1572. }
  1573. for (i = 0; i < sizeof(telecom) / sizeof(int); i++)
  1574. {
  1575. if (telecom[i] == atoi(phoneno.Left(3)))
  1576. {
  1577. return 2;
  1578. }
  1579. }
  1580. return -1;
  1581. }
  1582. return -1;
  1583. }
  1584. BOOL CheckDateOK(CString &str)
  1585. {
  1586. if (str.IsEmpty())return 1;
  1587. CString tip;
  1588. int i;
  1589. CString demo = CTime::GetCurrentTime().Format("%Y-%m-%d");
  1590. if (str.GetLength() != demo.GetLength())
  1591. goto ll;
  1592. //2009-01-01
  1593. if (str.GetAt(4) != '-')
  1594. goto ll;
  1595. if (str.GetAt(7) != '-')
  1596. goto ll;
  1597. for (i = 0; i < str.GetLength(); i++)
  1598. {
  1599. if (i == 4 || i == 7)continue;
  1600. if (str.GetAt(i) < '0' || str.GetAt(i) > '9')
  1601. goto ll;
  1602. }
  1603. return 1;
  1604. ll:
  1605. tip.Format("日期:%s格式错误!\r\n样板:%s", str, demo);
  1606. AfxMessageBox(tip, MB_ICONSTOP);
  1607. return 0;
  1608. }
  1609. BOOL CheckBadWords(CString str, BOOL bMsg)
  1610. {
  1611. CString badwords[165] = { \
  1612. "【call5.me】", \
  1613. "您可拨020", \
  1614. "88btt.com热线400611", \
  1615. "400678165", \
  1616. "海王星", \
  1617. "博天堂", \
  1618. "十八大", \
  1619. "钓鱼岛", \
  1620. "无限次数提款", \
  1621. "广东地和", \
  1622. "利来", \
  1623. "抢劫", \
  1624. "fa lun", \
  1625. "强奸", \
  1626. "dafa", \
  1627. "falun", \
  1628. "SIM卡抽奖", \
  1629. "罢工", \
  1630. "罢课", \
  1631. "暴乱", \
  1632. "婊子", \
  1633. "操你", \
  1634. "操你娘", \
  1635. "蠢猪", \
  1636. "达赖", \
  1637. "打倒", \
  1638. "大法", \
  1639. "大纪元", \
  1640. "弹药", \
  1641. "钓鱼岛", \
  1642. "东突", \
  1643. "东突厥斯坦伊斯兰运动", \
  1644. "发抡", \
  1645. "发仑", \
  1646. "发伦", \
  1647. "发囵", \
  1648. "发沦", \
  1649. "发纶", \
  1650. "发轮", \
  1651. "发论", \
  1652. "法 轮 功", \
  1653. "法.轮.功", \
  1654. "法抡", \
  1655. "法仑", \
  1656. "法伦", \
  1657. "法囵", \
  1658. "法沦", \
  1659. "法纶", \
  1660. "法轮", \
  1661. "法论", \
  1662. "反革命", \
  1663. "反日", \
  1664. "分裂", \
  1665. "干你娘", \
  1666. "功友", \
  1667. "古怪歌", \
  1668. "国研新闻邮件", \
  1669. "黑庄", \
  1670. "宏志", \
  1671. "洪志", \
  1672. "胡锦涛", \
  1673. "鸡巴", \
  1674. "鸡毛信文汇", \
  1675. "妓女", \
  1676. "简鸿章", \
  1677. "江八点", \
  1678. "江独裁", \
  1679. "江泽民", \
  1680. "疆独", \
  1681. "教徒", \
  1682. "锦涛", \
  1683. "靖国神社", \
  1684. "九、评", \
  1685. "九.评", \
  1686. "九码", \
  1687. "九-评", \
  1688. "拉丹", \
  1689. "拉登", \
  1690. "李鹏", \
  1691. "联总之声传单", \
  1692. "灵动卡", \
  1693. "六合彩", \
  1694. "六码", \
  1695. "吕秀莲", \
  1696. "绿色环保手机", \
  1697. "美国之音", \
  1698. "猛料", \
  1699. "迷药", \
  1700. "民运", \
  1701. "民猪", \
  1702. "嫖娼", \
  1703. "迫害", \
  1704. "枪支", \
  1705. "强奸", \
  1706. "窃听器", \
  1707. "人民报", \
  1708. "人民报讯", \
  1709. "人民大众时事参考", \
  1710. "人民内情真相", \
  1711. "人民真实报道", \
  1712. "人权", \
  1713. "日你妈", \
  1714. "日他", \
  1715. "三码", \
  1716. "三陪", \
  1717. "色情", \
  1718. "傻B", \
  1719. "涉日", \
  1720. "十六大", \
  1721. "示威", \
  1722. "他妈的", \
  1723. "台*湾", \
  1724. "特等奖", \
  1725. "天葬", \
  1726. "突厥斯坦", \
  1727. "推翻", \
  1728. "王八蛋", \
  1729. "温家宝", \
  1730. "无能", \
  1731. "香港总部", \
  1732. "小鸡鸡", \
  1733. "新华举报", \
  1734. "新华内情", \
  1735. "新闻封锁", \
  1736. "畜生", \
  1737. "玄`机", \
  1738. "压迫", \
  1739. "淫秽", \
  1740. "银行联合管理局", \
  1741. "印尼伊斯兰祈祷团", \
  1742. "游行", \
  1743. "舆论", \
  1744. "造反", \
  1745. "真善忍", \
  1746. "镇压", \
  1747. "正法", \
  1748. "政变", \
  1749. "政治风波", \
  1750. "中俄边界新约", \
  1751. "中国银联", \
  1752. "中华民国", \
  1753. "中奖", \
  1754. "朱容基", \
  1755. "自焚", \
  1756. "自由运动", \
  1757. "达赖", \
  1758. "套牌", \
  1759. "情妇", \
  1760. "监听", \
  1761. "巴南电信", \
  1762. "合川分公司", \
  1763. "合川电信", \
  1764. "死光", \
  1765. "116114", \
  1766. "北京宝诚", \
  1767. "华盛投资", \
  1768. "名门国际", \
  1769. "利博", \
  1770. "赤橙黄绿", \
  1771. "免佣BJL首发", \
  1772. "洗*码优惠", \
  1773. "【俱乐部】", \
  1774. "18266381922", \
  1775. "回拨卡", \
  1776. "号码百事通推出短信订机票!实时" };
  1777. for (int i = 0; i < 165; i++)
  1778. {
  1779. g_temp = badwords[i];
  1780. if (str.Find(g_temp) != -1)
  1781. {
  1782. // AfxMessageBox("信息服务商禁止的非法字符:("+g_temp+")希望您谅解!");
  1783. return 0;
  1784. }
  1785. }
  1786. return 1;
  1787. }
  1788. ///目录是否存在的检查: 支持网络文件夹
  1789. bool CheckFolderFileExist(CString &strPath)
  1790. {
  1791. CString path = strPath;
  1792. CFile fp;
  1793. if (fp.Open(path, CFile::modeRead))
  1794. {
  1795. fp.Close();
  1796. return 1;
  1797. }
  1798. if (strPath.Right(1) != "\\")
  1799. path += "\\";
  1800. path += "zaqw1234.dat";
  1801. ::DeleteFile(path);
  1802. if (fp.Open(path, CFile::modeCreate) == 0)
  1803. return 0;
  1804. fp.Close();
  1805. ::DeleteFile(path);
  1806. return 1;
  1807. }
  1808. int FindArray(CStringArray *pArray, const CString &Str)
  1809. {
  1810. for (int i = 0; i < pArray->GetSize(); i++)
  1811. {
  1812. if (pArray->ElementAt(i) == Str)
  1813. return i;
  1814. }
  1815. return -1;
  1816. }
  1817. void FillLength(CString &str, int length)
  1818. {
  1819. while (str.GetLength() < length)
  1820. str += " ";
  1821. }
  1822. int GetYearPos(int year)
  1823. {
  1824. for (int i = 0; i < g_hisyeararray.GetSize(); i++)
  1825. {
  1826. if (year == atoi(g_hisyeararray.ElementAt(i).ElementAt(0)))
  1827. return i;
  1828. }
  1829. return -1;
  1830. }
  1831. BOOL GIsHalfHZ(const CString &str)
  1832. {
  1833. int len = str.GetLength();
  1834. BOOL IsHalf = FALSE;
  1835. for (int i = 0; i < len; i++)
  1836. {
  1837. if (str.GetAt(i) < 0) IsHalf = !IsHalf;
  1838. }
  1839. return IsHalf;
  1840. }
  1841. void WriteTitle(CString str)
  1842. {
  1843. g_title = str;
  1844. CStdioFile fp;
  1845. fp.Open(g_mainpath + "\\title.txt", CFile::modeWrite | CFile::modeCreate);
  1846. fp.WriteString(str);
  1847. fp.Close();
  1848. }
  1849. CString GetIP(CString branch)
  1850. {
  1851. for (int i = 0; i < g_brancharray.GetSize(); i++)
  1852. {
  1853. if (g_domain == g_brancharray.ElementAt(i).ElementAt(2))
  1854. {
  1855. //if(g_serverbak.Find (".ly.com")!=-1)
  1856. return g_server;
  1857. CString ip = g_serverbak;
  1858. MyGetIPByName(ip);
  1859. return ip;
  1860. }
  1861. if (branch == g_brancharray.ElementAt(i).ElementAt(0))
  1862. {
  1863. return g_brancharray.ElementAt(i).ElementAt(1);
  1864. }
  1865. }
  1866. return "";
  1867. }
  1868. BOOL IsHanZi(CString str)
  1869. {
  1870. TBYTE ucHigh, ucLow;
  1871. for (int i = 0; i < str.GetLength(); i++)
  1872. {
  1873. if ((TBYTE)str[i] < 0x80)
  1874. {
  1875. continue;
  1876. }
  1877. ucHigh = (TBYTE)str[i];
  1878. ucLow = (TBYTE)str[i + 1];
  1879. if (ucHigh < 0xa1 || ucLow < 0xa1)
  1880. {
  1881. continue;
  1882. }
  1883. return 1;
  1884. }
  1885. return 0;
  1886. }
  1887. int GetType(CString str)
  1888. {
  1889. if (IsHanZi(str))return 0;
  1890. BOOL bDigit = 1;
  1891. BOOL bAlpha = 1;
  1892. for (int i = 0; i < str.GetLength(); i++)
  1893. {
  1894. if (!::isdigit(str.GetAt(i)))
  1895. //if(! ((str.GetAt (i)<='0' && str.GetAt (i)>='9' ) ))
  1896. bDigit = 0;
  1897. if (!((str.GetAt(i) <= 'z' && str.GetAt(i) >= 'a') || (str.GetAt(i) <= 'Z' && str.GetAt(i) >= 'A')))
  1898. //else if(!::isalpha ( ((unsigned char)str.GetAt (i))))
  1899. bAlpha = 0;
  1900. if (bDigit == 0 && bAlpha == 0)return 0;
  1901. }
  1902. if (bDigit)
  1903. {
  1904. /*#ifdef SUNRAIN_VERSION
  1905. return 0;
  1906. #else*/
  1907. return 0;
  1908. //#endif
  1909. }
  1910. else if (bAlpha)
  1911. {
  1912. return 2;
  1913. }
  1914. else
  1915. return 0;
  1916. }
  1917. CString FilterBZ(CString &bz)
  1918. {
  1919. bz.Replace("'", "");
  1920. /* int i=bz.GetLength ()-1;
  1921. char c;
  1922. for(;i>=0;i--)
  1923. {
  1924. c=bz.GetAt (i);
  1925. if(c<32)// && c!=10 && c!=13)
  1926. bz.Delete (i);
  1927. }*/
  1928. if (bz.GetLength() > 1023)
  1929. {
  1930. AfxMessageBox("文字太长, 字符串将被截取!", MB_ICONSTOP);
  1931. bz = bz.Left(1023);
  1932. }
  1933. return bz;
  1934. }
  1935. // GetWidth()的长度与CRect的长度是不一样的单位值,需要转换适合的比例;(一个是图片的像素尺寸,一个DC的大小尺寸)
  1936. // 将图片尺寸与设备尺寸进行转换适合的比例;
  1937. void RectFitDes(int width, int height, CRect &rc)
  1938. {
  1939. try
  1940. {
  1941. if (width == 0 || height == 0)return;
  1942. // 图片长宽比例;
  1943. float fscale = (float)width / (float)height;
  1944. // 设备长宽比例;
  1945. float rcscale = ((float)rc.Width()) / ((float)rc.Height());
  1946. int rcwid = rc.Width();
  1947. int rchei = rc.Height();
  1948. int dt = 0;
  1949. // Jeff.如果设备长宽比例 < 图片长宽比例;(即相同长度下,高越大比例值越小,所以此时图片尺寸 与 显示设备的尺寸相比,要显得更长)
  1950. if (rcscale < fscale)
  1951. {
  1952. // Jeff.remarks
  1953. // 调整显示设备的大小,以使之能容纳图片尺寸;(即长宽比例上,要大于或等于图片的长宽比例)
  1954. // 所以有两种方法使得 rcscale >= fscale 表达式成立:
  1955. // -----------------------------------------------
  1956. // 方法1:显示设备宽加x值,计算出下面表达式x的值即可
  1957. // (rc.Width()+x) / rc.Height() >= width/height;
  1958. // 方法2:显示设备高减x值,计算出下面表达式x的值即可
  1959. // (rc.Width()) / (rc.Height()-x) >= width/height;
  1960. //------------------------------------------------
  1961. // 两种方法的最后表达式为:
  1962. // x >= rc.Height() - rcWidth()*(height/width);
  1963. // 即 x >= rc.Height() - rcWidth()/fscale;
  1964. //------------------------------------------------
  1965. dt = (rchei - rcwid / fscale) / 2;
  1966. rc.top += dt;
  1967. rc.bottom -= dt;
  1968. }
  1969. else
  1970. {
  1971. dt = (rcwid - rchei*fscale) / 2;
  1972. rc.left += dt;
  1973. rc.right -= dt;
  1974. }
  1975. }
  1976. catch (...)
  1977. {
  1978. }
  1979. }
  1980. BOOL IsHasRights(int pos)
  1981. {
  1982. return 1;
  1983. if (g_user.rights.GetLength() > pos)
  1984. {
  1985. BOOL ret = atoi(g_user.rights.Mid(pos, 1));
  1986. if (ret == 0)AfxMessageBox("没有相关权限!", MB_ICONINFORMATION);
  1987. return ret;
  1988. }
  1989. AfxMessageBox("没有相关权限!", MB_ICONINFORMATION);
  1990. return 0;
  1991. }
  1992. BOOL IsHasRights2(int pos)
  1993. {
  1994. return 1;
  1995. if (g_user.rights.GetLength() > pos)
  1996. {
  1997. BOOL ret = atoi(g_user.rights.Mid(pos, 1));
  1998. return ret;
  1999. }
  2000. return 0;
  2001. }
  2002. BOOL IsHasRightsnew(int pos)
  2003. {
  2004. if (g_user.rights.GetLength() > pos)
  2005. {
  2006. BOOL ret = atoi(g_user.rights.Mid(pos, 1));
  2007. if (ret == 0)AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION);
  2008. return ret;
  2009. }
  2010. AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION);
  2011. return 0;
  2012. }
  2013. BOOL IsHasRights2new(int pos)
  2014. {
  2015. if (g_user.rights.GetLength() > pos)
  2016. {
  2017. BOOL ret = atoi(g_user.rights.Mid(pos, 1));
  2018. return ret;
  2019. }
  2020. return 0;
  2021. }
  2022. /********************************************************************************************
  2023. /* Syntax
  2024. /* void FirstLetter(int nCode, CString& strLetter)
  2025. /* Remarks:
  2026. /* Get the first letter of pinyin according to specified Chinese character code.
  2027. /* Parameters:
  2028. /* nCode - the code of the chinese character.
  2029. /* strLetter - a CString object that is to receive the string of the first letter.
  2030. /* Return Values:
  2031. /* None.
  2032. /* Author:
  2033. /* lixiaosan
  2034. /* Create Date:
  2035. /* 05-26-2006
  2036. /********************************************************************************************/
  2037. void FirstLetter(int nCode, CString& strLetter)
  2038. {
  2039. if (nCode >= 1601 && nCode < 1637) strLetter = _T("A");
  2040. if (nCode >= 1637 && nCode < 1833) strLetter = _T("B");
  2041. if (nCode >= 1833 && nCode < 2078) strLetter = _T("C");
  2042. if (nCode >= 2078 && nCode < 2274) strLetter = _T("D");
  2043. if (nCode >= 2274 && nCode < 2302) strLetter = _T("E");
  2044. if (nCode >= 2302 && nCode < 2433) strLetter = _T("F");
  2045. if (nCode >= 2433 && nCode < 2594) strLetter = _T("G");
  2046. if (nCode >= 2594 && nCode < 2787) strLetter = _T("H");
  2047. if (nCode >= 2787 && nCode < 3106) strLetter = _T("J");
  2048. if (nCode >= 3106 && nCode < 3212) strLetter = _T("K");
  2049. if (nCode >= 3212 && nCode < 3472) strLetter = _T("L");
  2050. if (nCode >= 3472 && nCode < 3635) strLetter = _T("M");
  2051. if (nCode >= 3635 && nCode < 3722) strLetter = _T("N");
  2052. if (nCode >= 3722 && nCode < 3730) strLetter = _T("O");
  2053. if (nCode >= 3730 && nCode < 3858) strLetter = _T("P");
  2054. if (nCode >= 3858 && nCode < 4027) strLetter = _T("Q");
  2055. if (nCode >= 4027 && nCode < 4086) strLetter = _T("R");
  2056. if (nCode >= 4086 && nCode < 4390) strLetter = _T("S");
  2057. if (nCode >= 4390 && nCode < 4558) strLetter = _T("T");
  2058. if (nCode >= 4558 && nCode < 4684) strLetter = _T("W");
  2059. if (nCode >= 4684 && nCode < 4925) strLetter = _T("X");
  2060. if (nCode >= 4925 && nCode < 5249) strLetter = _T("Y");
  2061. if (nCode >= 5249 && nCode < 5590) strLetter = _T("Z");
  2062. }
  2063. /********************************************************************************************
  2064. /* Syntax
  2065. /* GetFirstLetter(CString strName, CString& strFirstLetter)
  2066. /* Remarks:
  2067. /* Get the first letter of pinyin according to specified Chinese character.
  2068. /* Parameters:
  2069. /* strName - a CString object that is to be parsed.
  2070. /* strFirstLetter - a CString object that is to receive the string of the first letter.
  2071. /* Return Values:
  2072. /* None.
  2073. /* Author:
  2074. /* lixiaosan
  2075. /* Create Date:
  2076. /* 05-26-2006
  2077. /********************************************************************************************/
  2078. void GetFirstLetter(CString strName, CString& strFirstLetter)
  2079. {
  2080. TBYTE ucHigh, ucLow;
  2081. int nCode;
  2082. CString strRet;
  2083. strFirstLetter.Empty();
  2084. for (int i = 0; i < strName.GetLength(); i++)
  2085. {
  2086. if ((TBYTE)strName[i] < 0x80)
  2087. {
  2088. strRet = strName.Mid(i, 1);
  2089. strRet.MakeUpper();
  2090. strFirstLetter += strRet;
  2091. continue;
  2092. }
  2093. ucHigh = (TBYTE)strName[i];
  2094. ucLow = (TBYTE)strName[i + 1];
  2095. if (ucHigh < 0xa1 || ucLow < 0xa1)
  2096. continue;
  2097. else
  2098. // Treat code by section-position as an int type parameter,
  2099. // so make following change to nCode.
  2100. nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;
  2101. FirstLetter(nCode, strRet);
  2102. strFirstLetter += strRet;
  2103. i++;
  2104. }
  2105. }
  2106. CString newGUID()
  2107. {
  2108. CString str;
  2109. GUID guid;
  2110. CoInitialize(NULL);
  2111. if (S_OK == ::CoCreateGuid(&guid))
  2112. {
  2113. str.Format(
  2114. "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  2115. guid.Data1,
  2116. guid.Data2,
  2117. guid.Data3,
  2118. guid.Data4[0], guid.Data4[1],
  2119. guid.Data4[2], guid.Data4[3],
  2120. guid.Data4[4], guid.Data4[5],
  2121. guid.Data4[6], guid.Data4[7]);
  2122. }
  2123. CoUninitialize();
  2124. return str.Left(28);
  2125. }
  2126. CString GetNameFromDomain(CString domain)
  2127. {
  2128. for (int i = 0; i < g_brancharray.GetSize(); i++)
  2129. {
  2130. if (domain == g_brancharray.ElementAt(i).ElementAt(2))
  2131. {
  2132. return g_brancharray.ElementAt(i).ElementAt(0);
  2133. }
  2134. }
  2135. return "";
  2136. }
  2137. void ConvertToPrice(CString &str)
  2138. {
  2139. if (str.Find('.') == -1)return;
  2140. str.TrimRight('0');
  2141. str.TrimRight('.');
  2142. }
  2143. int GetLengthEx(CString str)
  2144. {
  2145. wchar_t wstr[500];
  2146. int k = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, strlen(str), wstr, 500);
  2147. return k;
  2148. }
  2149. inline int MultiByteLengthConvertToWideCharLength(/*LPCSTR*/LPCCH lpString)
  2150. {
  2151. return MultiByteToWideChar(CP_ACP, 0, lpString, -1, NULL, 0);
  2152. }
  2153. BOOL myisdigit(CString str)
  2154. {
  2155. for (int i = 0; i < str.GetLength(); i++)
  2156. {
  2157. if (!::isdigit(str.GetAt(i)))
  2158. return 0;
  2159. }
  2160. return 1;
  2161. }
  2162. BOOL IsHasRightsnew2(int pos, CString rights)
  2163. {
  2164. if (rights.GetLength() > pos)
  2165. {
  2166. BOOL ret = atoi(rights.Mid(pos, 1));
  2167. if (ret == 0)AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION);
  2168. return ret;
  2169. }
  2170. AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION);
  2171. return 0;
  2172. }
  2173. DWORD FindAppProcessID(CString path)
  2174. {
  2175. try
  2176. {
  2177. HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  2178. PROCESSENTRY32 Info;
  2179. Info.dwSize = sizeof(PROCESSENTRY32);
  2180. path.MakeLower();
  2181. if (::Process32First(handle, &Info))
  2182. {
  2183. do
  2184. {
  2185. CString ss = Info.szExeFile;
  2186. ss.MakeLower();
  2187. if (ss.Find(path) != -1 || (!ss.CompareNoCase(path)))
  2188. {
  2189. ::CloseHandle(handle);
  2190. return Info.th32ProcessID;
  2191. }
  2192. } while (::Process32Next(handle, &Info));
  2193. ::CloseHandle(handle);
  2194. }
  2195. return -1;
  2196. }
  2197. catch (...)
  2198. {
  2199. }
  2200. }
  2201. BOOL isInnerIP(DWORD a_ip) // Jeff.判断是否是内网?
  2202. {
  2203. BOOL bValid = 0;
  2204. if ((a_ip >> 24 == 0xa) || (a_ip >> 16 == 0xc0a8) || (a_ip >> 22 == 0x2b0))
  2205. {
  2206. bValid = 1;
  2207. }
  2208. return bValid;
  2209. }
  2210. void MyGetIPByName2(CString &name)
  2211. {
  2212. CString strIP = name;
  2213. name.Empty();
  2214. DWORD dwServerIP = 0;
  2215. HOSTENT *host = gethostbyname(strIP);
  2216. struct in_addr addr;
  2217. if (host != NULL)
  2218. {
  2219. for (int i = 0; host->h_addr_list[i] != NULL; i++)
  2220. {
  2221. memset(&addr, 0, sizeof(addr));
  2222. memcpy(&addr.S_un.S_addr, host->h_addr_list[i], host->h_length);
  2223. dwServerIP = ntohl(addr.S_un.S_addr);
  2224. BYTE* pIP = (BYTE*)&dwServerIP;
  2225. name.Format(_T("%d.%d.%d.%d"), pIP[3], pIP[2], pIP[1], pIP[0]);
  2226. }
  2227. }
  2228. }
  2229. void MyGetIPByName(CString &name) // Jeff.根据计算机名称获取IP地址;
  2230. {
  2231. g_serverarray.RemoveAll();
  2232. CString strIP = name;
  2233. name.Empty();
  2234. DWORD dwServerIP = 0;
  2235. HOSTENT *host = gethostbyname(strIP); // Jeff.所有本机的网络适配器;
  2236. struct in_addr addr;
  2237. if (host != NULL)
  2238. {
  2239. // Jeff.遍历本机所有适配器的IP地址;
  2240. for (int i = 0; host->h_addr_list[i] != NULL; i++)
  2241. {
  2242. memset(&addr, 0, sizeof(addr));
  2243. memcpy(&addr.S_un.S_addr, host->h_addr_list[i], host->h_length);
  2244. dwServerIP = ntohl(addr.S_un.S_addr);
  2245. BYTE* pIP = (BYTE*)&dwServerIP;
  2246. name.Format(_T("%d.%d.%d.%d"), pIP[3], pIP[2], pIP[1], pIP[0]);
  2247. g_serverarray.Add(name);
  2248. }
  2249. }
  2250. while (g_serverarray.GetSize() > 1)
  2251. {
  2252. CString name;
  2253. BOOL bFind = 0;
  2254. for (int i = 0; i < g_serverarray.GetSize(); i++)
  2255. {
  2256. DWORD dwServerIP = inet_addr(g_serverarray.ElementAt(i));
  2257. dwServerIP = htonl(dwServerIP);//加了才正确
  2258. if (isInnerIP(dwServerIP) == 0)
  2259. {
  2260. // AfxMessageBox("外部IP");
  2261. g_serverarray.RemoveAt(i);
  2262. bFind = 1;
  2263. break;
  2264. }
  2265. // else
  2266. // AfxMessageBox("内部IP");
  2267. }
  2268. if (bFind == 0)
  2269. {
  2270. break;
  2271. }
  2272. }
  2273. }
  2274. int IsExistFolder(char *szPath)//可判断文件夹和文件的存在;
  2275. {
  2276. if ((_access(szPath, 0)) != -1)
  2277. {
  2278. //printf("Jeff:File %s \t exists \n",szPath );
  2279. /* Check for write permission */
  2280. if ((_access(szPath, 2)) != -1)
  2281. {
  2282. //printf("Jeff:File %s \t has write permission \n",szPath );
  2283. CString str;
  2284. str.Format("共享文件夹<%s>: 存在!\n", szPath);
  2285. WriteClientLog(str);
  2286. return 1;
  2287. }
  2288. // else // 只能判断文件权限,不能判断目录;
  2289. // {
  2290. // CString str;
  2291. // str.Format("共享文件夹<%s>:\t存在,不可写!■■■■■■■\n",szPath);
  2292. // WriteClientLog(str);
  2293. //
  2294. // return 0;
  2295. // }
  2296. }
  2297. else
  2298. {
  2299. //printf("Jeff:\t File %s no exists \n",szPath );
  2300. CString str;
  2301. str.Format("◆共享文件夹<%s>: 不存在,请设置共享或访问权限!◆\n", szPath);
  2302. WriteClientLog(str);
  2303. return -1;
  2304. }
  2305. }
  2306. CString GetW(CString str)
  2307. {
  2308. int x = atoi(str);
  2309. if (x > 9999)
  2310. {
  2311. str.Format("%d", x);
  2312. str = str.Right(5);
  2313. str = str.Left(1);
  2314. return str;
  2315. }
  2316. return "";
  2317. }
  2318. CString GetK(CString str)
  2319. {
  2320. int x = atoi(str);
  2321. if (x > 999)
  2322. {
  2323. str.Format("%d", x);
  2324. str = str.Right(4);
  2325. str = str.Left(1);
  2326. return str;
  2327. }
  2328. return "";
  2329. }
  2330. CString GetB(CString str)
  2331. {
  2332. int x = atoi(str);
  2333. if (x > 99)
  2334. {
  2335. str.Format("%d", x);
  2336. str = str.Right(3);
  2337. str = str.Left(1);
  2338. return str;
  2339. }
  2340. return "";
  2341. }
  2342. CString GetS(CString str)
  2343. {
  2344. int x = atoi(str);
  2345. if (x > 9)
  2346. {
  2347. str.Format("%d", x);
  2348. str = str.Right(2);
  2349. str = str.Left(1);
  2350. return str;
  2351. }
  2352. return "";
  2353. }
  2354. CString GetG(CString str)
  2355. {
  2356. int x = atoi(str);
  2357. if (x > 0)
  2358. {
  2359. str.Format("%d", x);
  2360. str = str.Right(1);
  2361. return str;
  2362. }
  2363. return "";
  2364. }
  2365. CString GetHMoney(CString str)
  2366. {
  2367. if (str.IsEmpty())return "";
  2368. if (str == "0")return "零";
  2369. if (atoi(str) < 1 || atoi(str) > 9)return "";
  2370. CString ret[] = { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
  2371. return ret[atoi(str) - 1];
  2372. }
  2373. BOOL CheckDateOK2(CString str)
  2374. {
  2375. if (str.IsEmpty())return 0;
  2376. CString tip;
  2377. int i;
  2378. CString demo = CTime::GetCurrentTime().Format("%Y-%m-%d");
  2379. if (str.GetLength() != demo.GetLength())
  2380. goto ll;
  2381. //2009-01-01
  2382. if (str.GetAt(4) != '-')
  2383. goto ll;
  2384. if (str.GetAt(7) != '-')
  2385. goto ll;
  2386. for (i = 0; i < str.GetLength(); i++)
  2387. {
  2388. if (i == 4 || i == 7)continue;
  2389. if (str.GetAt(i) < '0' || str.GetAt(i) > '9')
  2390. goto ll;
  2391. }
  2392. return 1;
  2393. ll:
  2394. return 0;
  2395. }
  2396. CString GetDomainFromBranch(CString branch)
  2397. {
  2398. if (branch.IsEmpty())return "";
  2399. for (int i = 0; i < g_brancharray.GetSize(); i++)
  2400. {
  2401. if (branch == g_brancharray.ElementAt(i).ElementAt(0))
  2402. {
  2403. return g_brancharray.ElementAt(i).ElementAt(2);
  2404. }
  2405. }
  2406. return "";
  2407. }
  2408. CString GetBranchPhotoPath(CString branch)
  2409. {
  2410. if (branch.IsEmpty())return "";
  2411. for (int i = 0; i < g_brancharray.GetSize() - 1; i++)
  2412. {
  2413. if (branch == g_brancharray.ElementAt(i).ElementAt(0))
  2414. {
  2415. return "\\" + g_brancharray.ElementAt(i).ElementAt(2);
  2416. }
  2417. }
  2418. return "";
  2419. }
  2420. CTime GetTmFromStr(CString date)
  2421. {
  2422. try
  2423. {
  2424. CTime tm(atoi(date.Mid(0, 4)), atoi(date.Mid(5, 2)), atoi(date.Mid(8, 2)), 0, 0, 0);
  2425. CString ss;
  2426. ss.Format("%d-%d-%d", tm.GetYear(), tm.GetMonth(), tm.GetDay());
  2427. return tm;
  2428. }
  2429. catch (...)
  2430. {
  2431. date = "1980-01-01";
  2432. CTime tm(atoi(date.Mid(0, 4)), atoi(date.Mid(5, 2)), atoi(date.Mid(8, 2)), 0, 0, 0);
  2433. return tm;
  2434. }
  2435. }
  2436. //---------------------------------------------------------------------
  2437. // add by Jeff 2014.10.24
  2438. // 函数:全局函数lyfzCopyFileEx
  2439. // 描述:文件复制。
  2440. // 参数:
  2441. // lpExistingFileName:你要拷贝的源文件名;
  2442. // lpNewFileName: 你要拷贝的目标文件名;
  2443. // bFailIfExists: 如果目标已经存在,不拷贝(True)并重命名,覆盖目标(false)
  2444. // 返回:与CopyFile返回一致;
  2445. //---------------------------------------------------------------------
  2446. BOOL lyfzCopyFileEx(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, const BOOL &bFailIfExists)
  2447. {
  2448. // 1.如果是覆盖选项;
  2449. if (!bFailIfExists)
  2450. return CopyFile(lpExistingFileName, lpNewFileName, bFailIfExists);
  2451. // 2.如果不是覆盖选项;
  2452. TCHAR szNewFileName[_MAX_PATH] = { 0 };
  2453. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  2454. TCHAR szDir[_MAX_DIR] = { 0 };
  2455. TCHAR szFna[_MAX_FNAME] = { 0 };
  2456. TCHAR szExt[_MAX_EXT] = { 0 };
  2457. sprintf(szNewFileName, "%s", lpNewFileName);
  2458. _tsplitpath(szNewFileName, szDrive, szDir, szFna, szExt);
  2459. int nIndex = 1;
  2460. while (PathFileExists(szNewFileName))
  2461. {
  2462. sprintf(szNewFileName, "%s%s%s (%d)%s", szDrive, szDir, szFna, nIndex++, szExt);
  2463. }
  2464. return CopyFile(lpExistingFileName, szNewFileName, bFailIfExists);
  2465. }
  2466. //---------------------------------------------------------------------
  2467. // add by Jeff 2014.10.24
  2468. // 函数:全局函数lyfzImportImage,多字节版本,非UNICODE
  2469. // 描述:导入图片。
  2470. // 参数:
  2471. // lpDestDirectory: 文件导入的目标目录;
  2472. // strArrayOfImage: 要导入的图片文件数组;
  2473. // bFailIfExists: 如果目标已经存在,不拷贝(True)并重命名,覆盖目标(false)
  2474. // 返回:
  2475. //
  2476. // 说明:在调用lyfzImportImage前,需要对传递的参数进行有效性验证
  2477. // 1.验证形参lpDestDirectory对应的实参是否是有效的目录(有无创建目录的非法字符存在)
  2478. // 2.验证形参strArrayOfImage对应的实参数组是否大于0;
  2479. // 如果校验没有通过,应该拒绝调lyfzImportImage,以防止错误产生。
  2480. //---------------------------------------------------------------------
  2481. void lyfzImportImage(LPCTSTR lpDestDirectory, CStringArray &strArrayOfImage, const BOOL &bFailIfExists)
  2482. {
  2483. // 传递给lyfzCreateDirectory的参数规范化;
  2484. int nlen = strlen(lpDestDirectory);
  2485. TCHAR szNewFileName[_MAX_PATH] = { 0 };
  2486. TCHAR szTempDirectory[_MAX_PATH] = { 0 };
  2487. if (lpDestDirectory[nlen - 1] != '\\')
  2488. sprintf(szTempDirectory, "%s\\", lpDestDirectory);
  2489. else
  2490. sprintf(szTempDirectory, "%s", lpDestDirectory);
  2491. // 若目录或子目录不存在创建;
  2492. lyfzCreateDirectory(szTempDirectory);
  2493. // 遍历复制;
  2494. CString strImage;
  2495. INT_PTR nSize = strArrayOfImage.GetSize();
  2496. for (INT_PTR i = 0; i < nSize; i++)
  2497. {
  2498. strImage = strArrayOfImage.ElementAt(i);
  2499. strImage = strImage.Mid(strImage.ReverseFind('\\') + 1);
  2500. //strImage = strImage.Left(strImage.ReverseFind('.'));
  2501. sprintf(szNewFileName, "%s%s", szTempDirectory, strImage);
  2502. lyfzCopyFileEx(szNewFileName, strArrayOfImage.ElementAt(i), bFailIfExists);
  2503. }
  2504. }
  2505. //---------------------------------------------------------------------
  2506. // add by Jeff 2014.10.25
  2507. // 函数:全局函数lyfzCreateDirectory,多字节版本,非UNICODE
  2508. // 描述:创建目录及子目录文件夹;
  2509. // 参数:
  2510. // lpDestDirectory:目录,必须是"E:\lyfzdb\数据\"格式,目录最后必须有"\",否则最后一个子目录无法创建!
  2511. // 建议使用系统_tsplitpath来分隔目录,这样会保存最后一个"\"斜杠;
  2512. // 返回:成功创建返回TRUE;
  2513. //---------------------------------------------------------------------
  2514. BOOL lyfzCreateDirectory(LPCTSTR lpDestDirectory)
  2515. {
  2516. BOOL bExists = FALSE;
  2517. TCHAR szNewFileName[_MAX_PATH] = { 0 };
  2518. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  2519. TCHAR szDir[_MAX_DIR] = { 0 };
  2520. TCHAR szFna[_MAX_FNAME] = { 0 };
  2521. TCHAR szExt[_MAX_EXT] = { 0 };
  2522. int nIndex = 0;
  2523. do
  2524. {
  2525. bExists = PathFileExists(lpDestDirectory);
  2526. if (!bExists)
  2527. {
  2528. memset(szDrive, 0, _MAX_DRIVE);
  2529. memset(szDir, 0, _MAX_DIR);
  2530. memset(szFna, 0, _MAX_FNAME);
  2531. memset(szExt, 0, _MAX_EXT);
  2532. lyfzSplitpath(lpDestDirectory, szDrive, szDir, ++nIndex);
  2533. sprintf(szNewFileName, _T("%s%s"), szDrive, szDir);
  2534. CreateDirectory(szNewFileName, NULL);
  2535. //if (FALSE == CreateDirectory(szNewFileName, NULL))
  2536. //{
  2537. //ShowSystemErrorInfo(CString("创建目录出错。"), GetLastError());
  2538. //return FALSE;
  2539. // continue;
  2540. //}
  2541. }
  2542. } while (!bExists);
  2543. return TRUE;
  2544. }
  2545. //---------------------------------------------------------------------
  2546. // add by Jeff 2014.10.24
  2547. // 函数:全局函数tSplitpath,多字节版本,非UNICODE
  2548. // 描述:类系统Windows C++运行库函数_tsplitpath。
  2549. // 参数:
  2550. //
  2551. // 返回:
  2552. //---------------------------------------------------------------------
  2553. void lyfzSplitpath(const char *path, char *drive, char *dir, const int &nTimes)
  2554. {
  2555. int nlen = strlen(path);
  2556. int i = 0;
  2557. int npoint = 0; // '.'
  2558. int nsprit = 0; // '\\'
  2559. int ncolon = 0; // ':'
  2560. int ntimes = -1;
  2561. while (nlen > i++)
  2562. {
  2563. if (path[i] == ':')
  2564. ncolon = i;
  2565. else if (path[i] == '\\')
  2566. {
  2567. if (nTimes == ntimes++) break;
  2568. nsprit = i;
  2569. }
  2570. }
  2571. memcpy(drive, path, ncolon + 1);
  2572. memcpy(dir, &path[ncolon + 1], nsprit - ncolon);
  2573. }
  2574. //---------------------------------------------------------------------
  2575. // Jeff add 2014.06.23;
  2576. // 函数:ShowErrorInfo
  2577. // 描述:
  2578. // 参数:
  2579. // lpszFunction:函数名;
  2580. // dwError:错误码;
  2581. // 返回:
  2582. //---------------------------------------------------------------------
  2583. void ShowSystemErrorInfo(CString &strDescription, const DWORD &dwError)
  2584. {
  2585. #if 0
  2586. LPVOID lpMsgBuf;
  2587. FormatMessage(
  2588. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  2589. FORMAT_MESSAGE_FROM_SYSTEM |
  2590. FORMAT_MESSAGE_IGNORE_INSERTS,
  2591. NULL,
  2592. dwError,
  2593. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  2594. (LPTSTR)&lpMsgBuf,
  2595. 0, NULL);
  2596. // Display the error message and exit the process
  2597. CString strDisplay;
  2598. strDisplay.Format("失败错误码=%d,Windows内部描述:%s", dwError, lpMsgBuf);
  2599. strDescription += strDisplay;
  2600. AfxMessageBox(strDescription);
  2601. LocalFree(lpMsgBuf);
  2602. #endif
  2603. LPVOID lpMsgBuf;
  2604. BOOL fOk = FormatMessage(
  2605. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  2606. FORMAT_MESSAGE_FROM_SYSTEM |
  2607. FORMAT_MESSAGE_IGNORE_INSERTS,
  2608. NULL,
  2609. dwError,
  2610. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  2611. (LPTSTR)&lpMsgBuf,
  2612. 0, NULL);
  2613. if (!fOk)
  2614. {
  2615. // Is it a network-related error?
  2616. HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
  2617. if (hDll != NULL)
  2618. {
  2619. FormatMessage(
  2620. FORMAT_MESSAGE_FROM_HMODULE |
  2621. FORMAT_MESSAGE_FROM_SYSTEM |
  2622. FORMAT_MESSAGE_IGNORE_INSERTS,
  2623. hDll,
  2624. dwError,
  2625. MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  2626. (LPTSTR)&lpMsgBuf,
  2627. 0,
  2628. NULL);
  2629. FreeLibrary(hDll);
  2630. }
  2631. }
  2632. if (lpMsgBuf != NULL)
  2633. {
  2634. CString strDisplay;
  2635. strDisplay.Format("%s.错误码=%d,Windows描述:%s", strDescription, dwError, (PCTSTR)LocalLock(lpMsgBuf));
  2636. //WriteLogin(strDisplay);
  2637. AfxMessageBox(strDisplay);
  2638. LocalFree(lpMsgBuf);
  2639. }
  2640. else
  2641. {
  2642. //WriteLogin(strDescription);
  2643. AfxMessageBox("未知道错误");
  2644. }
  2645. }
  2646. //---------------------------------------------------------------------
  2647. // Jeff add 2014.06.23;
  2648. // 函数:WriteClientLog
  2649. // 描述:写客户端程序日志。
  2650. // 参数:
  2651. // str:日志内容;
  2652. // 返回:
  2653. //---------------------------------------------------------------------
  2654. void WriteClientLog(const CString &strLogContent)
  2655. {
  2656. try
  2657. {
  2658. CStdioFile fp;
  2659. CString path = g_mainpath + "\\客户端日志.txt";
  2660. if (PathFileExists(path))
  2661. {
  2662. fp.Open(path, CFile::modeWrite);
  2663. int length = fp.GetLength();
  2664. if (length > 5 * 1024 * 1024)
  2665. {
  2666. fp.Close();
  2667. ::DeleteFile(path);
  2668. return;
  2669. }
  2670. fp.SeekToEnd();
  2671. }
  2672. else
  2673. fp.Open(path, CFile::modeCreate | CFile::modeWrite);
  2674. fp.WriteString(CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S") + " " + strLogContent + "\n");
  2675. fp.Close();
  2676. }
  2677. catch (...)
  2678. {
  2679. }
  2680. }
  2681. //---------------------------------------------------------------------
  2682. // add by Jeff 2014.10.27
  2683. // 函数:全局函数IsDirectoryLegitimate,多字节版本,非UNICODE
  2684. // 描述:判断一个目录路径字符串,是否属于合法的、可创建的目录路径。
  2685. // 参数:strDirectory 被验证的路径字符串;
  2686. //
  2687. // 返回:合法路径返回TRUE;
  2688. //---------------------------------------------------------------------
  2689. BOOL IsDirectoryLegitimate(const CString &strDirectory)
  2690. {
  2691. if (strDirectory.Find('/') != -1 ||
  2692. strDirectory.Find('\\') != -1 ||
  2693. strDirectory.Find(':') != -1 ||
  2694. strDirectory.Find('*') != -1 ||
  2695. strDirectory.Find('?') != -1 ||
  2696. strDirectory.Find('\"') != -1 ||
  2697. strDirectory.Find('>') != -1 ||
  2698. strDirectory.Find('<') != -1 ||
  2699. strDirectory.Find('|') != -1
  2700. )
  2701. return FALSE;
  2702. return TRUE;
  2703. }
  2704. //----------------------------------------------------------------------
  2705. // remark by Jeff 2014.11.08
  2706. // 函数:ExportCutImageToFile
  2707. // 描述:导出裁剪图片到指定目录;
  2708. // 参数:
  2709. // lpOrderCutImageInfo:订单号的裁剪相片信息;
  2710. // lpSrcDirectory:原图片路径;
  2711. // lpOrderCutImageInfo格式:相片名|裁剪方案|原片宽|原片高|裁剪left|裁剪top|裁剪bottom|裁剪rigth
  2712. // 225:5X7,1440,900,88,0,1352,900;228:5X7,1440,900,88,0,1352,900;224:5X7,1440,900,88,0,1352,900;227:10寸,1440,900,56,0,1384,900;229:10寸水晶,1440,900,570,232,870,671;
  2713. // lpSaveDirectory:导出相片的保存路径;
  2714. // 返回:无
  2715. //----------------------------------------------------------------------
  2716. void ExportCutImageToFile(LPCCH lpOrderCutImageInfo, LPCCH lpSrcDirectory, LPCCH lpSaveDirectory)
  2717. {
  2718. if (FALSE == lyfzCreateDirectory(lpSaveDirectory))
  2719. return;
  2720. CStringArray saSrcPhoto;
  2721. GetCountOfOrderFolderPhotoFile(lpSrcDirectory, saSrcPhoto);
  2722. CString strImageName; // 相片名;
  2723. CString strCutScheme; // 裁剪方案;
  2724. CRect rtCut; // 要裁剪的区域;
  2725. CString strTemp;
  2726. CString strImageInfo(lpOrderCutImageInfo);
  2727. int nIndex = -1;
  2728. do
  2729. {
  2730. // 225:5X7,1440,900,88,0,1352,900;
  2731. nIndex = strImageInfo.Find(';');
  2732. strTemp = strImageInfo.Left(nIndex);
  2733. strImageInfo = strImageInfo.Mid(nIndex + 1);
  2734. int SrcImageWid;
  2735. int SrcImageHei;
  2736. int ntempIndex = -1;
  2737. if (nIndex != -1)
  2738. {
  2739. if (FALSE == AnalysisImagInfo(saSrcPhoto,lpSrcDirectory, lpSaveDirectory, strTemp, strImageName, strCutScheme, rtCut))
  2740. continue;
  2741. }
  2742. else
  2743. {
  2744. if (strImageInfo.IsEmpty())
  2745. break;
  2746. AnalysisImagInfo(saSrcPhoto,lpSrcDirectory, lpSaveDirectory, strImageInfo, strImageName, strCutScheme, rtCut);
  2747. break;
  2748. }
  2749. } while (nIndex != -1);
  2750. }
  2751. //----------------------------------------------------------------------
  2752. // remark by Jeff 2014.11.08
  2753. // 函数:AnalysisImagInfo
  2754. // 描述:导出裁剪图片到指定目录;
  2755. // 参数:
  2756. // lpOrderCutImageInfo:订单号的裁剪相片信息;
  2757. // lpSrcDirectory:原图片路径;
  2758. // lpOrderCutImageInfo格式:相片名|裁剪方案|原片宽|原片高|裁剪left|裁剪top|裁剪bottom|裁剪rigth
  2759. // 225:5X7,1440,900,88,0,1352,900;
  2760. // lpSaveDirectory:导出相片的保存路径;
  2761. // 返回:无
  2762. //
  2763. // 说明:未对图片进行缩小,直接在原片上裁剪而得。
  2764. //----------------------------------------------------------------------
  2765. BOOL AnalysisImagInfo(CStringArray &saSrcPhoto, LPCCH lpSrcDirectory, LPCCH lpSaveDirectory, CString &strImageInfo, CString &strImageName, CString &strCutScheme, CRect &rtCut)
  2766. {
  2767. int ntempIndex = -1;
  2768. strImageName = strImageInfo.Left(3); // 裁剪相片名;
  2769. strImageInfo.Delete(0, 4);
  2770. CString strSrcImagePath;
  2771. BOOL bExist = FALSE;
  2772. for (int i = 0; i < saSrcPhoto.GetSize(); i++)
  2773. {
  2774. CString strTemp = saSrcPhoto.ElementAt(i);
  2775. strSrcImagePath = strTemp;
  2776. _splitpath((LPCTSTR)saSrcPhoto.ElementAt(i), NULL, NULL, strTemp.GetBuffer(0), NULL);
  2777. strTemp.ReleaseBuffer();
  2778. if ( strTemp == strImageName)
  2779. {
  2780. bExist = TRUE;
  2781. //saSrcPhoto.RemoveAt(i);
  2782. break;
  2783. }
  2784. }
  2785. if (FALSE == bExist)
  2786. return FALSE;
  2787. ntempIndex = strImageInfo.Find(',');
  2788. strCutScheme = strImageInfo.Left(ntempIndex); // 裁剪方案;
  2789. strImageInfo.Delete(0, ntempIndex + 1);
  2790. // 裁剪原图宽;
  2791. ntempIndex = strImageInfo.Find(',');
  2792. LONG SrcImageWid = _ttol(strImageInfo.Left(ntempIndex));
  2793. strImageInfo.Delete(0, ntempIndex + 1);
  2794. // 裁剪原图高;
  2795. ntempIndex = strImageInfo.Find(',');
  2796. LONG SrcImageHei = _ttol(strImageInfo.Left(ntempIndex));
  2797. strImageInfo.Delete(0, ntempIndex + 1);
  2798. // left坐标值;
  2799. ntempIndex = strImageInfo.Find(',');
  2800. rtCut.left = _ttol(strImageInfo.Left(ntempIndex));
  2801. strImageInfo.Delete(0, ntempIndex + 1);
  2802. // top坐标;
  2803. ntempIndex = strImageInfo.Find(',');
  2804. rtCut.top = _ttol(strImageInfo.Left(ntempIndex));
  2805. strImageInfo.Delete(0, ntempIndex + 1);
  2806. // right坐标;
  2807. ntempIndex = strImageInfo.Find(',');
  2808. rtCut.right = _ttol(strImageInfo.Left(ntempIndex));
  2809. strImageInfo.Delete(0, ntempIndex + 1);
  2810. // bottom坐标;
  2811. rtCut.bottom = _ttol(strImageInfo.Left(ntempIndex));
  2812. // 导出裁剪相片到指定目录;
  2813. // 1.加载原图;
  2814. Image *SrcImage = NULL;
  2815. //if (FALSE == PathFileExists(CString(lpSrcDirectory + strImageName + _T(".jpg"))))
  2816. if (FALSE == PathFileExists(strSrcImagePath))
  2817. {
  2818. AfxMessageBox(_T("相片源文件不存在"));
  2819. return FALSE;
  2820. }
  2821. //LoadImageFromBuf(&SrcImage, CString(lpSrcDirectory + strImageName + _T(".jpg")));
  2822. LoadImageFromBuf(&SrcImage, strSrcImagePath);
  2823. if (SrcImage == NULL)
  2824. {
  2825. AfxMessageBox(_T("加载源图片失败"));
  2826. return FALSE;
  2827. }
  2828. int orientation = GetOrientation(SrcImage);
  2829. if (orientation == 8)
  2830. SrcImage->RotateFlip(Rotate270FlipNone);
  2831. else if (orientation == 6)
  2832. SrcImage->RotateFlip(Rotate90FlipNone);
  2833. if (SrcImage->GetWidth() == 0)
  2834. return FALSE;
  2835. float scale = 1.0;
  2836. scale *= (float)SrcImage->GetWidth() / (float)SrcImageWid;
  2837. rtCut.left *= scale;
  2838. rtCut.right *= scale;
  2839. rtCut.top *= scale;
  2840. rtCut.bottom *= scale;
  2841. #if 0 // 保存在原图上画裁剪区域;
  2842. Graphics graph(SrcImage);
  2843. Pen blackPen(Color(255, 255, 0, 0), 1);
  2844. graph.DrawRectangle(&blackPen, rtCut.left, rtCut.top, rtCut.Width(), rtCut.Height());
  2845. SaveImageToFile(SrcImage, CString(lpSaveDirectory + strImageName + _T(".jpg")));
  2846. delete SrcImage;
  2847. #else // 直接保存裁剪后的图片;
  2848. Bitmap bp(rtCut.Width(), rtCut.Height());
  2849. Graphics *graphic = Graphics::FromImage(&bp);
  2850. graphic->Clear(Color(255, 255, 255, 255));
  2851. graphic->SetInterpolationMode(InterpolationModeHighQualityBicubic);
  2852. graphic->SetSmoothingMode(SmoothingModeHighQuality);//SmoothingModeHighSpeed
  2853. graphic->SetPixelOffsetMode(PixelOffsetModeHighQuality);
  2854. graphic->SetCompositingMode(CompositingModeSourceOver);
  2855. graphic->SetCompositingQuality(CompositingQualityHighQuality);
  2856. graphic->SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
  2857. graphic->DrawImage(SrcImage, RectF(0, 0, rtCut.Width(), rtCut.Height()), rtCut.left, rtCut.top, rtCut.Width(), rtCut.Height(), UnitPixel);
  2858. delete SrcImage;
  2859. //delete graphic;
  2860. //CString strSave;
  2861. //strSave.Format("%s%s:%s.jpg", lpSaveDirectory,strImageName,strCutScheme);
  2862. //SaveImageToFile(&bp, strSave);
  2863. SaveImageToFile(&bp, CString(lpSaveDirectory + strImageName + _T(":") + strCutScheme + _T(".jpg")));
  2864. #endif
  2865. return TRUE;
  2866. }
  2867. // 相片后缀:jpg、raw、cr2、NEF 四种常用后缀
  2868. //--------------------------------------------------------------------------------
  2869. // Remark by Jeff 2014.11.10
  2870. // 函数:GetCountOfOrderFolderPhotoFile
  2871. // 描述:获取订单文件夹下所有相片文件,不含"m"和"s"开头的小图;
  2872. // 参数:pOrderFolder:订单文件路径;
  2873. // 返回:
  2874. //
  2875. //--------------------------------------------------------------------------------
  2876. int GetCountOfOrderFolderPhotoFile(__in const TCHAR *pOrderFolder, __out CStringArray &StrPhotoArray)
  2877. {
  2878. CStringArray StrSubFoloderArray;
  2879. using namespace helper_coffs;
  2880. ffsco o;
  2881. o.dirs(1); // Jeff.1:查找子目录;
  2882. o.find(LPCTSTR(pOrderFolder), LPCTSTR(_T("*.*"))); // 可能存在m和s开头的缩略图,需要过滤掉;
  2883. if (o.count() == 0)
  2884. return 0;
  2885. // 获取子目录数;
  2886. ffsco::typeT coo;
  2887. ffsco::typeT::iterator it;
  2888. coo = o.co_dir();
  2889. for (it = coo.begin(); it != coo.end(); it++)
  2890. {
  2891. if (FindArray(&StrSubFoloderArray, (*it).c_str()) == -1)
  2892. StrSubFoloderArray.Add((*it).c_str());
  2893. }
  2894. int nIndex = -1;
  2895. CString strOrderNumberImage;
  2896. // 获取子目录下的文件数;
  2897. //CStringArray StrPhotoArray;
  2898. for (int n = 0; n < StrSubFoloderArray.GetSize(); n++)
  2899. {
  2900. ffsco op;
  2901. op.dirs(0);
  2902. op.find(LPCTSTR(StrSubFoloderArray.ElementAt(n)), LPCTSTR(_T("*.jpg")));
  2903. ffsco::typeT coo;
  2904. ffsco::typeT::iterator itp;
  2905. coo = op.co_file();
  2906. for (itp = coo.begin(); itp != coo.end(); itp++)
  2907. {
  2908. strOrderNumberImage = (*itp).c_str();
  2909. nIndex = strOrderNumberImage.ReverseFind('\\');
  2910. strOrderNumberImage = strOrderNumberImage.Right(strOrderNumberImage.GetLength() - nIndex -1);
  2911. if (strOrderNumberImage.Left(1) != _T("m") && strOrderNumberImage.Left(1) != _T("s"))
  2912. {
  2913. StrPhotoArray.Add((*itp).c_str());
  2914. }
  2915. }
  2916. }
  2917. return 0;
  2918. }