xref: /reactos/dll/win32/oledlg/insobjdlg.c (revision a9efcbe8)
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