// // about.cpp // // About dialog box // #include "pch.hxx" #include "resource.h" #include "strconst.h" #include // must be last! // Please keep this list in alphabetical order static const TCHAR *rgszDll[] = { "acctres.dll", "comctl32.dll", "csapi3t1.dll", "directdb.dll", "inetcomm.dll", "inetres.dll", "mapi32.dll", "mshtml.dll", "msident.dll", "msoe.dll", "msoeacct.dll", "msoeres.dll", "msoert2.dll", "oeimport.dll", "ole32.dll", "riched20.dll", "riched32.dll", "wab32.dll", "wab32res.dll", "wldap32.dll", }; static const TCHAR *rgszVer[] = { // "FileDescription", "FileVersion", "LegalCopyright", }; #define NUM_DLLS (sizeof(rgszDll)/sizeof(char *)) INT_PTR CALLBACK AboutAthena(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: { RECT rcOwner, rc; char szGet[MAX_PATH]; TCHAR szPath[MAX_PATH], szRes[CCHMAX_STRINGRES], szRes2[CCHMAX_STRINGRES]; DWORD dwVerInfoSize, dwVerHnd; LPSTR lpInfo, lpVersion, lpszT; LPWORD lpwTrans; UINT uLen; int i,j, cItems = 0; LV_ITEM lvi; LV_COLUMN lvc; HWND hwndList; HMODULE hDll; LPTSTR pszFileName; // If the caller passed an icon id in the LPARAM, use it // SendDlgItemMessage(hdlg, idcStatic1, STM_SETICON, // (WPARAM) LoadIcon(g_hLocRes, MAKEINTRESOURCE(lp)), 0); // center dialog GetWindowRect(GetWindowOwner(hdlg), &rcOwner); GetWindowRect(hdlg, &rc); SetWindowPos(hdlg, NULL, (rcOwner.left+rcOwner.right-(rc.right-rc.left))/2, (rcOwner.top+rcOwner.bottom-(rc.bottom-rc.top))/2, 0, 0, SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE); // Do some groovy color things COLORMAP cm[] = { { RGB(255, 0, 255), GetSysColor(COLOR_BTNFACE) } }; HBITMAP hbm; hbm = CreateMappedBitmap(g_hLocRes, idbOELogo, 0, cm, ARRAYSIZE(cm)); if (hbm) SendDlgItemMessage(hdlg, IDC_OE_LOGO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbm); hbm = CreateMappedBitmap(g_hLocRes, idbWindowsLogo, 0, cm, ARRAYSIZE(cm)); if (hbm) SendDlgItemMessage(hdlg, IDC_WINDOWS_LOGO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbm); // Load some descriptive text for the build (Beta X) //AthLoadString(idsBeta2BuildStr, szRes, ARRAYSIZE(szRes)); // Get version information from our .exe stub if (GetExePath(c_szMainExe, szPath, sizeof(szPath), FALSE)) { if (dwVerInfoSize = GetFileVersionInfoSize(szPath, &dwVerHnd)) { if (lpInfo = (LPSTR)GlobalAlloc(GPTR, dwVerInfoSize)) { if (GetFileVersionInfo(szPath, dwVerHnd, dwVerInfoSize, lpInfo)) { if (VerQueryValue(lpInfo, "\\VarFileInfo\\Translation", (LPVOID *)&lpwTrans, &uLen) && uLen >= (2 * sizeof(WORD))) { // set up buffer for calls to VerQueryValue() wnsprintf(szGet, ARRAYSIZE(szGet), "\\StringFileInfo\\%04X%04X\\", lpwTrans[0], lpwTrans[1]); lpszT = szGet + lstrlen(szGet); // Walk through the dialog items that we want to replace: for (i = IDC_VERSION_STAMP; i <= IDC_MICROSOFT_COPYRIGHT; i++) { j = i - IDC_VERSION_STAMP; StrCpyN(lpszT, rgszVer[j], ARRAYSIZE(szGet)-lstrlen(szGet)); if (VerQueryValue(lpInfo, szGet, (LPVOID *)&lpVersion, &uLen) && uLen) { // DON'T overwrite their lpVersion buffer StrCpyN(szRes2, lpVersion, ARRAYSIZE(szRes2)); // Special case, append string explaining build number #ifdef DEBUG if (0 == j) StrCatBuff(szRes2, " [DEBUG]", ARRAYSIZE(szRes2)); #endif #if defined(RELEASE_BETA) if (1 == j) StrCatBuff(szRes2, szRes, ARRAYSIZE(szRes2)); #endif SetDlgItemText(hdlg, i, szRes2); } } } } GlobalFree((HGLOBAL)lpInfo); } } } else AssertSz(FALSE, "Probable setup issue: Couldn't find our App Path"); hwndList = GetDlgItem(hdlg, IDC_COMPONENT_LIST); // setup columns lvc.mask = LVCF_TEXT; lvc.pszText = szRes; lvc.iSubItem = 0; AthLoadString(idsFile, szRes, ARRAYSIZE(szRes)); ListView_InsertColumn(hwndList, 0, &lvc); lvc.iSubItem = 1; AthLoadString(idsVersion, szRes, ARRAYSIZE(szRes)); ListView_InsertColumn(hwndList, 1, &lvc); lvc.iSubItem = 2; AthLoadString(idsFullPath, szRes, ARRAYSIZE(szRes)); ListView_InsertColumn(hwndList, 2, &lvc); lvi.mask = LVIF_TEXT; // Process each dll for (i=0; i= (2 * sizeof(WORD))) { // set up buffer for calls to VerQueryValue() wnsprintf(szGet, ARRAYSIZE(szGet), "\\StringFileInfo\\%04X%04X\\FileVersion", lpwTrans[0], lpwTrans[1]); if (VerQueryValue(lpInfo, szGet, (LPVOID *)&lpVersion, &uLen) && uLen) { StrCpyN(szRes, lpVersion, ARRAYSIZE(szRes)); } } } GlobalFree((HGLOBAL)lpInfo); } } // Version Info lvi.iSubItem = 1; if (NULL == szRes[0]) { AthLoadString(idsUnknown, szRes, ARRAYSIZE(szRes)); } lvi.pszText = szRes; ListView_SetItem(hwndList, &lvi); cItems++; } if (cItems) { ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 1, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 2, LVSCW_AUTOSIZE); } } break; case WM_COMMAND: if (GET_WM_COMMAND_ID(wp,lp) == IDOK || GET_WM_COMMAND_ID(wp,lp) == IDCANCEL) { EndDialog(hdlg, TRUE); return TRUE; } break; case WM_SYSCOLORCHANGE: { // Do some groovy color things COLORMAP cm[] = { { RGB(255, 0, 255), GetSysColor(COLOR_BTNFACE) } }; HBITMAP hbm; hbm = CreateMappedBitmap(g_hLocRes, idbOELogo, 0, cm, ARRAYSIZE(cm)); if (hbm) SendDlgItemMessage(hdlg, IDC_OE_LOGO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbm); hbm = CreateMappedBitmap(g_hLocRes, idbWindowsLogo, 0, cm, ARRAYSIZE(cm)); if (hbm) SendDlgItemMessage(hdlg, IDC_WINDOWS_LOGO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbm); break; } } return FALSE; }