ntdll: Avoid inter-process APCs when called for the process itself.
[wine/multimedia.git] / dlls / oledlg / insobjdlg.c
blob8928b35acc429e29c1d96d05d42e7382c6c62cf0
1 /*
2 * OLEDLG library
4 * Copyright 2003 Ulrich Czekalla for CodeWeavers
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
21 #include <stdarg.h>
22 #include <stdio.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winreg.h"
27 #include "winternl.h"
28 #include "winnls.h"
29 #include "winerror.h"
30 #include "wingdi.h"
31 #include "winuser.h"
32 #include "wine/debug.h"
33 #include "wine/unicode.h"
35 #include "oledlg.h"
36 #include "resource.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(oledlg);
40 typedef struct
42 HWND hwndSelf;
43 BOOL bObjListInit; /* Object list has been initialized */
44 LPOLEUIINSERTOBJECTA lpOleUIInsertObject;
46 HWND hwndObjTypeLBL;
47 HWND hwndObjTypeLB;
48 HWND hwndFileLBL;
49 HWND hwndFileTB;
50 HWND hwndCreateCtrlCB;
51 HWND hwndCreateNewCB;
52 HWND hwndCreateFromFileCB;
53 HWND hwndDisplayIconCB;
54 HWND hwndAddCtrlBTN;
55 HWND hwndBrowseBTN;
56 HWND hwndResultDesc;
58 } InsertObjectDlgInfo;
60 INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
61 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
62 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo);
63 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo);
64 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo);
65 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo);
66 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo);
67 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo);
68 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo);
69 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo);
70 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo);
71 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo);
73 typedef HRESULT (*DLLREGISTER) (void);
75 extern HINSTANCE OLEDLG_hInstance;
76 static const char OleUIInsertObjectInfoStr[] = "OleUIInsertObjectInfoStr";
78 /***********************************************************************
79 * OleUIInsertObjectA (OLEDLG.3)
81 UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
83 LRESULT lRes;
84 LPCVOID template;
85 HRSRC hRes;
86 InsertObjectDlgInfo dlgInfo;
87 HANDLE hDlgTmpl = 0;
89 if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource)
90 FIXME("Customized template not supported\n");
92 /* Create the dialog from a template */
93 if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT),
94 (LPSTR)RT_DIALOG)))
96 return OLEUI_ERR_FINDTEMPLATEFAILURE;
99 if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) ||
100 !(template = LockResource( hDlgTmpl )))
102 return OLEUI_ERR_LOADTEMPLATEFAILURE;
105 /* Initialize InsertObjectDlgInfo structure */
106 dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject;
107 dlgInfo.bObjListInit = FALSE;
109 lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (const DLGTEMPLATE*) template,
110 lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc,
111 (LPARAM) &dlgInfo);
113 /* Unable to create the dialog */
114 if( lRes == -1)
115 return OLEUI_ERR_DIALOGFAILURE;
117 return lRes;
121 /***********************************************************************
122 * UIInsertObjectDlgProc
124 * OLE UI Insert Object dialog procedure
126 INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
128 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr);
130 switch(uMsg)
132 case WM_INITDIALOG:
134 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam;
136 pdlgInfo->hwndSelf = hwnd;
138 SetPropA(hwnd, OleUIInsertObjectInfoStr, (HANDLE) pdlgInfo);
140 UIINSERTOBJECTDLG_InitDialog(pdlgInfo);
142 return 0;
145 case WM_COMMAND:
146 return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam);
148 case WM_DESTROY:
149 if (pdlgInfo)
150 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
151 RemovePropA(hwnd, OleUIInsertObjectInfoStr);
152 return FALSE;
154 default :
155 return FALSE;
160 /***********************************************************************
161 * UIINSOBJDLG_OnWMCommand
163 * WM_COMMAND message handler
165 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
167 WORD wNotifyCode = HIWORD(wParam);
168 WORD wID = LOWORD(wParam);
169 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr);
171 switch(wID)
173 case IDOK:
174 EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo));
175 break;
177 case IDCANCEL:
178 EndDialog(hwnd, FALSE);
179 break;
181 case IDC_CREATECONTROL:
182 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
183 break;
185 case IDC_CREATENEW:
186 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
187 break;
189 case IDC_CREATEFROMFILE:
190 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
191 break;
193 case IDC_BROWSE:
194 UIINSERTOBJECTDLG_BrowseFile(pdlgInfo);
195 break;
197 case IDC_ADDCONTROL:
198 UIINSERTOBJECTDLG_AddControl(pdlgInfo);
200 case IDC_OBJTYPELIST:
202 if (wNotifyCode == LBN_SELCHANGE)
203 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
204 break;
207 return 0;
211 /***********************************************************************
212 * UIINSERTOBJECTDLG_InitDialog
214 * Initialize dialog display
216 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
218 /* Initialize InsertObjectDlgInfo data structure */
219 pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
220 pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
221 pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
222 pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
223 pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
224 pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
225 pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
226 pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
227 pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
228 pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
229 pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
231 /* Setup dialog controls based on flags */
232 if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
233 SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
235 ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
236 IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
237 ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
238 IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
239 EnableWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
240 IOF_DISABLEDISPLAYASICON) ? FALSE : TRUE);
242 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
243 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
244 else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
245 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
246 else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
247 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
251 /***********************************************************************
252 * UIINSERTOBJECTDLG_SelectCreateCtrl
254 * Select Create Control Radio Button
256 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
258 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
259 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
260 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
261 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
263 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
264 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
265 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
267 SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
269 /* Populate object type listbox */
270 if (!pdlgInfo->bObjListInit)
271 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
275 /***********************************************************************
276 * UIINSERTOBJECTDLG_SelectCreateNew
278 * Select Create New Radio Button
280 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
282 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
283 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
284 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
285 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
287 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
288 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
290 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
291 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
293 SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
295 if (!pdlgInfo->bObjListInit)
296 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
298 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
302 /***********************************************************************
303 * UIINSERTOBJECTDLG_SelectCreateFromFile
305 * Select Create From File Radio Button
307 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
309 char resstr[MAX_PATH];
311 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
312 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
313 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
315 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
316 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
318 ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW);
319 ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW);
320 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW);
322 SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0);
324 if (LoadStringA(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH))
325 SendMessageA(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr);
329 /***********************************************************************
330 * UIINSERTOBJECTDLG_PopulateObjectTypes
332 * Populate Object Type listbox
334 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo)
336 DWORD i;
337 LONG len;
338 HKEY hkclsids;
339 HKEY hkey;
340 CLSID clsid;
341 HRESULT ret;
342 CHAR szclsid[128];
343 CHAR keydesc[MAX_PATH];
344 CHAR keyname[MAX_PATH];
345 WCHAR wszclsid[128];
346 DWORD index = 0;
348 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
350 RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ, &hkclsids);
352 while (ERROR_SUCCESS == (ret = RegEnumKeyA(hkclsids, index, szclsid, MAX_PATH)))
354 index++;
356 RegOpenKeyExA(hkclsids, szclsid, 0, KEY_READ, &hkey);
358 len = MAX_PATH;
359 if (ERROR_SUCCESS != RegQueryValueA(hkey, "Insertable", keyname, &len))
360 continue;
362 len = MAX_PATH;
363 if (ERROR_SUCCESS == RegQueryValueA(hkey, "NotInsertable", keyname, &len))
364 continue;
366 RtlMultiByteToUnicodeN(wszclsid, MAX_PATH, NULL, szclsid, MAX_PATH);
367 CLSIDFromString(wszclsid, &clsid);
369 for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++)
370 if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid))
371 break;
373 if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude)
374 continue;
376 len = MAX_PATH;
377 if (ERROR_SUCCESS == RegQueryValueA(hkey, NULL, keydesc, &len))
379 CLSID* lpclsid = HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID));
380 memcpy(lpclsid, &clsid, sizeof(CLSID));
382 len = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc);
383 SendMessageA(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, (WPARAM)len, (LPARAM)lpclsid);
387 pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS);
389 return pdlgInfo->bObjListInit;
393 /***********************************************************************
394 * UIINSERTOBJECTDLG_FreeObjectTypes
396 * Free Object Types listbox
398 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo)
400 UINT i, count;
402 count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
404 for (i = 0; i < count; i++)
406 CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
407 LB_GETITEMDATA, (WPARAM)i, (LPARAM)0);
408 HeapFree(GetProcessHeap(), 0, lpclsid);
413 /***********************************************************************
414 * UIINSERTOBJECTDLG_SelChange
416 * Handle object type selection change
418 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo)
420 INT index;
421 CHAR objname[MAX_PATH];
422 CHAR objdesc[MAX_PATH];
423 CHAR resstr[MAX_PATH];
425 TRACE("\n");
427 if (LoadStringA(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) &&
428 ((index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) &&
429 SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, (WPARAM)index, (LPARAM)objname))
430 sprintf(objdesc, resstr, objname);
431 else
432 objdesc[0] = 0;
434 SendMessageA(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc);
438 /***********************************************************************
439 * UIINSERTOBJECTDLG_SelChange
441 * Handle OK Button
443 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo)
445 BOOL bret = FALSE;
447 if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) ||
448 BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0))
450 INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0);
452 if (index >= 0)
454 CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
455 LB_GETITEMDATA, (WPARAM)index, 0);
456 memcpy(&pdlgInfo->lpOleUIInsertObject->clsid, clsid, sizeof(CLSID));
458 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT)
460 pdlgInfo->lpOleUIInsertObject->sc= OleCreate(
461 &pdlgInfo->lpOleUIInsertObject->clsid,
462 &pdlgInfo->lpOleUIInsertObject->iid,
463 pdlgInfo->lpOleUIInsertObject->oleRender,
464 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
465 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
466 pdlgInfo->lpOleUIInsertObject->lpIStorage,
467 pdlgInfo->lpOleUIInsertObject->ppvObj);
470 bret = TRUE;
473 else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0))
475 char fname[MAX_PATH];
477 if (pdlgInfo->lpOleUIInsertObject->lpszFile)
479 HRESULT hres;
480 WCHAR wcsFile[MAX_PATH];
482 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)fname);
483 lstrcpynA(pdlgInfo->lpOleUIInsertObject->lpszFile, fname, pdlgInfo->lpOleUIInsertObject->cchFile);
485 RtlMultiByteToUnicodeN(wcsFile, MAX_PATH, NULL, fname, MAX_PATH);
486 if (ERROR_SUCCESS == (hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid)))
488 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT)
490 hres = OleCreateFromFile(
491 &pdlgInfo->lpOleUIInsertObject->clsid,
492 wcsFile,
493 &pdlgInfo->lpOleUIInsertObject->iid,
494 pdlgInfo->lpOleUIInsertObject->oleRender,
495 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
496 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
497 pdlgInfo->lpOleUIInsertObject->lpIStorage,
498 pdlgInfo->lpOleUIInsertObject->ppvObj);
501 bret = TRUE;
503 pdlgInfo->lpOleUIInsertObject->sc = hres;
507 return bret;
511 /***********************************************************************
512 * UIINSERTOBJECTDLG_BrowseFile
514 * Browse for the file
516 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo)
518 OPENFILENAMEA fn;
519 char fname[MAX_PATH];
520 char title[32];
522 fn.lStructSize = sizeof(OPENFILENAMEA);
523 fn.hwndOwner = pdlgInfo->hwndSelf;
524 fn.hInstance = 0;
525 fn.lpstrFilter = "All Files\0*.*\0\0";
526 fn.lpstrCustomFilter = NULL;
527 fn.nMaxCustFilter = 0;
528 fn.nFilterIndex = 0;
530 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)fname);
531 fn.lpstrFile = fname;
532 fn.nMaxFile = MAX_PATH;
534 fn.lpstrFileTitle = NULL;
535 fn.nMaxFileTitle = 0;
536 fn.lpstrInitialDir = NULL;
538 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
539 fn.lpstrTitle = title;
541 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
542 OFN_HIDEREADONLY | OFN_LONGNAMES;
543 fn.nFileOffset = 0;
544 fn.nFileExtension = 0;
545 fn.lpstrDefExt = NULL;
546 fn.lCustData = 0;
547 fn.lpfnHook = NULL;
548 fn.lpTemplateName = NULL;
550 if (GetOpenFileNameA(&fn))
551 SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, (WPARAM)0, (LPARAM)fn.lpstrFile);
555 /***********************************************************************
556 * UIINSERTOBJECTDLG_AddControl
558 * Add control to Object Type
560 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo)
562 OPENFILENAMEA fn;
563 char fname[MAX_PATH];
564 char title[32];
566 fn.lStructSize = sizeof(OPENFILENAMEA);
567 fn.hwndOwner = pdlgInfo->hwndSelf;
568 fn.hInstance = 0;
569 fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0";
570 fn.lpstrCustomFilter = NULL;
571 fn.nMaxCustFilter = 0;
572 fn.nFilterIndex = 0;
574 fname[0] = 0;
575 fn.lpstrFile = fname;
576 fn.nMaxFile = MAX_PATH;
578 fn.lpstrFileTitle = NULL;
579 fn.nMaxFileTitle = 0;
580 fn.lpstrInitialDir = NULL;
582 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
583 fn.lpstrTitle = title;
585 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
586 OFN_HIDEREADONLY | OFN_LONGNAMES;
587 fn.nFileOffset = 0;
588 fn.nFileExtension = 0;
589 fn.lpstrDefExt = NULL;
590 fn.lCustData = 0;
591 fn.lpfnHook = NULL;
592 fn.lpTemplateName = NULL;
594 if (GetOpenFileNameA(&fn))
596 HMODULE hMod;
597 BOOL bValid = FALSE;
599 hMod = LoadLibraryA(fn.lpstrFile);
601 if (hMod)
603 DLLREGISTER regproc;
605 regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer");
606 if (regproc)
608 if (S_OK == regproc())
610 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
611 bValid = TRUE;
615 FreeLibrary(hMod);
618 if (!bValid)
620 char title[32];
621 char msg[256];
623 LoadStringA(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32);
624 LoadStringA(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256);
626 MessageBoxA(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION);