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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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