ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

insobjdlg.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.