--- /dev/null
+/*
+ * Regedit main function
+ *
+ * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */
+#include <windows.h>
+#include <commctrl.h>
+#include <stdlib.h>
+#include <tchar.h>
+#include <process.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#define REGEDIT_DECLARE_FUNCTIONS
+#include "main.h"
+
+
+BOOL ProcessCmdLine(LPSTR lpCmdLine);
+
+
+/*******************************************************************************
+ * Global Variables:
+ */
+
+HINSTANCE hInst;
+HWND hFrameWnd;
+HWND hStatusBar;
+HMENU hMenuFrame;
+UINT nClipboardFormat;
+LPCTSTR strClipboardFormat = _T("TODO: SET CORRECT FORMAT");
+
+
+TCHAR szTitle[MAX_LOADSTRING];
+TCHAR szFrameClass[MAX_LOADSTRING];
+TCHAR szChildClass[MAX_LOADSTRING];
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: DynamicBind( void )
+ *
+ * PURPOSE: Binds all functions dependent on user32.dll
+ */
+static BOOL DynamicBind( void )
+{
+ HMODULE dll;
+
+#define d(x) \
+ p##x = (typeof (x) ) GetProcAddress( dll, #x ); \
+ if( ! p##x ) \
+ { \
+ fprintf(stderr,"failed to bind function at line %d\n",__LINE__); \
+ return FALSE; \
+ } \
+
+
+ dll = LoadLibrary("user32");
+ if( !dll )
+ return FALSE;
+
+ d(BeginDeferWindowPos)
+ d(BeginPaint)
+ d(CallWindowProcA)
+ d(CheckMenuItem)
+ d(CloseClipboard)
+ d(CreateWindowExA)
+ d(DefWindowProcA)
+ d(DeferWindowPos)
+ d(DestroyMenu)
+ d(DestroyWindow)
+ d(DialogBoxParamA)
+ d(DispatchMessageA)
+ d(EmptyClipboard)
+ d(EndDeferWindowPos)
+ d(EndDialog)
+ d(EndPaint)
+ d(FillRect)
+ d(GetCapture)
+ d(GetClientRect)
+ d(GetCursorPos)
+ d(GetDC)
+ d(GetDlgItem)
+ d(GetMenu)
+ d(GetMessageA)
+ d(GetSubMenu)
+ d(GetSystemMetrics)
+ d(InvertRect)
+ d(IsWindowVisible)
+ d(LoadAcceleratorsA)
+ d(LoadBitmapA)
+ d(LoadCursorA)
+ d(LoadIconA)
+ d(LoadImageA)
+ d(LoadMenuA)
+ d(LoadStringA)
+ d(MessageBeep)
+ d(MoveWindow)
+ d(OpenClipboard)
+ d(PostQuitMessage)
+ d(RegisterClassExA)
+ d(RegisterClipboardFormatA)
+ d(ReleaseCapture)
+ d(ReleaseDC)
+ d(ScreenToClient)
+ d(SendMessageA)
+ d(SetCapture)
+ d(SetCursor)
+ d(SetFocus)
+ d(SetWindowLongA)
+ d(SetWindowTextA)
+ d(ShowWindow)
+ d(TranslateAccelerator)
+ d(TranslateMessage)
+ d(UpdateWindow)
+ d(WinHelpA)
+ d(wsprintfA)
+
+ dll = LoadLibrary("gdi32");
+ if( !dll )
+ return FALSE;
+
+ d(DeleteDC)
+ d(DeleteObject)
+ d(GetStockObject)
+
+ dll = LoadLibrary("comctl32");
+ if( !dll )
+ return FALSE;
+
+ d(CreateStatusWindowA)
+ d(ImageList_Add)
+ d(ImageList_Create)
+ d(ImageList_GetImageCount)
+ d(InitCommonControls)
+
+ dll = LoadLibrary("comdlg32");
+ if( !dll )
+ return FALSE;
+
+ d(CommDlgExtendedError)
+ d(GetOpenFileNameA)
+ d(GetSaveFileNameA)
+ d(PrintDlgA)
+
+ return TRUE;
+}
+
+/*******************************************************************************
+ *
+ *
+ * FUNCTION: InitInstance(HANDLE, int)
+ *
+ * PURPOSE: Saves instance handle and creates main window
+ *
+ * COMMENTS:
+ *
+ * In this function, we save the instance handle in a global variable and
+ * create and display the main program window.
+ */
+
+BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
+{
+ WNDCLASSEX wcFrame = {
+ sizeof(WNDCLASSEX),
+ CS_HREDRAW | CS_VREDRAW/*style*/,
+ FrameWndProc,
+ 0/*cbClsExtra*/,
+ 0/*cbWndExtra*/,
+ hInstance,
+ LoadIcon(hInstance, MAKEINTRESOURCE(IDI_REGEDIT)),
+ LoadCursor(0, IDC_ARROW),
+ 0/*hbrBackground*/,
+ 0/*lpszMenuName*/,
+ szFrameClass,
+ (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_REGEDIT), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED)
+ };
+ ATOM hFrameWndClass = RegisterClassEx(&wcFrame); /* register frame window class */
+
+ WNDCLASSEX wcChild = {
+ sizeof(WNDCLASSEX),
+ CS_HREDRAW | CS_VREDRAW/*style*/,
+ ChildWndProc,
+ 0/*cbClsExtra*/,
+ sizeof(HANDLE)/*cbWndExtra*/,
+ hInstance,
+ LoadIcon(hInstance, MAKEINTRESOURCE(IDI_REGEDIT)),
+ LoadCursor(0, IDC_ARROW),
+ 0/*hbrBackground*/,
+ 0/*lpszMenuName*/,
+ szChildClass,
+ (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_REGEDIT), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED)
+
+ };
+ ATOM hChildWndClass = RegisterClassEx(&wcChild); /* register child windows class */
+ hChildWndClass = hChildWndClass; /* warning eater */
+
+ hMenuFrame = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_REGEDIT_MENU));
+
+ /* Initialize the Windows Common Controls DLL */
+ InitCommonControls();
+
+ nClipboardFormat = RegisterClipboardFormat(strClipboardFormat);
+ /* if (nClipboardFormat == 0) {
+ DWORD dwError = GetLastError();
+ } */
+
+ hFrameWnd = CreateWindowEx(0, (LPCTSTR)(int)hFrameWndClass, szTitle,
+ WS_OVERLAPPEDWINDOW | WS_EX_CLIENTEDGE,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ NULL, hMenuFrame, hInstance, NULL/*lpParam*/);
+
+ if (!hFrameWnd) {
+ return FALSE;
+ }
+
+ /* Create the status bar */
+ hStatusBar = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS,
+ _T(""), hFrameWnd, STATUS_WINDOW);
+ if (hStatusBar) {
+ /* Create the status bar panes */
+ SetupStatusBar(hFrameWnd, FALSE);
+ CheckMenuItem(GetSubMenu(hMenuFrame, ID_VIEW_MENU), ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
+ }
+ ShowWindow(hFrameWnd, nCmdShow);
+ UpdateWindow(hFrameWnd);
+ return TRUE;
+}
+
+/******************************************************************************/
+
+void ExitInstance(void)
+{
+ DestroyMenu(hMenuFrame);
+}
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+ HACCEL hAccel;
+/*
+ int hCrt;
+ FILE *hf;
+ AllocConsole();
+ hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
+ hf = _fdopen(hCrt, "w");
+ *stdout = *hf;
+ setvbuf(stdout, NULL, _IONBF, 0);
+
+ wprintf(L"command line exit, hInstance = %d\n", hInstance);
+ getch();
+ FreeConsole();
+ return 0;
+ */
+
+ if (ProcessCmdLine(lpCmdLine)) {
+ return 0;
+ }
+
+ if (!DynamicBind()) {
+ return 0;
+ }
+
+ /* Initialize global strings */
+ LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+ LoadString(hInstance, IDC_REGEDIT_FRAME, szFrameClass, MAX_LOADSTRING);
+ LoadString(hInstance, IDC_REGEDIT, szChildClass, MAX_LOADSTRING);
+
+ /* Store instance handle in our global variable */
+ hInst = hInstance;
+
+ /* Perform application initialization */
+ if (!InitInstance(hInstance, nCmdShow)) {
+ return FALSE;
+ }
+ hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDC_REGEDIT);
+
+ /* Main message loop */
+ while (GetMessage(&msg, (HWND)NULL, 0, 0)) {
+ if (!TranslateAccelerator(msg.hwnd, hAccel, &msg)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+ ExitInstance();
+ return msg.wParam;
+}