Listing 3: main.c Demo program source
// main.c #define UNICODE #define _UNICODE #include <windows.h> #include "main.h" #include "symlink.h" BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM); VOID Init(LPTSTR, LPTSTR, DWORD, DWORD); BOOL Refresh(HWND); HINSTANCE hInst; HKEY ghLinkKey; //----------------------------------------------------------------- int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { hInst = hInstance; // Create some dummy keys to test symbolic links Init(TEXT("Software\\PaulaT\\A"), TEXT("AAA"), 8, 1); Init(TEXT("Software\\PaulaT\\B"), TEXT("BBB"), 8, 2); Init(TEXT("Software\\PaulaT\\C"), TEXT("CCC"), 8, 3); return DialogBox(hInst, MAKEINTRESOURCE(SYMLINK_DLG), NULL, MainDlgProc); } // WinMain //----------------------------------------------------------------- void Init(LPTSTR szKey, LPTSTR sz, DWORD size, DWORD dw) { HKEY hKey; DWORD status; status = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, 0); if (status == ERROR_SUCCESS) { RegSetValueEx(hKey,TEXT("Val1"),0,REG_SZ,(LPBYTE)sz,size); RegSetValueEx(hKey,TEXT("Val2"),0,REG_DWORD,(LPBYTE)&dw,4); RegCloseKey(hKey); } } // Init //----------------------------------------------------------------- int CALLBACK MainDlgProc(HWND hDlg, UINT Message,WPARAM wParam, LPARAM lParam) { DWORD status; switch (Message) { case WM_INITDIALOG: status = CreateSymLinkKey(HKEY_LOCAL_MACHINE, TEXT("Software\\PaulaT"), TEXT("Current"), &ghLinkKey); if (status != ERROR_SUCCESS) { EnableWindow(GetDlgItem(hDlg, ID_MODE_A), FALSE); EnableWindow(GetDlgItem(hDlg, ID_MODE_B), FALSE); EnableWindow(GetDlgItem(hDlg, ID_MODE_C), FALSE); Refresh(hDlg); } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_MODE_A: SetSymLink(ghLinkKey, HKEY_LOCAL_MACHINE, TEXT("Software\\PaulaT\\A")); Refresh(hDlg); break; case ID_MODE_B: SetSymLink(ghLinkKey, HKEY_LOCAL_MACHINE, TEXT("Software\\PaulaT\\B")); Refresh(hDlg); break; case ID_MODE_C: SetSymLink(ghLinkKey, HKEY_LOCAL_MACHINE, TEXT("Software\\PaulaT\\C")); Refresh(hDlg); break; } break; case WM_CLOSE: EndDialog(hDlg, 1); break; default: return FALSE; } return FALSE; } // MainDlgProc //----------------------------------------------------------------- BOOL Refresh(HWND hDlg) { HKEY hKey = NULL; DWORD status, t, s, dw2 = 0; TCHAR sz1[MAX_PATH]; status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\PaulaT\\Current"), 0, KEY_READ, &hKey); if (status == ERROR_SUCCESS) { s = MAX_PATH * sizeof(TCHAR); RegQueryValueEx(hKey,TEXT("Val1"),0,&t,(LPBYTE)sz1,&s); SetDlgItemText(hDlg,ID_VAL_1,sz1); s = sizeof(DWORD); RegQueryValueEx(hKey,TEXT("Val2"),0,&t,(LPBYTE)&dw2,&s); SetDlgItemInt(hDlg,ID_VAL_2,dw2,FALSE); RegCloseKey(hKey); return TRUE; } return FALSE; } // Refresh //End of File