Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/programs/oleview/oleview.c
4389 views
1
/*
2
* OleView (oleview.c)
3
*
4
* Copyright 2006 Piotr Caban
5
*
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.
10
*
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.
15
*
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
19
*/
20
21
#include "main.h"
22
#include "commctrl.h"
23
#include "commdlg.h"
24
#include "shellapi.h"
25
26
GLOBALS globals;
27
28
static INT_PTR CALLBACK SysConfProc(HWND hDlgWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
29
{
30
HKEY hKey;
31
WCHAR buffer[MAX_LOAD_STRING];
32
DWORD bufSize;
33
34
switch(uMsg)
35
{
36
case WM_INITDIALOG:
37
if (RegCreateKeyW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\OLE", &hKey) != ERROR_SUCCESS) break;
38
39
bufSize = sizeof(buffer);
40
if(RegGetValueW(hKey, NULL, L"EnableDCOM", RRF_RT_REG_SZ,
41
NULL, buffer, &bufSize) != ERROR_SUCCESS)
42
{
43
bufSize = sizeof(L"Y");
44
RegSetValueExW(hKey, L"EnableDCOM", 0, REG_SZ, (BYTE*)L"Y", bufSize);
45
}
46
47
CheckDlgButton(hDlgWnd, IDC_ENABLEDCOM,
48
buffer[0]=='Y' ? BST_CHECKED : BST_UNCHECKED);
49
50
bufSize = sizeof(buffer);
51
if(RegGetValueW(hKey, NULL, L"EnableRemoteConnect", RRF_RT_REG_SZ,
52
NULL, buffer, &bufSize) != ERROR_SUCCESS)
53
{
54
bufSize = sizeof(L"Y");
55
RegSetValueExW(hKey, L"EnableRemoteConnect", 0, REG_SZ, (BYTE*)L"Y", bufSize);
56
}
57
58
CheckDlgButton(hDlgWnd, IDC_ENABLEREMOTE,
59
buffer[0]=='Y' ? BST_CHECKED : BST_UNCHECKED);
60
61
RegCloseKey(hKey);
62
return TRUE;
63
case WM_COMMAND:
64
switch(LOWORD(wParam)) {
65
case IDOK:
66
bufSize = sizeof(L"Y");
67
68
RegOpenKeyW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\OLE", &hKey);
69
70
RegSetValueExW(hKey, L"EnableDCOM", 0, REG_SZ,
71
IsDlgButtonChecked(hDlgWnd, IDC_ENABLEDCOM) == BST_CHECKED ?
72
(BYTE*)L"Y" : (BYTE*)L"N", bufSize);
73
74
RegSetValueExW(hKey, L"EnableRemoteConnect", 0, REG_SZ,
75
IsDlgButtonChecked(hDlgWnd, IDC_ENABLEREMOTE) == BST_CHECKED ?
76
(BYTE*)L"Y" : (BYTE*)L"N", bufSize);
77
78
RegCloseKey(hKey);
79
80
EndDialog(hDlgWnd, IDOK);
81
return TRUE;
82
case IDCANCEL:
83
EndDialog(hDlgWnd, IDCANCEL);
84
return TRUE;
85
}
86
}
87
88
return FALSE;
89
}
90
91
static INT_PTR CALLBACK CreateInstOnProc(HWND hDlgWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
92
{
93
HWND hEdit;
94
95
switch(uMsg)
96
{
97
case WM_COMMAND:
98
switch(LOWORD(wParam)) {
99
case IDOK:
100
memset(globals.wszMachineName, 0, sizeof(WCHAR[MAX_LOAD_STRING]));
101
hEdit = GetDlgItem(hDlgWnd, IDC_MACHINE);
102
103
if (GetWindowTextLengthW(hEdit)>0)
104
GetWindowTextW(hEdit, globals.wszMachineName, MAX_LOAD_STRING);
105
106
EndDialog(hDlgWnd, IDOK);
107
return TRUE;
108
case IDCANCEL:
109
EndDialog(hDlgWnd, IDCANCEL);
110
return TRUE;
111
}
112
}
113
114
return FALSE;
115
}
116
117
static void InitOpenFileName(HWND hWnd, OPENFILENAMEW *pofn, WCHAR *wszFilter,
118
WCHAR *wszTitle, WCHAR *wszFileName)
119
{
120
memset(pofn, 0, sizeof(OPENFILENAMEW));
121
pofn->lStructSize = sizeof(OPENFILENAMEW);
122
pofn->hwndOwner = hWnd;
123
pofn->hInstance = globals.hMainInst;
124
125
pofn->lpstrTitle = wszTitle;
126
pofn->lpstrFilter = wszFilter;
127
pofn->nFilterIndex = 0;
128
pofn->lpstrFile = wszFileName;
129
pofn->nMaxFile = MAX_LOAD_STRING;
130
pofn->Flags = OFN_HIDEREADONLY | OFN_ENABLESIZING;
131
}
132
133
static void CopyClsid(HTREEITEM item)
134
{
135
TVITEMW tvi;
136
137
memset(&tvi, 0, sizeof(TVITEMW));
138
tvi.hItem = item;
139
tvi.cchTextMax = MAX_LOAD_STRING;
140
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
141
142
if(OpenClipboard(globals.hMainWnd) && EmptyClipboard() && tvi.lParam)
143
{
144
HANDLE hClipData = GlobalAlloc(GHND, sizeof(WCHAR[MAX_LOAD_STRING]));
145
LPVOID pLoc = GlobalLock(hClipData);
146
147
lstrcpyW(pLoc, ((ITEM_INFO *)tvi.lParam)->clsid);
148
GlobalUnlock(hClipData);
149
SetClipboardData(CF_UNICODETEXT, hClipData);
150
CloseClipboard();
151
}
152
}
153
154
static void CopyHTMLTag(HTREEITEM item)
155
{
156
TVITEMW tvi;
157
158
memset(&tvi, 0, sizeof(TVITEMW));
159
tvi.hItem = item;
160
tvi.cchTextMax = MAX_LOAD_STRING;
161
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
162
163
if(OpenClipboard(globals.hMainWnd) && EmptyClipboard() && tvi.lParam)
164
{
165
HANDLE hClipData = GlobalAlloc(GHND, sizeof(WCHAR[MAX_LOAD_STRING]));
166
LPVOID pLoc = GlobalLock(hClipData);
167
int clsidLen = lstrlenW(((ITEM_INFO *)tvi.lParam)->clsid)-1;
168
169
((ITEM_INFO *)tvi.lParam)->clsid[clsidLen] = '\0';
170
wsprintfW(pLoc, L"<object\n classid=\"clsid:%s\"\n>\n</object>",
171
((ITEM_INFO *)tvi.lParam)->clsid+1);
172
((ITEM_INFO *)tvi.lParam)->clsid[clsidLen] = '}';
173
174
GlobalUnlock(hClipData);
175
SetClipboardData(CF_UNICODETEXT, hClipData);
176
CloseClipboard();
177
}
178
}
179
180
static void ResizeChild(void)
181
{
182
RECT client, stat, tool;
183
184
MoveWindow(globals.hStatusBar, 0, 0, 0, 0, TRUE);
185
MoveWindow(globals.hToolBar, 0, 0, 0, 0, TRUE);
186
187
if(IsWindowVisible(globals.hStatusBar))
188
GetClientRect(globals.hStatusBar, &stat);
189
else stat.bottom = 0;
190
191
if(IsWindowVisible(globals.hToolBar))
192
{
193
GetClientRect(globals.hToolBar, &tool);
194
tool.bottom += 2;
195
}
196
else tool.bottom = 0;
197
198
GetClientRect(globals.hMainWnd, &client);
199
MoveWindow(globals.hPaneWnd, 0, tool.bottom,
200
client.right, client.bottom-tool.bottom-stat.bottom, TRUE);
201
}
202
203
void RefreshMenu(HTREEITEM item)
204
{
205
TVITEMW tvi;
206
HTREEITEM parent;
207
HMENU hMenu = GetMenu(globals.hMainWnd);
208
209
memset(&tvi, 0, sizeof(TVITEMW));
210
tvi.hItem = item;
211
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
212
213
parent = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
214
TVGN_PARENT, (LPARAM)item);
215
216
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_CREATEINST, FALSE);
217
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, FALSE);
218
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_VIEW, FALSE);
219
220
if(tvi.lParam && ((ITEM_INFO *)tvi.lParam)->cFlag&SHOWALL)
221
{
222
EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
223
EnableMenuItem(hMenu, IDM_HTMLTAG, MF_ENABLED);
224
EnableMenuItem(hMenu, IDM_VIEW, MF_GRAYED);
225
226
if(!((ITEM_INFO *)tvi.lParam)->loaded)
227
{
228
EnableMenuItem(hMenu, IDM_CREATEINST, MF_ENABLED);
229
EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_ENABLED);
230
EnableMenuItem(hMenu, IDM_RELEASEINST, MF_GRAYED);
231
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_CREATEINST, TRUE);
232
}
233
else
234
{
235
EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
236
EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_GRAYED);
237
EnableMenuItem(hMenu, IDM_RELEASEINST, MF_ENABLED);
238
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, TRUE);
239
}
240
}
241
else if(tvi.lParam &&
242
(((ITEM_INFO *)tvi.lParam)->cFlag&INTERFACE || parent==tree.hTL))
243
{
244
EnableMenuItem(hMenu, IDM_TYPEINFO, MF_GRAYED);
245
EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
246
EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_GRAYED);
247
EnableMenuItem(hMenu, IDM_RELEASEINST, MF_GRAYED);
248
EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
249
EnableMenuItem(hMenu, IDM_HTMLTAG, MF_GRAYED);
250
EnableMenuItem(hMenu, IDM_VIEW, MF_ENABLED);
251
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_VIEW, TRUE);
252
}
253
else
254
{
255
EnableMenuItem(hMenu, IDM_TYPEINFO, MF_GRAYED);
256
EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
257
EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_GRAYED);
258
EnableMenuItem(hMenu, IDM_RELEASEINST, MF_GRAYED);
259
EnableMenuItem(hMenu, IDM_COPYCLSID, MF_GRAYED);
260
EnableMenuItem(hMenu, IDM_HTMLTAG, MF_GRAYED);
261
EnableMenuItem(hMenu, IDM_VIEW, MF_GRAYED);
262
}
263
264
if(parent==tree.hAID || parent==tree.hGBCC)
265
EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
266
}
267
268
static int MenuCommand(WPARAM wParam, HWND hWnd)
269
{
270
BOOL vis;
271
HTREEITEM hSelect;
272
WCHAR wszAbout[MAX_LOAD_STRING];
273
274
switch(wParam)
275
{
276
case IDM_ABOUT:
277
LoadStringW(globals.hMainInst, IDS_ABOUT, wszAbout, ARRAY_SIZE(wszAbout));
278
ShellAboutW(hWnd, wszAbout, NULL, NULL);
279
break;
280
case IDM_COPYCLSID:
281
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
282
TVM_GETNEXTITEM, TVGN_CARET, 0);
283
CopyClsid(hSelect);
284
break;
285
case IDM_HTMLTAG:
286
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
287
TVM_GETNEXTITEM, TVGN_CARET, 0);
288
CopyHTMLTag(hSelect);
289
break;
290
case IDM_CREATEINST:
291
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
292
TVM_GETNEXTITEM, TVGN_CARET, 0);
293
CreateInst(hSelect, NULL);
294
SendMessageW(globals.hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hSelect);
295
break;
296
case IDM_CREATEINSTON:
297
if(DialogBoxW(0, MAKEINTRESOURCEW(DLG_CREATEINSTON),
298
hWnd, CreateInstOnProc) == IDCANCEL) break;
299
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
300
TVM_GETNEXTITEM, TVGN_CARET, 0);
301
CreateInst(hSelect, globals.wszMachineName);
302
SendMessageW(globals.hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hSelect);
303
break;
304
case IDM_RELEASEINST:
305
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
306
TVM_GETNEXTITEM, TVGN_CARET, 0);
307
ReleaseInst(hSelect);
308
RefreshMenu(hSelect);
309
RefreshDetails(hSelect);
310
break;
311
case IDM_EXPERT:
312
globals.bExpert = !globals.bExpert;
313
CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
314
globals.bExpert ? MF_CHECKED : MF_UNCHECKED);
315
EmptyTree();
316
if(globals.bExpert) AddTreeEx();
317
else AddTree();
318
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
319
TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)TVI_ROOT);
320
SendMessageW(globals.hTree, TVM_SELECTITEM, 0, (LPARAM)hSelect);
321
RefreshMenu(hSelect);
322
break;
323
case IDM_FLAG_INSERV:
324
vis = globals.dwClsCtx&CLSCTX_INPROC_SERVER;
325
globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_INPROC_SERVER);
326
globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_INPROC_SERVER);
327
if(!globals.dwClsCtx) globals.dwClsCtx = vis;
328
else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
329
vis ? MF_UNCHECKED : MF_CHECKED);
330
break;
331
case IDM_FLAG_INHANDL:
332
vis = globals.dwClsCtx&CLSCTX_INPROC_HANDLER;
333
globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_INPROC_HANDLER);
334
globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_INPROC_HANDLER);
335
if(!globals.dwClsCtx) globals.dwClsCtx = vis;
336
else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
337
vis ? MF_UNCHECKED : MF_CHECKED);
338
break;
339
case IDM_FLAG_LOCSERV:
340
vis = globals.dwClsCtx&CLSCTX_LOCAL_SERVER;
341
globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_LOCAL_SERVER);
342
globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_LOCAL_SERVER);
343
if(!globals.dwClsCtx) globals.dwClsCtx = vis;
344
else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
345
vis ? MF_UNCHECKED : MF_CHECKED);
346
break;
347
case IDM_FLAG_REMSERV:
348
vis = globals.dwClsCtx&CLSCTX_REMOTE_SERVER;
349
globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_REMOTE_SERVER);
350
globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_REMOTE_SERVER);
351
if(!globals.dwClsCtx) globals.dwClsCtx = vis;
352
else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
353
vis ? MF_UNCHECKED : MF_CHECKED);
354
break;
355
case IDM_REFRESH:
356
EmptyTree();
357
if(globals.bExpert) AddTreeEx();
358
else AddTree();
359
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
360
TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)TVI_ROOT);
361
SendMessageW(globals.hTree, TVM_SELECTITEM, 0, (LPARAM)hSelect);
362
RefreshMenu(hSelect);
363
break;
364
case IDM_REGEDIT:
365
{
366
STARTUPINFOW si;
367
PROCESS_INFORMATION pi;
368
WCHAR app[MAX_PATH];
369
370
GetWindowsDirectoryW(app, MAX_PATH - ARRAY_SIZE(L"\\regedit.exe"));
371
lstrcatW( app, L"\\regedit.exe" );
372
memset(&si, 0, sizeof(si));
373
si.cb = sizeof(si);
374
if (CreateProcessW(app, app, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
375
{
376
CloseHandle(pi.hProcess);
377
CloseHandle(pi.hThread);
378
}
379
break;
380
}
381
case IDM_STATUSBAR:
382
vis = IsWindowVisible(globals.hStatusBar);
383
ShowWindow(globals.hStatusBar, vis ? SW_HIDE : SW_SHOW);
384
CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
385
vis ? MF_UNCHECKED : MF_CHECKED);
386
ResizeChild();
387
break;
388
case IDM_SYSCONF:
389
DialogBoxW(0, MAKEINTRESOURCEW(DLG_SYSCONF), hWnd, SysConfProc);
390
break;
391
case IDM_TOOLBAR:
392
vis = IsWindowVisible(globals.hToolBar);
393
ShowWindow(globals.hToolBar, vis ? SW_HIDE : SW_SHOW);
394
CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
395
vis ? MF_UNCHECKED : MF_CHECKED);
396
ResizeChild();
397
break;
398
case IDM_TYPELIB:
399
{
400
OPENFILENAMEW ofn;
401
static WCHAR wszTitle[MAX_LOAD_STRING];
402
static WCHAR wszName[MAX_LOAD_STRING];
403
WCHAR filter_typelib[MAX_LOAD_STRING], filter_all[MAX_LOAD_STRING], filter[MAX_PATH];
404
405
LoadStringW(globals.hMainInst, IDS_OPEN, wszTitle, ARRAY_SIZE(wszTitle));
406
LoadStringW(globals.hMainInst, IDS_OPEN_FILTER_TYPELIB, filter_typelib, ARRAY_SIZE(filter_typelib));
407
LoadStringW(globals.hMainInst, IDS_OPEN_FILTER_ALL, filter_all, ARRAY_SIZE(filter_all));
408
wsprintfW( filter, L"%s%c*.tlb;*.olb;*.dll;*.ocx;*.exe%c%s%c*.*%c",
409
filter_typelib, 0, 0, filter_all, 0, 0 );
410
InitOpenFileName(hWnd, &ofn, filter, wszTitle, wszName);
411
if(GetOpenFileNameW(&ofn)) CreateTypeLibWindow(globals.hMainInst, wszName);
412
break;
413
}
414
case IDM_VIEW:
415
hSelect = (HTREEITEM)SendMessageW(globals.hTree,
416
TVM_GETNEXTITEM, TVGN_CARET, 0);
417
if(IsInterface(hSelect)) InterfaceViewer(hSelect);
418
else CreateTypeLibWindow(globals.hMainInst, NULL);
419
break;
420
case IDM_EXIT:
421
DestroyWindow(hWnd);
422
break;
423
}
424
return 0;
425
}
426
427
static void UpdateStatusBar(int itemID)
428
{
429
WCHAR info[MAX_LOAD_STRING];
430
431
if(!LoadStringW(globals.hMainInst, itemID, info, ARRAY_SIZE(info)))
432
LoadStringW(globals.hMainInst, IDS_READY, info, ARRAY_SIZE(info));
433
434
SendMessageW(globals.hStatusBar, SB_SETTEXTW, 0, (LPARAM)info);
435
}
436
437
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
438
WPARAM wParam, LPARAM lParam)
439
{
440
switch(uMsg)
441
{
442
case WM_CREATE:
443
OleInitialize(NULL);
444
PaneRegisterClassW();
445
TypeLibRegisterClassW();
446
if(!CreatePanedWindow(hWnd, &globals.hPaneWnd, globals.hMainInst))
447
PostQuitMessage(0);
448
SetLeft(globals.hPaneWnd, CreateTreeWindow(globals.hMainInst));
449
SetRight(globals.hPaneWnd, CreateDetailsWindow(globals.hMainInst));
450
SetFocus(globals.hTree);
451
break;
452
case WM_COMMAND:
453
MenuCommand(LOWORD(wParam), hWnd);
454
break;
455
case WM_DESTROY:
456
EmptyTree();
457
OleUninitialize();
458
PostQuitMessage(0);
459
break;
460
case WM_MENUSELECT:
461
UpdateStatusBar(LOWORD(wParam));
462
break;
463
case WM_SETFOCUS:
464
SetFocus(globals.hTree);
465
break;
466
case WM_SIZE:
467
if(wParam == SIZE_MINIMIZED) break;
468
ResizeChild();
469
break;
470
default:
471
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
472
}
473
return 0;
474
}
475
476
static BOOL InitApplication(HINSTANCE hInst)
477
{
478
WNDCLASSW wc;
479
WCHAR wszAppName[MAX_LOAD_STRING];
480
481
LoadStringW(hInst, IDS_APPNAME, wszAppName, ARRAY_SIZE(wszAppName));
482
483
memset(&wc, 0, sizeof(WNDCLASSW));
484
wc.lpfnWndProc = WndProc;
485
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
486
wc.hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);
487
wc.lpszMenuName = MAKEINTRESOURCEW(IDM_MENU);
488
wc.lpszClassName = wszAppName;
489
490
if(!RegisterClassW(&wc))
491
return FALSE;
492
493
return TRUE;
494
}
495
496
static BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
497
{
498
HWND hWnd;
499
WCHAR wszAppName[MAX_LOAD_STRING];
500
WCHAR wszTitle[MAX_LOAD_STRING];
501
TBBUTTON tB[] = {
502
{0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
503
{0, IDM_BIND, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
504
{1, IDM_TYPELIB, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
505
{0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
506
{2, IDM_REGEDIT, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
507
{0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
508
{3, IDM_CREATEINST, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
509
{4, IDM_RELEASEINST, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
510
{0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
511
{5, IDM_VIEW, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}
512
};
513
514
LoadStringW(hInst, IDS_APPNAME, wszAppName, ARRAY_SIZE(wszAppName));
515
LoadStringW(hInst, IDS_APPTITLE, wszTitle, ARRAY_SIZE(wszTitle));
516
517
hWnd = CreateWindowW(wszAppName, wszTitle, WS_OVERLAPPEDWINDOW,
518
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
519
if(!hWnd) return FALSE;
520
521
globals.hStatusBar = CreateStatusWindowW(WS_VISIBLE|WS_CHILD,
522
wszTitle, hWnd, 0);
523
524
globals.hToolBar = CreateToolbarEx(hWnd, WS_CHILD|WS_VISIBLE, 0, 1, hInst,
525
IDB_TOOLBAR, tB, 10, 16, 16, 16, 16, sizeof(TBBUTTON));
526
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_CREATEINST, FALSE);
527
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, FALSE);
528
SendMessageW(globals.hToolBar, TB_ENABLEBUTTON, IDM_VIEW, FALSE);
529
530
globals.hMainWnd = hWnd;
531
globals.hMainInst = hInst;
532
globals.bExpert = TRUE;
533
globals.dwClsCtx = CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER;
534
535
ShowWindow(hWnd, nCmdShow);
536
UpdateWindow(hWnd);
537
538
return TRUE;
539
}
540
541
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
542
{
543
MSG msg;
544
HANDLE hAccelTable;
545
546
InitCommonControls();
547
548
if(!InitApplication(hInst))
549
return FALSE;
550
551
if(!InitInstance(hInst, nCmdShow))
552
return FALSE;
553
554
hAccelTable = LoadAcceleratorsW(hInst, MAKEINTRESOURCEW(IDA_OLEVIEW));
555
556
while(GetMessageW(&msg, NULL, 0, 0))
557
{
558
if(TranslateAcceleratorW(globals.hMainWnd, hAccelTable, &msg)) continue;
559
560
TranslateMessage(&msg);
561
DispatchMessageW(&msg);
562
}
563
564
return msg.wParam;
565
}
566
567