windows-nt/Source/XPSP1/NT/base/mvdm/wow16/regedit/regmain.c
2020-09-26 16:20:57 +08:00

519 lines
12 KiB
C

#define WIN31
#include <windows.h>
#include "RegEdit.h"
#include "SDKRegEd.h"
/*********************************************************/
/******************* Globals *****************************/
/*********************************************************/
char szAppName[] = "Registration Editor" ;
char szSDKRegEd[] = "SDKRegEd";
char *pszLongName;
char *pszOutOfMemory;
extern char szNull[];
HANDLE hInstance;
HWND hWndMain, hWndDlg = NULL, hWndHelp;
LPSTR lpCmdLine;
WORD wCmdFlags, wHelpMenuItem, wHelpId, wHelpMain;
LONG (FAR PASCAL *lpfnEditor)(HWND, WORD, WORD, LONG);
FARPROC lpOldHook;
FARPROC lpMainWndDlg = NULL;
WORD wHelpIndex;
HANDLE hAcc;
BOOL fOpenError = FALSE;
/*********************************************************/
/******************* Functions ***************************/
/*********************************************************/
unsigned long NEAR PASCAL RetSetValue(HKEY hKey, PSTR pSubKey, PSTR pVal)
{
return(RegSetValue(hKey, pSubKey, REG_SZ, pVal, 0L));
}
#ifndef REGLOAD
unsigned long NEAR PASCAL WriteThroughSetValue(HKEY hKey, PSTR pSubKey,
PSTR pVal)
{
long lRet;
if (!(lRet=RegSetValue(hKey, pSubKey, REG_SZ, pVal, 0L)))
lRet = SDKSetValue(hKey, pSubKey, pVal);
return(lRet);
}
#endif
unsigned long (NEAR PASCAL *lpfnSetValue)(HKEY, PSTR, PSTR) = RetSetValue;
unsigned long NEAR PASCAL MySetValue(HKEY hKey, PSTR pSubKey, PSTR pVal)
{
return((*lpfnSetValue)(hKey, pSubKey, pVal));
}
VOID NEAR PASCAL GetCommandFlags(void)
{
wCmdFlags = 0;
while(1) {
/* skip spaces */
while(*lpCmdLine == ' ')
++lpCmdLine;
/* check if this is a command line switch */
if(*lpCmdLine!='/' && *lpCmdLine!='-')
break;
++lpCmdLine;
/* set known flags */
while(*lpCmdLine && *lpCmdLine!=' ') {
switch(*lpCmdLine) {
case('s'): /* for silent */
case('S'): /* for silent */
wCmdFlags |= FLAG_SILENT;
break;
case('v'): /* use tree editor */
case('V'): /* use tree editor */
wCmdFlags |= FLAG_VERBOSE;
break;
case('u'): /* update, don't overwrite existing path entries */
case('U'): /* in shell\open\command or shell\open\print */
wCmdFlags |= FLAG_LEAVECOMMAND;
break;
}
lpCmdLine = AnsiNext(lpCmdLine);
}
}
}
#ifndef REGLOAD
long FAR PASCAL WndProc(HWND hWnd, WORD wMessage, WORD wParam, LONG lParam)
{
static HANDLE hCustRegs = NULL;
HCURSOR oldCursor;
switch(wMessage) {
case WM_ACTIVATE:
if(wParam) {
hWndHelp = hWnd;
SetFocus(hWndDlg);
}
break;
case WM_CREATE:
{
RECT rcWnd, rcClt;
DragAcceptFiles(hWnd, TRUE);
lpfnEditor(hWnd, wMessage, wParam, lParam);
if((rcWnd.right=MyGetProfileInt(IDS_SHORTNAME, IDS_WIDTH, 0))<=0 ||
(rcWnd.bottom=MyGetProfileInt(IDS_SHORTNAME, IDS_HEIGHT, 0))<=0) {
GetWindowRect(hWndDlg, &rcWnd);
rcWnd.right -= rcWnd.left;
rcWnd.bottom -= rcWnd.top;
}
GetClientRect(hWnd, &rcClt);
rcClt.right -= rcWnd.right;
rcClt.bottom -= rcWnd.bottom;
GetWindowRect(hWnd, &rcWnd);
SetWindowPos(hWnd, NULL, 0, 0, rcWnd.right-rcWnd.left-rcClt.right,
rcWnd.bottom-rcWnd.top-rcClt.bottom, SWP_NOMOVE | SWP_NOZORDER);
return(DefWindowProc(hWnd, wMessage, wParam, lParam));
}
case WM_CLOSE:
case WM_QUERYENDSESSION:
{
HKEY hKeyRoot;
WORD wErrMsg;
int nReturn;
if(!fOpenError) {
if(!lpfnEditor(hWnd, wMessage, wParam, lParam))
return(0L);
if(RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKeyRoot) == ERROR_SUCCESS) {
if(wErrMsg=GetErrMsg((WORD)RegCloseKey(hKeyRoot))) {
PSTR pError;
if(pError=(PSTR)MyLoadString(wErrMsg, NULL, LMEM_FIXED)) {
nReturn = MyMessageBox(hWnd, IDS_ENDERROR,
MB_YESNO|MB_ICONHAND|MB_SYSTEMMODAL, lstrlen(pError),
(LPSTR)pError);
LocalFree((HANDLE)pError);
} else
/* Notice the flags are ignored for OOM
*/
nReturn = MyMessageBox(hWnd, IDS_OUTOFMEMORY,
MB_OK|MB_ICONHAND|MB_SYSTEMMODAL, 0);
if(nReturn != IDYES)
return(0L);
}
}
}
return(DefWindowProc(hWnd, wMessage, wParam, lParam));
}
case WM_DESTROY:
if(hWndDlg)
DestroyWindow(hWndDlg);
if(lpMainWndDlg)
FreeProcInstance(lpMainWndDlg);
#ifndef NOHELP
WinHelp(hWnd, NULL, HELP_QUIT, 0L);
#endif
DragAcceptFiles(hWnd, FALSE);
PostQuitMessage(0);
break;
case WM_SIZE:
{
RECT rcDlg, rcWnd;
int hgt;
if(wParam == SIZEICONIC)
break;
if(!hWndDlg) {
/* This should only happen during the create message
*/
PostMessage(hWnd, wMessage, wParam, lParam);
break;
}
if(wParam == SIZENORMAL) {
WriteProfileInt(IDS_SHORTNAME, IDS_WIDTH, LOWORD(lParam));
WriteProfileInt(IDS_SHORTNAME, IDS_HEIGHT, HIWORD(lParam));
}
hgt = HIWORD(lParam);
SetWindowPos(hWndDlg, NULL, 0, 0, LOWORD(lParam), hgt, SWP_NOZORDER);
GetWindowRect(hWndDlg, &rcDlg);
ScreenToClient(hWnd, (POINT *)(&rcDlg) + 1);
if((WORD)rcDlg.bottom != HIWORD(lParam)) {
GetWindowRect(hWnd, &rcWnd);
SetWindowPos(hWnd, NULL, 0, 0, rcWnd.right-rcWnd.left,
rcWnd.bottom-rcWnd.top-HIWORD(lParam)+rcDlg.bottom,
SWP_NOMOVE | SWP_NOZORDER);
}
break;
}
case WM_DROPFILES:
{
int result, i, nFileName;
HANDLE hFileName;
WORD wFlags;
wFlags = (GetKeyState(VK_CONTROL)&0x8000) ? FLAG_SILENT : 0;
lpfnEditor(hWnd, wMessage, wParam, lParam);
for(result=DragQueryFile(wParam, (UINT)-1, NULL, 0), i=0; i<result; ++i) {
if(!(hFileName=GlobalAlloc(GMEM_MOVEABLE,
(DWORD)(nFileName=DragQueryFile(wParam, i, NULL, 0)+1))))
continue;
DragQueryFile(wParam, i, GlobalLock(hFileName), nFileName);
GlobalUnlock(hFileName);
SendMessage(hWnd, WM_COMMAND, ID_FINISHMERGE,
MAKELONG(hFileName,wFlags));
}
DragFinish(wParam);
return(TRUE);
}
case WM_COMMAND:
oldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
switch(wParam) {
case ID_HELP:
if(HIWORD(lParam)==MSGF_MENU && IsWindowEnabled(hWnd)
&& wHelpMenuItem) {
WORD m = wHelpMenuItem;
/* Get outta menu mode if help for a menu item */
SendMessage(hWnd, WM_CANCELMODE, 0, 0L);
MyHelp(hWnd, HELP_CONTEXT, m);
}
break;
case ID_FINISHMERGE:
{
unsigned long (NEAR PASCAL *lpfnSave)(HKEY, PSTR, PSTR);
/* If there was a file selected then merge it; otherwise,
* just let lpfnEditor do its cleanup (at the end of the switch)
*/
if (LOWORD(lParam)) {
lpfnSave = lpfnSetValue;
if (HIWORD(lParam)&FLAG_WRITETHROUGH && lpfnSetValue==SDKSetValue)
lpfnSetValue = WriteThroughSetValue;
lpfnEditor(hWnd, WM_COMMAND, ID_MERGEFILE, 0L);
ProcessFiles(GetLastActivePopup(hWnd), LOWORD(lParam),
HIWORD(lParam));
lpfnSetValue = lpfnSave;
}
break;
}
case ID_MERGEFILE:
{
HANDLE hPath;
lpfnEditor(hWnd, wMessage, wParam, lParam);
wHelpId = IDW_OPENREG;
if(!DoFileOpenDlg(hWnd, IDS_MERGETITLE, IDS_REGS, IDS_CUSTREGS,
&hCustRegs, &hPath, TRUE))
hPath = NULL;
SendMessage(hWnd, WM_COMMAND, ID_FINISHMERGE, MAKELONG(hPath, 0));
return(TRUE);
}
case ID_WRITEFILE:
{
HANDLE hPath;
wHelpId = IDW_SAVEREG;
if(DoFileOpenDlg(hWnd, IDS_WRITETITLE, IDS_REGS, IDS_CUSTREGS,
&hCustRegs, &hPath, FALSE))
lParam = (LONG)hPath;
else
lParam = NULL;
break;
}
case ID_EXIT:
PostMessage(hWnd, WM_CLOSE, 0, 0L);
break;
case ID_HELPINDEX:
MyHelp(hWnd, HELP_CONTEXT, wHelpIndex);
break;
case ID_HELPSEARCH:
MyHelp(hWnd, HELP_PARTIALKEY, (DWORD)(LPSTR)"");
break;
case ID_HELPUSINGHELP:
MyHelp(hWnd, HELP_HELPONHELP, 0);
break;
case ID_ABOUT:
{
HANDLE hShortName, hDesc;
if(!(hShortName=MyLoadString(IDS_MEDIUMNAME, NULL, LMEM_MOVEABLE)))
goto Error3_1;
if(!(hDesc=MyLoadString(IDS_DESCRIPTION, NULL, LMEM_MOVEABLE)))
goto Error3_2;
ShellAbout(hWnd, LocalLock(hShortName), LocalLock(hDesc),
LoadIcon(hInstance, MAKEINTRESOURCE(MAINICON)));
LocalUnlock(hDesc);
LocalUnlock(hShortName);
LocalFree(hDesc);
Error3_2:
LocalFree(hShortName);
Error3_1:
break;
}
default:
break;
}
SetCursor(oldCursor);
break;
case WM_MENUSELECT:
if(LOWORD(lParam)&MF_POPUP)
wHelpMenuItem = 0;
else if(LOWORD(lParam)&MF_SYSMENU)
wHelpMenuItem = IDH_SYSMENU;
else
wHelpMenuItem = wHelpMain+wParam;
break;
default:
break;
}
return(lpfnEditor(hWnd, wMessage, wParam, lParam));
}
BOOL NEAR PASCAL CreateMainWindow(void)
{
WNDCLASS wndclass;
wndclass.style = 0;
wndclass.lpfnWndProc = (WNDPROC)WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(MAINICON));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = COLOR_APPWORKSPACE + 1;
wndclass.lpszClassName = szAppName;
if(wCmdFlags&FLAG_VERBOSE) {
wndclass.lpszMenuName = MAKEINTRESOURCE(SDKMAINMENU);
lpfnEditor = SDKMainWnd;
lpfnSetValue = SDKSetValue;
wHelpMain = IDW_SDKMAIN;
wHelpIndex = IDW_SDKMAIN + 0x0100 + ID_HELPINDEX;
} else {
wndclass.lpszMenuName = MAKEINTRESOURCE(MAINMENU);
lpfnEditor = MainWnd;
wHelpMain = IDW_MAIN;
wHelpIndex = IDW_MAIN + 0x0100 + ID_HELPINDEX;
}
return(RegisterClass(&wndclass)
&& (hWndMain=CreateWindow(szAppName, pszLongName,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL)));
}
#endif
int PASCAL WinMain (HANDLE hInst, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
HANDLE hTemp, hCmd = NULL;
#ifndef REGLOAD
FARPROC lpMessageFilter;
MSG msg;
VOID (FAR PASCAL *lpfnRegisterPenApp)(WORD, BOOL) = NULL;
#endif
hInstance = hInst;
lpCmdLine = lpszCmdLine;
GetCommandFlags();
if(!(hTemp=MyLoadString(IDS_LONGNAME, NULL, LMEM_FIXED)))
return(FALSE);
pszLongName = LocalLock(hTemp);
if(!(hTemp=MyLoadString(IDS_OUTOFMEMORY, NULL, LMEM_FIXED)))
return(FALSE);
pszOutOfMemory = LocalLock(hTemp);
if(*lpCmdLine && !(hCmd=StringToHandle(lpCmdLine)))
return(FALSE);
#ifdef REGLOAD
if ((hTemp=GetModuleHandle("REGEDIT")) > 1) {
PSTR pLocal;
WORD wFileLen = 130;
WORD wCmdLen = lstrlen(lpCmdLine) + 1;
while(1) {
if(!(pLocal=(PSTR)LocalAlloc(LMEM_FIXED, wFileLen+wCmdLen))) {
MyMessageBox(NULL, IDS_OUTOFMEMORY,
MB_OK|MB_ICONHAND|MB_SYSTEMMODAL, 0);
return(FALSE);
}
if(GetModuleFileName(hTemp, pLocal, wFileLen) < (int)wFileLen-5)
break;
LocalFree((HANDLE)pLocal);
wFileLen += 130;
}
lstrcat(pLocal, " ");
lstrcat(pLocal, lpCmdLine);
return(WinExec(pLocal, SW_SHOWNORMAL) > 32);
}
#else
if(hPrevInstance) {
GetInstanceData(hPrevInstance, (PSTR)&hWndMain, sizeof(hWndMain));
if(hCmd)
PostMessage(hWndMain, WM_COMMAND, ID_FINISHMERGE,
MAKELONG(hCmd, wCmdFlags | FLAG_WRITETHROUGH));
else {
SetWindowPos(hWndMain, NULL, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
if(IsIconic(hWndMain))
ShowWindow(hWndMain, SW_RESTORE);
else
SetActiveWindow(GetLastActivePopup(hWndMain));
}
return(TRUE);
}
#endif
if(hCmd) {
ProcessFiles(NULL, hCmd, wCmdFlags);
return(TRUE);
}
#ifdef REGLOAD
return(TRUE);
#else
if(!CreateMainWindow())
return(FALSE);
if(fOpenError)
PostMessage(hWndMain, WM_COMMAND, ID_EXIT, 0L);
else {
ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);
}
if(lpMessageFilter=MakeProcInstance(MessageFilter, hInstance))
lpOldHook = SetWindowsHook(WH_MSGFILTER, lpMessageFilter);
hAcc = LoadAccelerators(hInstance, wCmdFlags&FLAG_VERBOSE ?
szSDKRegEd : "RegEdit");
if (lpfnRegisterPenApp = (VOID (FAR PASCAL *)(WORD, BOOL))GetProcAddress(GetSystemMetrics(SM_PENWINDOWS),
"RegisterPenApp"))
(*lpfnRegisterPenApp)(1, TRUE);
while(GetMessage(&msg, NULL, 0, 0)) {
if(!hAcc || !TranslateAccelerator(hWndMain, hAcc, &msg)) {
if(!hWndDlg || !IsDialogMessage(hWndDlg, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
if (lpfnRegisterPenApp)
(*lpfnRegisterPenApp)(1, FALSE);
if(lpMessageFilter) {
UnhookWindowsHook(WH_MSGFILTER, lpMessageFilter);
FreeProcInstance(lpMessageFilter);
}
return(msg.wParam);
#endif
}