00001
00006
00007 #include "..\stdafx.h"
00008
00009 #include "WinTools.h"
00010
00011
00012 using namespace jbxl;
00013 using namespace jbxwl;
00014
00015
00017
00018
00020
00021
00022
00023
00024 Buffer jbxwl::tc2Buffer(TCHAR* tchar, int size)
00025 {
00026 if (size<0) size = LDATA;
00027 Buffer buf = make_Buffer(size);
00028
00029 #ifdef _UNICODE
00030 size_t len;
00031 int err = wcstombs_s(&len, (char*)buf.buf, buf.bufsz, tchar, _TRUNCATE);
00032
00033 if (err!=0) clear_Buffer(&buf);
00034 else buf.vldsz = (int)Min(len-1, strlen((char*)buf.buf));
00035 buf.state = err;
00036
00037 #else
00038 copy_s2Buffer(tchar, &buf);
00039
00040 #endif
00041
00042 return buf;
00043 }
00044
00045
00046
00047 Buffer jbxwl::ts2Buffer(LPCTSTR str, int size)
00048 {
00049 if (size<0) size = (int)tcslen(str);
00050
00051 #ifdef _UNICODE
00052 Buffer buf = make_Buffer((size+1)*4);
00053 size_t len;
00054
00055 int err = wcstombs_s(&len, (char*)buf.buf, buf.bufsz, str, _TRUNCATE);
00056 if (err!=0) clear_Buffer(&buf);
00057 else buf.vldsz = (int)Min(len-1, strlen((char*)buf.buf));
00058 buf.state = err;
00059
00060 #else
00061 Buffer buf = make_Buffer(size);
00062 copy_b2Buffer((char*)str, &buf, size);
00063
00064 #endif
00065
00066 return buf;
00067 }
00068
00069
00070
00071 CString jbxwl::mbs2ts(char* str)
00072 {
00073 CString buf = _T("");
00074 if (str==NULL) return buf;
00075
00076 #ifdef _UNICODE
00077 setlocale(LC_ALL, ".UTF8");
00078 TCHAR tchar[LBUF];
00079 size_t len = 0;
00080 int err = mbstowcs_s(&len, tchar, LBUF, str, strlen(str));
00081 if (err==0) buf = tchar;
00082
00083 #else
00084 buf = (LPTSTR)str;
00085
00086 #endif
00087
00088 return buf;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00108
00109
00110
00111
00112
00113
00114 int jbxwl::copy_ts2Buffer(LPCTSTR str, Buffer* buf)
00115 {
00116 if (buf==NULL) return -1;
00117 int cc = 0;
00118
00119 #ifdef _UNICODE
00120 char* mbstr = ts2mbs(str);
00121 copy_s2Buffer(mbstr, buf);
00122 ::free(mbstr);
00123 cc = buf->vldsz;
00124
00125 #else
00126 cc = copy_s2Buffer((char*)str, buf);
00127
00128 #endif
00129
00130 return cc;
00131 }
00132
00133
00134
00135
00136
00137
00138
00139 int jbxwl::cat_ts2Buffer(LPCTSTR str, Buffer* buf)
00140 {
00141 if (buf==NULL) return -1;
00142 int cc = 0;
00143
00144 #ifdef _UNICODE
00145 char* mbstr = ts2mbs(str);
00146 cat_s2Buffer(mbstr, buf);
00147 ::free(mbstr);
00148 cc = buf->vldsz;
00149
00150 #else
00151 cc = cat_s2Buffer((char*)str, buf);
00152
00153 #endif
00154
00155 return cc;
00156 }
00157
00158
00159
00160
00162
00163
00164 unsigned long int jbxwl::file_size_t(LPCTSTR fn)
00165 {
00166 struct _stat stbuf;
00167 _tstat(fn, &stbuf);
00168 return stbuf.st_size;
00169 }
00170
00171
00172
00173 BOOL jbxwl::file_exist_t(LPCTSTR fn)
00174 {
00175 BOOL ret = FALSE;
00176 if (fn==NULL) return FALSE;
00177
00178 #ifdef _UNICODE
00179 FILE* fp = tfopen(fn, _T("rb"));
00180 if (fp!=NULL) {
00181 ret = TRUE;
00182 fclose(fp);
00183 }
00184
00185 #else
00186 ret = file_exist((char*)fn);
00187
00188 #endif
00189
00190 return ret;
00191 }
00192
00193
00194
00195 CString jbxwl::get_file_name_t(LPCTSTR str)
00196 {
00197 CString buf = _T("");
00198
00199 #ifdef _UNICODE
00200 char* mbstr = ts2mbs(str);
00201 char* fn = get_file_name(mbstr);
00202 buf = mbs2ts(fn);
00203 ::free(mbstr);
00204
00205 #else
00206 char* fn = get_file_name((char*)str);
00207 buf = (LPTSTR)fn;
00208
00209 #endif
00210
00211 return buf;
00212 }
00213
00214
00215
00216 CString jbxwl::make_file_path_t(LPCTSTR str)
00217 {
00218 CString buf = _T("");
00219
00220 #ifdef _UNICODE
00221 char* mbstr = ts2mbs(str);
00222
00223 char* pn = get_file_path(mbstr);
00224 buf = mbs2ts(pn);
00225 ::free(mbstr);
00226 ::free(pn);
00227
00228 #else
00229
00230 char* pn = get_file_path((char*)str);
00231 buf = (LPTSTR)pn;
00232 ::free(pn);
00233
00234 #endif
00235
00236 return buf;
00237 }
00238
00239
00240
00241 CString jbxwl::cut_file_extension_t(LPCTSTR str)
00242 {
00243 CString buf = _T("");
00244
00245 #ifdef _UNICODE
00246 char* mbstr = ts2mbs(str);
00247 char* pn = cut_file_extension(mbstr);
00248 buf = mbs2ts(pn);
00249 ::free(mbstr);
00250 ::free(pn);
00251
00252 #else
00253 char* pn = cut_file_extension((char*)str);
00254 buf = (LPTSTR)pn;
00255 ::free(pn);
00256 #endif
00257
00258 return buf;
00259 }
00260
00261
00262
00263 tList* jbxwl::get_dir_files_t(LPCTSTR dirn)
00264 {
00265 tList* lp = NULL;
00266 tList* ln = NULL;
00267
00268 WIN32_FIND_DATA FindFileData;
00269 HANDLE hFind;
00270 CString dirstr = dirn;
00271
00272 if (dirstr.Right(1)!="\\") dirstr += _T("\\*");
00273 hFind = FindFirstFile((LPCTSTR)dirstr, &FindFileData);
00274 if (hFind!=INVALID_HANDLE_VALUE) {
00275 Buffer tmp;
00276 do {
00277 char* fn = ts2mbs(FindFileData.cFileName);
00278 if (strcmp(".", fn) && strcmp("..", fn)) {
00279 tmp = ts2Buffer(dirn);
00280 if (tmp.buf[tmp.vldsz-1]!='\\') cat_s2Buffer("\\", &tmp);
00281 cat_ts2Buffer(FindFileData.cFileName, &tmp);
00282 ln = add_tList_node_str(ln, NULL, tmp.buf);
00283 if (lp==NULL) lp = ln;
00284 free_Buffer(&tmp);
00285 }
00286 ::free(fn);
00287 } while (FindNextFile(hFind, &FindFileData));
00288
00289 FindClose(hFind);
00290 }
00291
00292 return lp;
00293 }
00294
00295
00296
00297 tList* jbxwl::get_dir_files_rcsv_t(LPCTSTR dirn)
00298 {
00299 tList* lp = get_dir_files_t(dirn);
00300 if (lp==NULL) return NULL;
00301
00302 tList* lt = dup_tList(lp);
00303 while (lt!=NULL) {
00304 tList* lc = get_dir_files_rcsv_t(mbs2ts((char*)lt->ldat.val.buf));
00305 if (lc!=NULL) add_tList_end(lp, lc);
00306 lt = lt->next;
00307 }
00308 del_tList(<);
00309
00310 return lp;
00311 }
00312
00313
00314
00315 tList* jbxwl::read_index_tList_file_t(LPCTSTR fn, char cc)
00316 {
00317 char* pathstr = NULL;
00318 if (fn!=_T("")) pathstr = ts2mbs(fn);
00319
00320 tList* lt = read_index_tList_file(pathstr, cc);
00321 freeNull(pathstr);
00322
00323 return lt;
00324 }
00325
00326
00327
00328
00330
00331
00332 CString jbxwl::numbering_name_t(LPCTSTR fmt, int n)
00333 {
00334 TCHAR fname[LNAME];
00335
00336 sntprintf(fname, LNAME-1, fmt, n);
00337 CString ret = fname;
00338 return ret;
00339 }
00340
00341
00342
00343 CString jbxwl::get_tstr_param_tList(tList* lt, char* key, LPCTSTR dflt)
00344 {
00345 Buffer buf = buffer_key_tList(lt, key, 1);
00346 if (buf.buf!=NULL) {
00347 CString ret = mbs2ts((char*)buf.buf);
00348 free_Buffer(&buf);
00349 return ret;
00350 }
00351 return (CString)dflt;
00352 }
00353
00354
00355
00356
00358
00359
00360 void jbxwl::setResourceLocale(void)
00361 {
00362 CString locale = LoadString_byID(IDS_STR_LOCALE);
00363 _tsetlocale(LC_ALL, (LPCTSTR)locale);
00364 return;
00365 }
00366
00367
00368
00369 void jbxwl::setSystemLocale(LPCTSTR locale)
00370 {
00371 _tsetlocale(LC_ALL, locale);
00372 return;
00373 }
00374
00375
00376
00377 CString jbxwl::getResourceLocale(void)
00378 {
00379 CString locale = LoadString_byID(IDS_STR_LOCALE);
00380 return locale;
00381 }
00382
00383
00384
00385
00387
00388
00389
00390 #pragma comment(lib, "userenv.lib")
00391 #pragma comment(lib, "imagehlp.lib")
00392
00393
00394 CString jbxwl::GetCurrentUserHomeFolder(void)
00395 {
00396 HANDLE token;
00397 DWORD size = (DWORD)LMESG;
00398 TCHAR dirn[LMESG];
00399 CString ret = _T("");
00400
00401 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
00402 BOOL rslt = GetUserProfileDirectory(token, dirn, &size);
00403
00404 if (rslt && size<=LMESG) ret = dirn;
00405 return ret;
00406 }
00407
00408
00409
00410 CString jbxwl::GetDefaultUserHomeFolder(void)
00411 {
00412 DWORD size = (DWORD)LMESG;
00413 TCHAR dirn[LMESG];
00414 CString ret = _T("");
00415
00416 BOOL rslt = GetDefaultUserProfileDirectory(dirn, &size);
00417 if (rslt && size<=LMESG) ret = dirn;
00418 return ret;
00419 }
00420
00421
00422
00423 CString jbxwl::MakeWorkingFolderPath(LPCTSTR fnm, BOOL local, LPCTSTR dir, BOOL make)
00424 {
00425 CString path = GetCurrentUserHomeFolder();
00426
00427 if (local) path += _T("\\AppData\\Local");
00428 else path += _T("\\AppData\\Roaming");
00429
00430 if (dir!=NULL) path += dir;
00431 else path += _T("\\");
00432
00433 if (make) {
00434 char* mbstr = ts2mbs(path);
00435 MakeSureDirectoryPathExists(mbstr);
00436 ::free(mbstr);
00437 }
00438 if (fnm!=NULL) path += fnm;
00439
00440 return path;
00441 }
00442
00443
00444
00445 CString jbxwl::GetProgramFolder(void)
00446 {
00447 char* path = GetProgramFolderA();
00448
00449 CString ret = mbs2ts(path);
00450 ::free(path);
00451
00452 return ret;
00453 }
00454
00455
00456
00457 char* jbxwl::GetProgramFolderA(void)
00458 {
00459 TCHAR dirn[LMESG];
00460
00461 GetModuleFileName(NULL, dirn, (DWORD)LMESG);
00462
00463 char* path = ts2mbs(dirn);
00464 int len = (int)strlen(path);
00465
00466 for (int i=1; i<len; i++) {
00467 if (path[len-i-1]=='\\') {
00468 path[len-i] = '\0';
00469 break;
00470 }
00471 }
00472
00473 return path;
00474 }
00475
00476
00477
00478 CString jbxwl::GetCurrentFolder(void)
00479 {
00480 TCHAR dirn[LMESG];
00481
00482 GetCurrentDirectoryW(LMESG, dirn);
00483
00484 CString folder = dirn;
00485 return folder;
00486 }
00487
00488
00489
00490
00492
00493
00494
00495 void jbxwl::SendWinMessage(UINT mesg, WPARAM wparam, LPARAM lparam)
00496 {
00497 CWinApp* app = AfxGetApp();
00498 if (app!=NULL) {
00499 CWnd* wnd = app->m_pMainWnd;
00500 if (wnd!=NULL) wnd->SendMessage(mesg, wparam, lparam);
00501 }
00502 }
00503
00504
00505
00506
00508
00509
00510 void jbxwl::SendKeyAction(WORD key, SENDKEY_Action action)
00511 {
00512 INPUT input;
00513
00514 input.type = INPUT_KEYBOARD;
00515 input.ki.wVk = key;
00516 input.ki.wScan = MapVirtualKeyW(key, 0);
00517 input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
00518
00519 if (action==SENDKEY_TapAction || action==SENDKEY_DownAction) {
00520 SendInput(1, &input, sizeof(INPUT));
00521 }
00522 if (action==SENDKEY_TapAction || action==SENDKEY_UpAction) {
00523 input.ki.dwFlags |= KEYEVENTF_KEYUP;
00524 SendInput(1, &input, sizeof(INPUT));
00525 }
00526 }
00527
00528
00529
00530 void jbxwl::SendKeyActionTap(WORD key1, WORD key2)
00531 {
00532 SendKeyAction(key1, SENDKEY_DownAction);
00533 SendKeyAction(key2, SENDKEY_TapAction);
00534 SendKeyAction(key1, SENDKEY_UpAction);
00535 }
00536
00537
00538
00539 void jbxwl::SendKeyActionTap(WORD key1, WORD key2, WORD key3)
00540 {
00541 SendKeyAction(key1, SENDKEY_DownAction);
00542 SendKeyAction(key2, SENDKEY_DownAction);
00543 SendKeyAction(key3, SENDKEY_TapAction);
00544 SendKeyAction(key2, SENDKEY_UpAction);
00545 SendKeyAction(key1, SENDKEY_UpAction);
00546 }
00547
00548
00549
00554 BOOL jbxwl::DoSystemKeyAction(LPCTSTR com, BOOL child)
00555 {
00556 if (com==NULL) return TRUE;
00557
00558
00559 if (!tcscmp(com, _T("UP"))) {
00560 SendKeyActionTap(VK_UP);
00561 }
00562 else if (!tcscmp(com, _T("DOWN"))) {
00563 SendKeyActionTap(VK_DOWN);
00564 }
00565 else if (!tcscmp(com, _T("RIGHT"))) {
00566 SendKeyActionTap(VK_RIGHT);
00567 }
00568 else if (!tcscmp(com, _T("LEFT"))) {
00569 SendKeyActionTap(VK_LEFT);
00570 }
00571 else if (!tcscmp(com, _T("NEXT")) || !tcscmp(com, _T("TAB"))) {
00572 SendKeyActionTap(VK_TAB);
00573 }
00574 else if (!tcscmp(com, _T("BACK"))) {
00575 SendKeyActionTap(VK_LSHIFT, VK_TAB);
00576 }
00577 else if (!tcscmp(com, _T("ENTER"))) {
00578 SendKeyActionTap(VK_RETURN);
00579 }
00580 else if (!tcscmp(com, _T("MENU")) || !tcscmp(com, _T("ALT"))) {
00581 SendKeyActionTap(VK_LMENU);
00582 }
00583 else if (!tcscmp(com, _T("ESC"))) {
00584 SendKeyActionTap(VK_ESCAPE);
00585 }
00586
00587 else if (!tcscmp(com, _T("CHANGE"))) {
00588 SendKeyActionTapCtrl(VK_F6);
00589 }
00590 else if (!tcscmp(com, _T("CLOSE"))) {
00591 if (child) SendKeyActionTapAlt(VK_F4);
00592 else SendKeyActionTapCtrl(VK_F4);
00593 }
00594
00595 else {
00596 return FALSE;
00597 }
00598
00599 return TRUE;
00600 }
00601
00602
00603
00604
00606
00607
00608 static TCHAR* MouseCursolTable[] = {
00609 IDC_APPSTARTING,
00610 IDC_ARROW,
00611 IDC_CROSS,
00612 IDC_HAND,
00613 IDC_HELP,
00614 IDC_IBEAM,
00615 IDC_NO,
00616 IDC_SIZEALL,
00617 IDC_SIZENESW,
00618 IDC_SIZENS,
00619 IDC_SIZENWSE,
00620 IDC_SIZEWE,
00621 IDC_UPARROW,
00622 IDC_WAIT,
00623 IDI_APPLICATION,
00624 IDI_ASTERISK,
00625 IDI_EXCLAMATION,
00626 IDI_HAND,
00627 IDI_QUESTION,
00628 IDI_WINLOGO,
00629 NULL
00630 };
00631
00632
00633
00634 TCHAR* jbxwl::GetMouseCursorType()
00635 {
00636 CURSORINFO ci;
00637
00638 ci.cbSize = sizeof(CURSORINFO);
00639 GetCursorInfo(&ci);
00640
00641 if (ci.flags!=0) {
00642 TCHAR** table = MouseCursolTable;
00643 while (*table!=NULL) {
00644 if (ci.hCursor==LoadCursor(NULL, (LPTSTR)*table)) return *table;
00645 table++;
00646 }
00647 return NULL;
00648 }
00649
00650 return NULL;
00651 }
00652
00653
00654
00655
00657
00658
00659
00660 unsigned short jbxwl::GetMsecondsTimer()
00661 {
00662 SYSTEMTIME tm;
00663 GetLocalTime(&tm);
00664
00665 unsigned short nm = tm.wSecond*(unsigned short)1000 + tm.wMilliseconds;
00666 return nm;
00667 }
00668
00669
00670
00671
00672
00673
00674
00675
00676 unsigned short jbxwl::GetMsecondsLapTimer(unsigned short pm, unsigned short* nt)
00677 {
00678 SYSTEMTIME tm;
00679 GetLocalTime(&tm);
00680
00681 unsigned short nm = tm.wSecond*(unsigned short)1000 + tm.wMilliseconds;
00682 unsigned short ret;
00683 if (pm>nm) ret = nm + ((unsigned short)60000 - pm);
00684 else ret = nm - pm;
00685
00686 if (nt!=NULL) *nt = nm;
00687 return ret;
00688 }
00689
00690
00691
00692
00694
00695
00696
00697 void jbxwl::WinSystem(char* command, DWORD flag, BOOL wait)
00698 {
00699 STARTUPINFOA sinfo;
00700 PROCESS_INFORMATION pinfo;
00701
00702 memset(&sinfo, 0, sizeof(STARTUPINFO));
00703 sinfo.cb = sizeof(STARTUPINFO);
00704
00705
00706 CreateProcessA(NULL, (LPSTR)command, NULL, NULL, FALSE, flag, NULL, NULL, (LPSTARTUPINFOA)&sinfo, &pinfo);
00707
00708 CloseHandle(pinfo.hThread);
00709 if (wait) WaitForSingleObject(pinfo.hProcess, INFINITE);
00710 CloseHandle(pinfo.hProcess);
00711
00712 return;
00713 }
00714
00715
00716
00717
00719
00720
00721 EventHandler::EventHandler(void)
00722 {
00723 m_handle = NULL;
00724 m_wait_err = 0;
00725 }
00726
00727
00728 EventHandler::EventHandler(BOOL manual, BOOL initial, LPCTSTR hname, LPSECURITY_ATTRIBUTES sec)
00729 {
00730 m_handle = NULL;
00731 m_wait_err = 0;
00732 create(manual, initial, hname, sec);
00733 }
00734
00735
00736
00737 void EventHandler::clear(void)
00738 {
00739 if (m_handle!=NULL) {
00740 CloseHandle(m_handle);
00741 m_handle = NULL;
00742 }
00743 m_wait_err = 0;
00744
00745 return;
00746 }
00747
00748
00749
00750 HANDLE EventHandler::create(BOOL manual, BOOL initial, LPCTSTR hname, LPSECURITY_ATTRIBUTES secu)
00751 {
00752 if (m_handle!=NULL) return NULL;
00753
00754 m_handle = CreateEvent(secu, manual, initial, hname);
00755 return m_handle;
00756 }
00757
00758
00759
00769 BOOL EventHandler::wait(DWORD msec)
00770 {
00771 m_wait_err = WAIT_FAILED;
00772 if (m_handle==NULL) return FALSE;
00773
00774 m_wait_err = WaitForSingleObject(m_handle, msec);
00775
00776 if (m_wait_err!=WAIT_OBJECT_0) return FALSE;
00777 return TRUE;
00778 }
00779
00780
00781
00782 BOOL EventHandler::wait(HANDLE handle, DWORD msec)
00783 {
00784 m_wait_err = WAIT_FAILED;
00785 if (handle==NULL) return FALSE;
00786
00787 m_wait_err = WaitForSingleObject(handle, msec);
00788
00789 if (m_wait_err!=WAIT_OBJECT_0) return FALSE;
00790 return TRUE;
00791 }
00792
00793
00794
00795
00797
00798
00799 int jbxwl::MessageDLG(LPCTSTR ttl, LPCTSTR msg, UINT type, HWND hWnd)
00800 {
00801 int ret = ::MessageBox(hWnd, msg, ttl, type);
00802 return ret;
00803 }
00804
00805