Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninsobjdlg.c
Go to the documentation of this file.
00001 /* 00002 * OLEDLG library 00003 * 00004 * Copyright 2003 Ulrich Czekalla for CodeWeavers 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #include <stdarg.h> 00022 #include <stdio.h> 00023 00024 #include "windef.h" 00025 #include "winbase.h" 00026 #include "winreg.h" 00027 #include "winternl.h" 00028 #include "winerror.h" 00029 #include "wingdi.h" 00030 #include "winuser.h" 00031 #include "wine/debug.h" 00032 #include "wine/unicode.h" 00033 00034 #include "oledlg.h" 00035 #include "resource.h" 00036 00037 WINE_DEFAULT_DEBUG_CHANNEL(oledlg); 00038 00039 typedef struct 00040 { 00041 HWND hwndSelf; 00042 BOOL bObjListInit; /* Object list has been initialized */ 00043 LPOLEUIINSERTOBJECTA lpOleUIInsertObject; 00044 00045 HWND hwndObjTypeLBL; 00046 HWND hwndObjTypeLB; 00047 HWND hwndFileLBL; 00048 HWND hwndFileTB; 00049 HWND hwndCreateCtrlCB; 00050 HWND hwndCreateNewCB; 00051 HWND hwndCreateFromFileCB; 00052 HWND hwndDisplayIconCB; 00053 HWND hwndAddCtrlBTN; 00054 HWND hwndBrowseBTN; 00055 HWND hwndResultDesc; 00056 00057 } InsertObjectDlgInfo; 00058 00059 static INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 00060 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam); 00061 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo); 00062 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo); 00063 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo); 00064 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo); 00065 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo); 00066 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo); 00067 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo); 00068 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo); 00069 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo); 00070 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo); 00071 00072 typedef HRESULT (*DLLREGISTER) (void); 00073 00074 extern HINSTANCE OLEDLG_hInstance; 00075 static const char OleUIInsertObjectInfoStr[] = "OleUIInsertObjectInfoStr"; 00076 00077 /*********************************************************************** 00078 * OleUIInsertObjectA (OLEDLG.3) 00079 */ 00080 UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject) 00081 { 00082 LRESULT lRes; 00083 LPCVOID template; 00084 HRSRC hRes; 00085 InsertObjectDlgInfo dlgInfo; 00086 HANDLE hDlgTmpl = 0; 00087 00088 if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource) 00089 FIXME("Customized template not supported\n"); 00090 00091 /* Create the dialog from a template */ 00092 if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT), 00093 (LPSTR)RT_DIALOG))) 00094 { 00095 return OLEUI_ERR_FINDTEMPLATEFAILURE; 00096 } 00097 00098 if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) || 00099 !(template = LockResource( hDlgTmpl ))) 00100 { 00101 return OLEUI_ERR_LOADTEMPLATEFAILURE; 00102 } 00103 00104 /* Initialize InsertObjectDlgInfo structure */ 00105 dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject; 00106 dlgInfo.bObjListInit = FALSE; 00107 00108 lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (const DLGTEMPLATE*) template, 00109 lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc, 00110 (LPARAM) &dlgInfo); 00111 00112 /* Unable to create the dialog */ 00113 if( lRes == -1) 00114 return OLEUI_ERR_DIALOGFAILURE; 00115 00116 return lRes; 00117 } 00118 00119 00120 /*********************************************************************** 00121 * UIInsertObjectDlgProc 00122 * 00123 * OLE UI Insert Object dialog procedure 00124 */ 00125 INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 00126 { 00127 InsertObjectDlgInfo* pdlgInfo = GetPropA(hwnd,OleUIInsertObjectInfoStr); 00128 00129 switch(uMsg) 00130 { 00131 case WM_INITDIALOG: 00132 { 00133 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam; 00134 00135 pdlgInfo->hwndSelf = hwnd; 00136 00137 SetPropA(hwnd, OleUIInsertObjectInfoStr, pdlgInfo); 00138 00139 UIINSERTOBJECTDLG_InitDialog(pdlgInfo); 00140 00141 return 0; 00142 } 00143 00144 case WM_COMMAND: 00145 return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam); 00146 00147 case WM_DESTROY: 00148 if (pdlgInfo) 00149 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo); 00150 RemovePropA(hwnd, OleUIInsertObjectInfoStr); 00151 return FALSE; 00152 00153 default : 00154 return FALSE; 00155 } 00156 } 00157 00158 00159 /*********************************************************************** 00160 * UIINSOBJDLG_OnWMCommand 00161 * 00162 * WM_COMMAND message handler 00163 */ 00164 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) 00165 { 00166 WORD wNotifyCode = HIWORD(wParam); 00167 WORD wID = LOWORD(wParam); 00168 InsertObjectDlgInfo* pdlgInfo = GetPropA(hwnd,OleUIInsertObjectInfoStr); 00169 00170 switch(wID) 00171 { 00172 case IDOK: 00173 EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo)); 00174 break; 00175 00176 case IDCANCEL: 00177 EndDialog(hwnd, FALSE); 00178 break; 00179 00180 case IDC_CREATECONTROL: 00181 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo); 00182 break; 00183 00184 case IDC_CREATENEW: 00185 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo); 00186 break; 00187 00188 case IDC_CREATEFROMFILE: 00189 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo); 00190 break; 00191 00192 case IDC_BROWSE: 00193 UIINSERTOBJECTDLG_BrowseFile(pdlgInfo); 00194 break; 00195 00196 case IDC_ADDCONTROL: 00197 UIINSERTOBJECTDLG_AddControl(pdlgInfo); 00198 00199 case IDC_OBJTYPELIST: 00200 { 00201 if (wNotifyCode == LBN_SELCHANGE) 00202 UIINSERTOBJECTDLG_SelChange(pdlgInfo); 00203 break; 00204 } 00205 } 00206 return 0; 00207 } 00208 00209 00210 /*********************************************************************** 00211 * UIINSERTOBJECTDLG_InitDialog 00212 * 00213 * Initialize dialog display 00214 */ 00215 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo) 00216 { 00217 /* Initialize InsertObjectDlgInfo data structure */ 00218 pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST); 00219 pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL); 00220 pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL); 00221 pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE); 00222 pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL); 00223 pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW); 00224 pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE); 00225 pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON); 00226 pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL); 00227 pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE); 00228 pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC); 00229 00230 /* Setup dialog controls based on flags */ 00231 if (pdlgInfo->lpOleUIInsertObject->lpszCaption) 00232 SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption); 00233 00234 ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags & 00235 IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE); 00236 ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags & 00237 IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE); 00238 EnableWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags & 00239 IOF_DISABLEDISPLAYASICON) ? FALSE : TRUE); 00240 00241 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL) 00242 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo); 00243 else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE) 00244 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo); 00245 else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */ 00246 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo); 00247 } 00248 00249 00250 /*********************************************************************** 00251 * UIINSERTOBJECTDLG_SelectCreateCtrl 00252 * 00253 * Select Create Control Radio Button 00254 */ 00255 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo) 00256 { 00257 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE); 00258 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE); 00259 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE); 00260 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE); 00261 00262 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW); 00263 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW); 00264 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW); 00265 00266 SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0); 00267 00268 /* Populate object type listbox */ 00269 if (!pdlgInfo->bObjListInit) 00270 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo); 00271 } 00272 00273 00274 /*********************************************************************** 00275 * UIINSERTOBJECTDLG_SelectCreateNew 00276 * 00277 * Select Create New Radio Button 00278 */ 00279 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo) 00280 { 00281 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE); 00282 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE); 00283 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE); 00284 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE); 00285 00286 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON) 00287 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW); 00288 00289 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW); 00290 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW); 00291 00292 SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0); 00293 00294 if (!pdlgInfo->bObjListInit) 00295 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo); 00296 00297 UIINSERTOBJECTDLG_SelChange(pdlgInfo); 00298 } 00299 00300 00301 /*********************************************************************** 00302 * UIINSERTOBJECTDLG_SelectCreateFromFile 00303 * 00304 * Select Create From File Radio Button 00305 */ 00306 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo) 00307 { 00308 WCHAR resstr[MAX_PATH]; 00309 00310 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE); 00311 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE); 00312 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE); 00313 00314 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON) 00315 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW); 00316 00317 ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW); 00318 ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW); 00319 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW); 00320 00321 SendMessageW(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0); 00322 00323 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH)) 00324 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr); 00325 } 00326 00327 00328 /*********************************************************************** 00329 * UIINSERTOBJECTDLG_PopulateObjectTypes 00330 * 00331 * Populate Object Type listbox 00332 */ 00333 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo) 00334 { 00335 static const WCHAR szClsid[] = {'C','L','S','I','D',0}; 00336 static const WCHAR szInsertable[] = {'I','n','s','e','r','t','a','b','l','e',0}; 00337 static const WCHAR szNotInsertable[] = {'N','o','t','I','n','s','e','r','t','a','b','l','e',0}; 00338 DWORD i; 00339 LONG len; 00340 HKEY hkclsids; 00341 HKEY hkey; 00342 CLSID clsid; 00343 LSTATUS ret; 00344 WCHAR keydesc[MAX_PATH]; 00345 WCHAR keyname[MAX_PATH]; 00346 WCHAR szclsid[128]; 00347 DWORD index = 0; 00348 00349 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo); 00350 00351 RegOpenKeyExW(HKEY_CLASSES_ROOT, szClsid, 0, KEY_READ, &hkclsids); 00352 00353 while (ERROR_SUCCESS == (ret = RegEnumKeyW(hkclsids, index, szclsid, sizeof(szclsid)/sizeof(szclsid[0])))) 00354 { 00355 index++; 00356 00357 RegOpenKeyExW(hkclsids, szclsid, 0, KEY_READ, &hkey); 00358 00359 len = sizeof(keyname); 00360 if (ERROR_SUCCESS != RegQueryValueW(hkey, szInsertable, keyname, &len)) 00361 continue; 00362 00363 len = sizeof(keyname); 00364 if (ERROR_SUCCESS == RegQueryValueW(hkey, szNotInsertable, keyname, &len)) 00365 continue; 00366 00367 CLSIDFromString(szclsid, &clsid); 00368 00369 for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++) 00370 if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid)) 00371 break; 00372 00373 if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude) 00374 continue; 00375 00376 len = sizeof(keydesc); 00377 if (ERROR_SUCCESS == RegQueryValueW(hkey, NULL, keydesc, &len)) 00378 { 00379 CLSID* lpclsid = HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID)); 00380 *lpclsid = clsid; 00381 00382 len = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc); 00383 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, len, (LPARAM)lpclsid); 00384 } 00385 } 00386 00387 pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS); 00388 00389 return pdlgInfo->bObjListInit; 00390 } 00391 00392 00393 /*********************************************************************** 00394 * UIINSERTOBJECTDLG_FreeObjectTypes 00395 * 00396 * Free Object Types listbox 00397 */ 00398 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo) 00399 { 00400 UINT i, count; 00401 00402 count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, 0, 0); 00403 00404 for (i = 0; i < count; i++) 00405 { 00406 CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB, 00407 LB_GETITEMDATA, i, 0); 00408 HeapFree(GetProcessHeap(), 0, lpclsid); 00409 } 00410 } 00411 00412 00413 /*********************************************************************** 00414 * UIINSERTOBJECTDLG_SelChange 00415 * 00416 * Handle object type selection change 00417 */ 00418 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo) 00419 { 00420 INT index; 00421 WCHAR objname[MAX_PATH]; 00422 WCHAR objdesc[MAX_PATH]; 00423 WCHAR resstr[MAX_PATH]; 00424 00425 TRACE("\n"); 00426 00427 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) && 00428 ((index = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) && 00429 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, index, (LPARAM)objname)) 00430 wsprintfW(objdesc, resstr, objname); 00431 else 00432 objdesc[0] = 0; 00433 00434 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc); 00435 } 00436 00437 00438 /*********************************************************************** 00439 * UIINSERTOBJECTDLG_SelChange 00440 * 00441 * Handle OK Button 00442 */ 00443 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo) 00444 { 00445 BOOL bret = FALSE; 00446 00447 if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) || 00448 BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0)) 00449 { 00450 INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0); 00451 00452 if (index >= 0) 00453 { 00454 CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB, 00455 LB_GETITEMDATA, index, 0); 00456 pdlgInfo->lpOleUIInsertObject->clsid = *clsid; 00457 00458 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT) 00459 { 00460 pdlgInfo->lpOleUIInsertObject->sc= OleCreate( 00461 &pdlgInfo->lpOleUIInsertObject->clsid, 00462 &pdlgInfo->lpOleUIInsertObject->iid, 00463 pdlgInfo->lpOleUIInsertObject->oleRender, 00464 pdlgInfo->lpOleUIInsertObject->lpFormatEtc, 00465 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite, 00466 pdlgInfo->lpOleUIInsertObject->lpIStorage, 00467 pdlgInfo->lpOleUIInsertObject->ppvObj); 00468 } 00469 00470 bret = TRUE; 00471 } 00472 } 00473 else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0)) 00474 { 00475 if (pdlgInfo->lpOleUIInsertObject->lpszFile) 00476 { 00477 HRESULT hres; 00478 WCHAR wcsFile[MAX_PATH]; 00479 00480 if (SendMessageW(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)wcsFile)) 00481 WideCharToMultiByte(CP_ACP, 0, wcsFile, -1, 00482 pdlgInfo->lpOleUIInsertObject->lpszFile, pdlgInfo->lpOleUIInsertObject->cchFile, NULL, NULL); 00483 00484 if (ERROR_SUCCESS == (hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid))) 00485 { 00486 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT) 00487 { 00488 hres = OleCreateFromFile( 00489 &pdlgInfo->lpOleUIInsertObject->clsid, 00490 wcsFile, 00491 &pdlgInfo->lpOleUIInsertObject->iid, 00492 pdlgInfo->lpOleUIInsertObject->oleRender, 00493 pdlgInfo->lpOleUIInsertObject->lpFormatEtc, 00494 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite, 00495 pdlgInfo->lpOleUIInsertObject->lpIStorage, 00496 pdlgInfo->lpOleUIInsertObject->ppvObj); 00497 } 00498 00499 bret = TRUE; 00500 } 00501 pdlgInfo->lpOleUIInsertObject->sc = hres; 00502 } 00503 } 00504 00505 return bret; 00506 } 00507 00508 00509 /*********************************************************************** 00510 * UIINSERTOBJECTDLG_BrowseFile 00511 * 00512 * Browse for the file 00513 */ 00514 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo) 00515 { 00516 OPENFILENAMEA fn; 00517 char fname[MAX_PATH]; 00518 char title[32]; 00519 00520 fn.lStructSize = sizeof(OPENFILENAMEA); 00521 fn.hwndOwner = pdlgInfo->hwndSelf; 00522 fn.hInstance = 0; 00523 fn.lpstrFilter = "All Files\0*.*\0\0"; 00524 fn.lpstrCustomFilter = NULL; 00525 fn.nMaxCustFilter = 0; 00526 fn.nFilterIndex = 0; 00527 00528 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)fname); 00529 fn.lpstrFile = fname; 00530 fn.nMaxFile = MAX_PATH; 00531 00532 fn.lpstrFileTitle = NULL; 00533 fn.nMaxFileTitle = 0; 00534 fn.lpstrInitialDir = NULL; 00535 00536 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32); 00537 fn.lpstrTitle = title; 00538 00539 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | 00540 OFN_HIDEREADONLY | OFN_LONGNAMES; 00541 fn.nFileOffset = 0; 00542 fn.nFileExtension = 0; 00543 fn.lpstrDefExt = NULL; 00544 fn.lCustData = 0; 00545 fn.lpfnHook = NULL; 00546 fn.lpTemplateName = NULL; 00547 00548 if (GetOpenFileNameA(&fn)) 00549 SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, 0, (LPARAM)fn.lpstrFile); 00550 } 00551 00552 00553 /*********************************************************************** 00554 * UIINSERTOBJECTDLG_AddControl 00555 * 00556 * Add control to Object Type 00557 */ 00558 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo) 00559 { 00560 OPENFILENAMEA fn; 00561 char fname[MAX_PATH]; 00562 char title[32]; 00563 00564 fn.lStructSize = sizeof(OPENFILENAMEA); 00565 fn.hwndOwner = pdlgInfo->hwndSelf; 00566 fn.hInstance = 0; 00567 fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0"; 00568 fn.lpstrCustomFilter = NULL; 00569 fn.nMaxCustFilter = 0; 00570 fn.nFilterIndex = 0; 00571 00572 fname[0] = 0; 00573 fn.lpstrFile = fname; 00574 fn.nMaxFile = MAX_PATH; 00575 00576 fn.lpstrFileTitle = NULL; 00577 fn.nMaxFileTitle = 0; 00578 fn.lpstrInitialDir = NULL; 00579 00580 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32); 00581 fn.lpstrTitle = title; 00582 00583 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | 00584 OFN_HIDEREADONLY | OFN_LONGNAMES; 00585 fn.nFileOffset = 0; 00586 fn.nFileExtension = 0; 00587 fn.lpstrDefExt = NULL; 00588 fn.lCustData = 0; 00589 fn.lpfnHook = NULL; 00590 fn.lpTemplateName = NULL; 00591 00592 if (GetOpenFileNameA(&fn)) 00593 { 00594 HMODULE hMod; 00595 BOOL bValid = FALSE; 00596 00597 hMod = LoadLibraryA(fn.lpstrFile); 00598 00599 if (hMod) 00600 { 00601 DLLREGISTER regproc; 00602 00603 regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer"); 00604 if (regproc) 00605 { 00606 if (S_OK == regproc()) 00607 { 00608 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo); 00609 bValid = TRUE; 00610 } 00611 } 00612 00613 FreeLibrary(hMod); 00614 } 00615 00616 if (!bValid) 00617 { 00618 WCHAR title[32]; 00619 WCHAR msg[256]; 00620 00621 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32); 00622 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256); 00623 00624 MessageBoxW(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION); 00625 } 00626 } 00627 } Generated on Sun May 27 2012 04:25:51 for ReactOS by
1.7.6.1
|