4 * Copyright 2006 Piotr Caban
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 static WCHAR wszRegEdit
[] = { 'r','e','g','e','d','i','t','.','e','x','e','\0' };
26 INT_PTR CALLBACK
CreateInstOnProc(HWND hDlgWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
33 switch(LOWORD(wParam
)) {
35 memset(globals
.wszMachineName
, 0, sizeof(WCHAR
[MAX_LOAD_STRING
]));
36 hEdit
= GetDlgItem(hDlgWnd
, IDC_MACHINE
);
38 if (GetWindowTextLength(hEdit
)>0)
39 GetWindowText(hEdit
, globals
.wszMachineName
, MAX_LOAD_STRING
);
41 EndDialog(hDlgWnd
, IDOK
);
44 EndDialog(hDlgWnd
, IDCANCEL
);
52 void CopyClsid(HTREEITEM item
)
56 memset(&tvi
, 0, sizeof(TVITEM
));
58 tvi
.cchTextMax
= MAX_LOAD_STRING
;
59 SendMessage(globals
.hTree
, TVM_GETITEM
, 0, (LPARAM
)&tvi
);
61 if(OpenClipboard(globals
.hMainWnd
) && EmptyClipboard() && tvi
.lParam
)
63 HANDLE hClipData
= GlobalAlloc(GHND
, sizeof(WCHAR
[MAX_LOAD_STRING
]));
64 LPVOID pLoc
= GlobalLock(hClipData
);
66 lstrcpyW(pLoc
, ((ITEM_INFO
*)tvi
.lParam
)->clsid
);
67 GlobalUnlock(hClipData
);
68 hClipData
= SetClipboardData(CF_UNICODETEXT
, hClipData
);
73 void ResizeChild(void)
75 RECT client
, stat
, tool
;
77 MoveWindow(globals
.hStatusBar
, 0, 0, 0, 0, TRUE
);
78 MoveWindow(globals
.hToolBar
, 0, 0, 0, 0, TRUE
);
80 if(IsWindowVisible(globals
.hStatusBar
))
81 GetClientRect(globals
.hStatusBar
, &stat
);
84 if(IsWindowVisible(globals
.hToolBar
))
86 GetClientRect(globals
.hToolBar
, &tool
);
91 GetClientRect(globals
.hMainWnd
, &client
);
92 MoveWindow(globals
.hPaneWnd
, 0, tool
.bottom
,
93 client
.right
, client
.bottom
-tool
.bottom
-stat
.bottom
, TRUE
);
96 void RefreshMenu(HTREEITEM item
)
100 HMENU hMenu
= GetMenu(globals
.hMainWnd
);
102 memset(&tvi
, 0, sizeof(TVITEM
));
104 SendMessage(globals
.hTree
, TVM_GETITEM
, 0, (LPARAM
)&tvi
);
106 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_CREATEINST
, FALSE
);
107 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_RELEASEINST
, FALSE
);
108 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_VIEW
, FALSE
);
110 if(tvi
.lParam
&& ((ITEM_INFO
*)tvi
.lParam
)->cFlag
&SHOWALL
)
112 EnableMenuItem(hMenu
, IDM_COPYCLSID
, MF_ENABLED
);
113 EnableMenuItem(hMenu
, IDM_HTMLTAG
, MF_ENABLED
);
114 EnableMenuItem(hMenu
, IDM_VIEW
, MF_GRAYED
);
116 if(!((ITEM_INFO
*)tvi
.lParam
)->loaded
)
118 EnableMenuItem(hMenu
, IDM_CREATEINST
, MF_ENABLED
);
119 EnableMenuItem(hMenu
, IDM_CREATEINSTON
, MF_ENABLED
);
120 EnableMenuItem(hMenu
, IDM_RELEASEINST
, MF_GRAYED
);
121 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_CREATEINST
, TRUE
);
125 EnableMenuItem(hMenu
, IDM_CREATEINST
, MF_GRAYED
);
126 EnableMenuItem(hMenu
, IDM_CREATEINSTON
, MF_GRAYED
);
127 EnableMenuItem(hMenu
, IDM_RELEASEINST
, MF_ENABLED
);
128 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_RELEASEINST
, TRUE
);
131 else if(tvi
.lParam
&& ((ITEM_INFO
*)tvi
.lParam
)->cFlag
&INTERFACE
)
133 EnableMenuItem(hMenu
, IDM_TYPEINFO
, MF_GRAYED
);
134 EnableMenuItem(hMenu
, IDM_CREATEINST
, MF_GRAYED
);
135 EnableMenuItem(hMenu
, IDM_CREATEINSTON
, MF_GRAYED
);
136 EnableMenuItem(hMenu
, IDM_RELEASEINST
, MF_GRAYED
);
137 EnableMenuItem(hMenu
, IDM_COPYCLSID
, MF_ENABLED
);
138 EnableMenuItem(hMenu
, IDM_HTMLTAG
, MF_GRAYED
);
139 EnableMenuItem(hMenu
, IDM_VIEW
, MF_ENABLED
);
140 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_VIEW
, TRUE
);
144 EnableMenuItem(hMenu
, IDM_TYPEINFO
, MF_GRAYED
);
145 EnableMenuItem(hMenu
, IDM_CREATEINST
, MF_GRAYED
);
146 EnableMenuItem(hMenu
, IDM_CREATEINSTON
, MF_GRAYED
);
147 EnableMenuItem(hMenu
, IDM_RELEASEINST
, MF_GRAYED
);
148 EnableMenuItem(hMenu
, IDM_COPYCLSID
, MF_GRAYED
);
149 EnableMenuItem(hMenu
, IDM_HTMLTAG
, MF_GRAYED
);
150 EnableMenuItem(hMenu
, IDM_VIEW
, MF_GRAYED
);
152 parent
= TreeView_GetParent(globals
.hTree
, item
);
153 if(parent
==tree
.hAID
|| parent
==tree
.hGBCC
)
154 EnableMenuItem(hMenu
, IDM_COPYCLSID
, MF_ENABLED
);
157 int MenuCommand(WPARAM wParam
, HWND hWnd
)
161 WCHAR wszAbout
[MAX_LOAD_STRING
];
162 WCHAR wszAboutVer
[MAX_LOAD_STRING
];
167 LoadString(globals
.hMainInst
, IDS_ABOUT
, wszAbout
,
168 sizeof(WCHAR
[MAX_LOAD_STRING
]));
169 LoadString(globals
.hMainInst
, IDS_ABOUTVER
, wszAboutVer
,
170 sizeof(WCHAR
[MAX_LOAD_STRING
]));
171 ShellAbout(hWnd
, wszAbout
, wszAboutVer
, NULL
);
174 hSelect
= TreeView_GetSelection(globals
.hTree
);
178 hSelect
= TreeView_GetSelection(globals
.hTree
);
179 CreateInst(hSelect
, NULL
);
180 SendMessage(globals
.hTree
, TVM_EXPAND
, TVE_EXPAND
, (LPARAM
)hSelect
);
182 case IDM_CREATEINSTON
:
183 if(DialogBox(0, MAKEINTRESOURCE(DLG_CREATEINSTON
),
184 hWnd
, CreateInstOnProc
) == IDCANCEL
) break;
185 hSelect
= TreeView_GetSelection(globals
.hTree
);
186 CreateInst(hSelect
, globals
.wszMachineName
);
187 SendMessage(globals
.hTree
, TVM_EXPAND
, TVE_EXPAND
, (LPARAM
)hSelect
);
189 case IDM_RELEASEINST
:
190 hSelect
= TreeView_GetSelection(globals
.hTree
);
191 ReleaseInst(hSelect
);
192 RefreshMenu(hSelect
);
193 RefreshDetails(hSelect
);
196 globals
.bExpert
= !globals
.bExpert
;
197 CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
198 globals
.bExpert
? MF_CHECKED
: MF_UNCHECKED
);
200 if(globals
.bExpert
) AddTreeEx();
202 hSelect
= TreeView_GetChild(globals
.hTree
, TVI_ROOT
);
203 SendMessage(globals
.hTree
, TVM_SELECTITEM
, 0, (LPARAM
)hSelect
);
204 RefreshMenu(hSelect
);
206 case IDM_FLAG_INSERV
:
207 vis
= globals
.dwClsCtx
&CLSCTX_INPROC_SERVER
;
208 globals
.dwClsCtx
= globals
.dwClsCtx
&(~CLSCTX_INPROC_SERVER
);
209 globals
.dwClsCtx
= globals
.dwClsCtx
|((~vis
)&CLSCTX_INPROC_SERVER
);
210 if(!globals
.dwClsCtx
) globals
.dwClsCtx
= vis
;
211 else CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
212 vis
? MF_UNCHECKED
: MF_CHECKED
);
214 case IDM_FLAG_INHANDL
:
215 vis
= globals
.dwClsCtx
&CLSCTX_INPROC_HANDLER
;
216 globals
.dwClsCtx
= globals
.dwClsCtx
&(~CLSCTX_INPROC_HANDLER
);
217 globals
.dwClsCtx
= globals
.dwClsCtx
|((~vis
)&CLSCTX_INPROC_HANDLER
);
218 if(!globals
.dwClsCtx
) globals
.dwClsCtx
= vis
;
219 else CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
220 vis
? MF_UNCHECKED
: MF_CHECKED
);
222 case IDM_FLAG_LOCSERV
:
223 vis
= globals
.dwClsCtx
&CLSCTX_LOCAL_SERVER
;
224 globals
.dwClsCtx
= globals
.dwClsCtx
&(~CLSCTX_LOCAL_SERVER
);
225 globals
.dwClsCtx
= globals
.dwClsCtx
|((~vis
)&CLSCTX_LOCAL_SERVER
);
226 if(!globals
.dwClsCtx
) globals
.dwClsCtx
= vis
;
227 else CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
228 vis
? MF_UNCHECKED
: MF_CHECKED
);
230 case IDM_FLAG_REMSERV
:
231 vis
= globals
.dwClsCtx
&CLSCTX_REMOTE_SERVER
;
232 globals
.dwClsCtx
= globals
.dwClsCtx
&(~CLSCTX_REMOTE_SERVER
);
233 globals
.dwClsCtx
= globals
.dwClsCtx
|((~vis
)&CLSCTX_REMOTE_SERVER
);
234 if(!globals
.dwClsCtx
) globals
.dwClsCtx
= vis
;
235 else CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
236 vis
? MF_UNCHECKED
: MF_CHECKED
);
240 if(globals
.bExpert
) AddTreeEx();
242 hSelect
= TreeView_GetChild(globals
.hTree
, TVI_ROOT
);
243 SendMessage(globals
.hTree
, TVM_SELECTITEM
, 0, (LPARAM
)hSelect
);
244 RefreshMenu(hSelect
);
249 PROCESS_INFORMATION pi
;
251 memset(&si
, 0, sizeof(si
));
253 CreateProcess(NULL
, wszRegEdit
, NULL
, NULL
, FALSE
, 0,\
254 NULL
, NULL
, &si
, &pi
);
255 CloseHandle(pi
.hProcess
);
256 CloseHandle(pi
.hThread
);
260 vis
= IsWindowVisible(globals
.hStatusBar
);
261 ShowWindow(globals
.hStatusBar
, vis
? SW_HIDE
: SW_SHOW
);
262 CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
263 vis
? MF_UNCHECKED
: MF_CHECKED
);
267 vis
= IsWindowVisible(globals
.hToolBar
);
268 ShowWindow(globals
.hToolBar
, vis
? SW_HIDE
: SW_SHOW
);
269 CheckMenuItem(GetMenu(hWnd
), LOWORD(wParam
),
270 vis
? MF_UNCHECKED
: MF_CHECKED
);
280 void UpdateStatusBar(int itemID
)
282 WCHAR info
[MAX_LOAD_STRING
];
284 if(!LoadString(globals
.hMainInst
, itemID
, info
, sizeof(WCHAR
[MAX_LOAD_STRING
])))
285 LoadString(globals
.hMainInst
, IDS_READY
, info
, sizeof(WCHAR
[MAX_LOAD_STRING
]));
287 SendMessage(globals
.hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)info
);
290 LRESULT CALLBACK
WndProc(HWND hWnd
, UINT uMsg
,
291 WPARAM wParam
, LPARAM lParam
)
297 if(!CreatePanedWindow(hWnd
, &globals
.hPaneWnd
, globals
.hMainInst
))
299 SetLeft(globals
.hPaneWnd
, CreateTreeWindow(globals
.hMainInst
));
300 SetRight(globals
.hPaneWnd
, CreateDetailsWindow(globals
.hMainInst
));
301 SetFocus(globals
.hTree
);
304 MenuCommand(LOWORD(wParam
), hWnd
);
312 UpdateStatusBar(LOWORD(wParam
));
315 SetFocus(globals
.hTree
);
318 if(wParam
== SIZE_MINIMIZED
) break;
322 return DefWindowProc(hWnd
, uMsg
, wParam
, lParam
);
327 BOOL
InitApplication(HINSTANCE hInst
)
330 WCHAR wszAppName
[MAX_LOAD_STRING
];
332 LoadString(hInst
, IDS_APPNAME
, wszAppName
, sizeof(WCHAR
[MAX_LOAD_STRING
]));
334 memset(&wc
, 0, sizeof(WNDCLASS
));
335 wc
.lpfnWndProc
= WndProc
;
336 wc
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+1);
337 wc
.lpszMenuName
= MAKEINTRESOURCE(IDM_MENU
);
338 wc
.lpszClassName
= wszAppName
;
340 if(!RegisterClass(&wc
))
346 BOOL
InitInstance(HINSTANCE hInst
, int nCmdShow
)
349 WCHAR wszAppName
[MAX_LOAD_STRING
];
350 WCHAR wszTitle
[MAX_LOAD_STRING
];
352 {0, 0, 0, BTNS_SEP
, {0, 0}, 0, 0},
353 {0, IDM_BIND
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0, 0}, 0, 0},
354 {1, IDM_TYPELIB
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0, 0}, 0, 0},
355 {0, 0, 0, BTNS_SEP
, {0, 0}, 0, 0},
356 {2, IDM_REGEDIT
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0, 0}, 0, 0},
357 {0, 0, 0, BTNS_SEP
, {0, 0}, 0, 0},
358 {3, IDM_CREATEINST
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0, 0}, 0, 0},
359 {4, IDM_RELEASEINST
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0, 0}, 0, 0},
360 {0, 0, 0, BTNS_SEP
, {0, 0}, 0, 0},
361 {5, IDM_VIEW
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0, 0}, 0, 0}
364 LoadString(hInst
, IDS_APPNAME
, wszAppName
, sizeof(WCHAR
[MAX_LOAD_STRING
]));
365 LoadString(hInst
, IDS_APPTITLE
, wszTitle
, sizeof(WCHAR
[MAX_LOAD_STRING
]));
367 hWnd
= CreateWindow(wszAppName
, wszTitle
, WS_OVERLAPPEDWINDOW
,
368 CW_USEDEFAULT
, 0, CW_USEDEFAULT
, 0, NULL
, NULL
, hInst
, NULL
);
369 if(!hWnd
) return FALSE
;
371 globals
.hStatusBar
= CreateStatusWindow(WS_VISIBLE
|WS_CHILD
,
372 (LPWSTR
)wszTitle
, hWnd
, 0);
374 globals
.hToolBar
= CreateToolbarEx(hWnd
, WS_CHILD
|WS_VISIBLE
, 0, 1, hInst
,
375 IDB_TOOLBAR
, tB
, 10, 16, 16, 16, 16, sizeof(TBBUTTON
));
376 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_CREATEINST
, FALSE
);
377 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_RELEASEINST
, FALSE
);
378 SendMessage(globals
.hToolBar
, TB_ENABLEBUTTON
, IDM_VIEW
, FALSE
);
380 globals
.hMainWnd
= hWnd
;
381 globals
.hMainInst
= hInst
;
382 globals
.bExpert
= TRUE
;
383 globals
.dwClsCtx
= CLSCTX_INPROC_SERVER
|CLSCTX_LOCAL_SERVER
;
385 ShowWindow(hWnd
, nCmdShow
);
391 int APIENTRY
wWinMain(HINSTANCE hInst
, HINSTANCE hPrevInst
,
392 LPWSTR lpCmdLine
, int nCmdShow
)
399 if(!InitApplication(hInst
))
403 if(!InitInstance(hInst
, nCmdShow
))
406 hAccelTable
= LoadAccelerators(hInst
, MAKEINTRESOURCE(IDA_OLEVIEW
));
408 while(GetMessage(&msg
, NULL
, 0, 0))
410 if(TranslateAccelerator(globals
.hMainWnd
, hAccelTable
, &msg
)) continue;
412 TranslateMessage(&msg
);
413 DispatchMessage(&msg
);