1 /*
2 * OLEDLG library
3 *
4 * Copyright 2003 Ulrich Czekalla for CodeWeavers
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 <stdarg.h>
22 #include <stdio.h>
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winreg.h"
27 #include "wine/winternl.h"
28 #include "winerror.h"
29 #include "wingdi.h"
30 #include "winuser.h"
31 #include "wine/debug.h"
32
33 #include "oledlg.h"
34 #include "resource.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(oledlg);
37
38 typedef struct
39 {
40 HWND hwndSelf;
41 BOOL bObjListInit; /* Object list has been initialized */
42 LPOLEUIINSERTOBJECTA lpOleUIInsertObject;
43
44 HWND hwndObjTypeLBL;
45 HWND hwndObjTypeLB;
46 HWND hwndFileLBL;
47 HWND hwndFileTB;
48 HWND hwndCreateCtrlCB;
49 HWND hwndCreateNewCB;
50 HWND hwndCreateFromFileCB;
51 HWND hwndDisplayIconCB;
52 HWND hwndAddCtrlBTN;
53 HWND hwndBrowseBTN;
54 HWND hwndResultDesc;
55
56 } InsertObjectDlgInfo;
57
58 static INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
59 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
60 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo);
61 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo);
62 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo);
63 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo);
64 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo);
65 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo);
66 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo);
67 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo);
68 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo);
69 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo);
70
71 typedef HRESULT (*DLLREGISTER) (void);
72
73 extern HINSTANCE OLEDLG_hInstance;
74 static const WCHAR OleUIInsertObjectInfoStr[] = {'O','l','e','U','I','I','n','s','e','r','t','O','b','j','e','c','t',
75 'I','n','f','o','S','t','r',0};
76
77 /***********************************************************************
78 * OleUIInsertObjectA (OLEDLG.3)
79 */
OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)80 UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
81 {
82 LRESULT lRes;
83 LPCVOID template;
84 HRSRC hRes;
85 InsertObjectDlgInfo dlgInfo;
86 HANDLE hDlgTmpl = 0;
87
88 if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource)
89 FIXME("Customized template not supported\n");
90
91 /* Create the dialog from a template */
92 if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT),
93 (LPSTR)RT_DIALOG)))
94 {
95 return OLEUI_ERR_FINDTEMPLATEFAILURE;
96 }
97
98 if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) ||
99 !(template = LockResource( hDlgTmpl )))
100 {
101 return OLEUI_ERR_LOADTEMPLATEFAILURE;
102 }
103
104 /* Initialize InsertObjectDlgInfo structure */
105 dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject;
106 dlgInfo.bObjListInit = FALSE;
107
108 lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (const DLGTEMPLATE*) template,
109 lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc,
110 (LPARAM) &dlgInfo);
111
112 /* Unable to create the dialog */
113 if( lRes == -1)
114 return OLEUI_ERR_DIALOGFAILURE;
115
116 return lRes;
117 }
118
119
120 /***********************************************************************
121 * UIInsertObjectDlgProc
122 *
123 * OLE UI Insert Object dialog procedure
124 */
UIInsertObjectDlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)125 INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
126 {
127 InsertObjectDlgInfo* pdlgInfo = GetPropW(hwnd, OleUIInsertObjectInfoStr);
128
129 switch(uMsg)
130 {
131 case WM_INITDIALOG:
132 {
133 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam;
134
135 pdlgInfo->hwndSelf = hwnd;
136
137 SetPropW(hwnd, OleUIInsertObjectInfoStr, pdlgInfo);
138
139 UIINSERTOBJECTDLG_InitDialog(pdlgInfo);
140
141 return 0;
142 }
143
144 case WM_COMMAND:
145 return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam);
146
147 case WM_DESTROY:
148 if (pdlgInfo)
149 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
150 RemovePropW(hwnd, OleUIInsertObjectInfoStr);
151 return FALSE;
152
153 default :
154 return FALSE;
155 }
156 }
157
158
159 /***********************************************************************
160 * UIINSOBJDLG_OnWMCommand
161 *
162 * WM_COMMAND message handler
163 */
UIINSOBJDLG_OnWMCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)164 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
165 {
166 InsertObjectDlgInfo* pdlgInfo = GetPropW(hwnd, OleUIInsertObjectInfoStr);
167 WORD wNotifyCode = HIWORD(wParam);
168 WORD wID = LOWORD(wParam);
169
170 switch(wID)
171 {
172 case IDOK:
173 EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo));
174 break;
175
176 case IDCANCEL:
177 EndDialog(hwnd, FALSE);
178 break;
179
180 case IDC_CREATECONTROL:
181 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
182 break;
183
184 case IDC_CREATENEW:
185 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
186 break;
187
188 case IDC_CREATEFROMFILE:
189 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
190 break;
191
192 case IDC_BROWSE:
193 UIINSERTOBJECTDLG_BrowseFile(pdlgInfo);
194 break;
195
196 case IDC_ADDCONTROL:
197 UIINSERTOBJECTDLG_AddControl(pdlgInfo);
198 break;
199
200 case IDC_OBJTYPELIST:
201 if (wNotifyCode == LBN_SELCHANGE)
202 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
203 break;
204 }
205 return 0;
206 }
207
208
209 /***********************************************************************
210 * UIINSERTOBJECTDLG_InitDialog
211 *
212 * Initialize dialog display
213 */
UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo * pdlgInfo)214 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
215 {
216 /* Initialize InsertObjectDlgInfo data structure */
217 pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
218 pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
219 pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
220 pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
221 pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
222 pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
223 pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
224 pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
225 pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
226 pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
227 pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
228
229 /* Setup dialog controls based on flags */
230 if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
231 SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
232
233 ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
234 IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
235 ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
236 IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
237 EnableWindow(pdlgInfo->hwndDisplayIconCB, !(pdlgInfo->lpOleUIInsertObject->dwFlags &
238 IOF_DISABLEDISPLAYASICON));
239
240 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
241 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
242 else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
243 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
244 else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
245 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
246 }
247
248
249 /***********************************************************************
250 * UIINSERTOBJECTDLG_SelectCreateCtrl
251 *
252 * Select Create Control Radio Button
253 */
UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo * pdlgInfo)254 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
255 {
256 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
257 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
258 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
259 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
260
261 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
262 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
263 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
264
265 SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
266
267 /* Populate object type listbox */
268 if (!pdlgInfo->bObjListInit)
269 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
270 }
271
272
273 /***********************************************************************
274 * UIINSERTOBJECTDLG_SelectCreateNew
275 *
276 * Select Create New Radio Button
277 */
UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo * pdlgInfo)278 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
279 {
280 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
281 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
282 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
283 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
284
285 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
286 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
287
288 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
289 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
290
291 SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
292
293 if (!pdlgInfo->bObjListInit)
294 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
295
296 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
297 }
298
299
300 /***********************************************************************
301 * UIINSERTOBJECTDLG_SelectCreateFromFile
302 *
303 * Select Create From File Radio Button
304 */
UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo * pdlgInfo)305 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
306 {
307 WCHAR resstr[MAX_PATH];
308
309 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
310 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
311 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
312
313 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
314 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
315
316 ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW);
317 ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW);
318 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW);
319
320 SendMessageW(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0);
321
322 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH))
323 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr);
324 }
325
326
327 /***********************************************************************
328 * UIINSERTOBJECTDLG_PopulateObjectTypes
329 *
330 * Populate Object Type listbox
331 */
UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo * pdlgInfo)332 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo)
333 {
334 static const WCHAR szClsid[] = {'C','L','S','I','D',0};
335 static const WCHAR szInsertable[] = {'I','n','s','e','r','t','a','b','l','e',0};
336 static const WCHAR szNotInsertable[] = {'N','o','t','I','n','s','e','r','t','a','b','l','e',0};
337 DWORD i;
338 LONG len;
339 HKEY hkclsids;
340 HKEY hkey;
341 CLSID clsid;
342 LSTATUS ret;
343 WCHAR keydesc[MAX_PATH];
344 WCHAR keyname[MAX_PATH];
345 WCHAR szclsid[128];
346 DWORD index = 0;
347
348 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
349
350 RegOpenKeyExW(HKEY_CLASSES_ROOT, szClsid, 0, KEY_READ, &hkclsids);
351
352 while (ERROR_SUCCESS == (ret = RegEnumKeyW(hkclsids, index, szclsid, ARRAY_SIZE(szclsid))))
353 {
354 index++;
355
356 RegOpenKeyExW(hkclsids, szclsid, 0, KEY_READ, &hkey);
357
358 len = sizeof(keyname);
359 if (ERROR_SUCCESS != RegQueryValueW(hkey, szInsertable, keyname, &len))
360 continue;
361
362 len = sizeof(keyname);
363 if (ERROR_SUCCESS == RegQueryValueW(hkey, szNotInsertable, keyname, &len))
364 continue;
365
366 CLSIDFromString(szclsid, &clsid);
367
368 for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++)
369 if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid))
370 break;
371
372 if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude)
373 continue;
374
375 len = sizeof(keydesc);
376 if (ERROR_SUCCESS == RegQueryValueW(hkey, NULL, keydesc, &len))
377 {
378 CLSID* lpclsid = HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID));
379 *lpclsid = clsid;
380
381 len = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc);
382 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, len, (LPARAM)lpclsid);
383 }
384 }
385
386 pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS);
387
388 return pdlgInfo->bObjListInit;
389 }
390
391
392 /***********************************************************************
393 * UIINSERTOBJECTDLG_FreeObjectTypes
394 *
395 * Free Object Types listbox
396 */
UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo * pdlgInfo)397 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo)
398 {
399 UINT i, count;
400
401 count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, 0, 0);
402
403 for (i = 0; i < count; i++)
404 {
405 CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
406 LB_GETITEMDATA, i, 0);
407 HeapFree(GetProcessHeap(), 0, lpclsid);
408 }
409 }
410
411
412 /***********************************************************************
413 * UIINSERTOBJECTDLG_SelChange
414 *
415 * Handle object type selection change
416 */
UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo * pdlgInfo)417 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo)
418 {
419 INT index;
420 WCHAR objname[MAX_PATH];
421 WCHAR objdesc[MAX_PATH];
422 WCHAR resstr[MAX_PATH];
423
424 TRACE("\n");
425
426 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) &&
427 ((index = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) &&
428 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, index, (LPARAM)objname))
429 wsprintfW(objdesc, resstr, objname);
430 else
431 objdesc[0] = 0;
432
433 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc);
434 }
435
436
437 /***********************************************************************
438 * UIINSERTOBJECTDLG_SelChange
439 *
440 * Handle OK Button
441 */
UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo * pdlgInfo)442 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo)
443 {
444 BOOL bret = FALSE;
445
446 if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) ||
447 BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0))
448 {
449 INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0);
450
451 if (index >= 0)
452 {
453 CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
454 LB_GETITEMDATA, index, 0);
455 pdlgInfo->lpOleUIInsertObject->clsid = *clsid;
456
457 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT)
458 {
459 pdlgInfo->lpOleUIInsertObject->sc= OleCreate(
460 &pdlgInfo->lpOleUIInsertObject->clsid,
461 &pdlgInfo->lpOleUIInsertObject->iid,
462 pdlgInfo->lpOleUIInsertObject->oleRender,
463 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
464 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
465 pdlgInfo->lpOleUIInsertObject->lpIStorage,
466 pdlgInfo->lpOleUIInsertObject->ppvObj);
467 }
468
469 bret = TRUE;
470 }
471 }
472 else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0))
473 {
474 if (pdlgInfo->lpOleUIInsertObject->lpszFile)
475 {
476 HRESULT hres;
477 WCHAR wcsFile[MAX_PATH];
478
479 if (SendMessageW(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)wcsFile))
480 WideCharToMultiByte(CP_ACP, 0, wcsFile, -1,
481 pdlgInfo->lpOleUIInsertObject->lpszFile, pdlgInfo->lpOleUIInsertObject->cchFile, NULL, NULL);
482
483 if (SUCCEEDED(hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid)))
484 {
485 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT)
486 {
487 hres = OleCreateFromFile(
488 &pdlgInfo->lpOleUIInsertObject->clsid,
489 wcsFile,
490 &pdlgInfo->lpOleUIInsertObject->iid,
491 pdlgInfo->lpOleUIInsertObject->oleRender,
492 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
493 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
494 pdlgInfo->lpOleUIInsertObject->lpIStorage,
495 pdlgInfo->lpOleUIInsertObject->ppvObj);
496 }
497
498 bret = TRUE;
499 }
500 pdlgInfo->lpOleUIInsertObject->sc = hres;
501 }
502 }
503
504 return bret;
505 }
506
507
508 /***********************************************************************
509 * UIINSERTOBJECTDLG_BrowseFile
510 *
511 * Browse for the file
512 */
UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo * pdlgInfo)513 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo)
514 {
515 OPENFILENAMEA fn;
516 char fname[MAX_PATH];
517 char title[32];
518
519 fn.lStructSize = sizeof(OPENFILENAMEA);
520 fn.hwndOwner = pdlgInfo->hwndSelf;
521 fn.hInstance = 0;
522 fn.lpstrFilter = "All Files\0*.*\0\0";
523 fn.lpstrCustomFilter = NULL;
524 fn.nMaxCustFilter = 0;
525 fn.nFilterIndex = 0;
526
527 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)fname);
528 fn.lpstrFile = fname;
529 fn.nMaxFile = MAX_PATH;
530
531 fn.lpstrFileTitle = NULL;
532 fn.nMaxFileTitle = 0;
533 fn.lpstrInitialDir = NULL;
534
535 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
536 fn.lpstrTitle = title;
537
538 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
539 OFN_HIDEREADONLY | OFN_LONGNAMES;
540 fn.nFileOffset = 0;
541 fn.nFileExtension = 0;
542 fn.lpstrDefExt = NULL;
543 fn.lCustData = 0;
544 fn.lpfnHook = NULL;
545 fn.lpTemplateName = NULL;
546
547 if (GetOpenFileNameA(&fn))
548 SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, 0, (LPARAM)fn.lpstrFile);
549 }
550
551
552 /***********************************************************************
553 * UIINSERTOBJECTDLG_AddControl
554 *
555 * Add control to Object Type
556 */
UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo * pdlgInfo)557 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo)
558 {
559 OPENFILENAMEA fn;
560 char fname[MAX_PATH];
561 char title[32];
562
563 fn.lStructSize = sizeof(OPENFILENAMEA);
564 fn.hwndOwner = pdlgInfo->hwndSelf;
565 fn.hInstance = 0;
566 fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0";
567 fn.lpstrCustomFilter = NULL;
568 fn.nMaxCustFilter = 0;
569 fn.nFilterIndex = 0;
570
571 fname[0] = 0;
572 fn.lpstrFile = fname;
573 fn.nMaxFile = MAX_PATH;
574
575 fn.lpstrFileTitle = NULL;
576 fn.nMaxFileTitle = 0;
577 fn.lpstrInitialDir = NULL;
578
579 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
580 fn.lpstrTitle = title;
581
582 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
583 OFN_HIDEREADONLY | OFN_LONGNAMES;
584 fn.nFileOffset = 0;
585 fn.nFileExtension = 0;
586 fn.lpstrDefExt = NULL;
587 fn.lCustData = 0;
588 fn.lpfnHook = NULL;
589 fn.lpTemplateName = NULL;
590
591 if (GetOpenFileNameA(&fn))
592 {
593 HMODULE hMod;
594 BOOL bValid = FALSE;
595
596 hMod = LoadLibraryA(fn.lpstrFile);
597
598 if (hMod)
599 {
600 DLLREGISTER regproc;
601
602 regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer");
603 if (regproc)
604 {
605 if (S_OK == regproc())
606 {
607 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
608 bValid = TRUE;
609 }
610 }
611
612 FreeLibrary(hMod);
613 }
614
615 if (!bValid)
616 {
617 WCHAR title[32];
618 WCHAR msg[256];
619
620 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32);
621 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256);
622
623 MessageBoxW(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION);
624 }
625 }
626 }
627