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