Piotr Caban : oleview: Added open TypeLib file functionality.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 3 05:22:57 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: ecd514d5d6b9b0457f64cbebbd8c93a6fbfa2485
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=ecd514d5d6b9b0457f64cbebbd8c93a6fbfa2485

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Sun Jul  2 13:04:26 2006 +0200

oleview: Added open TypeLib file functionality.

---

 programs/oleview/En.rc       |    1 +
 programs/oleview/Makefile.in |    2 +-
 programs/oleview/main.h      |    3 ++-
 programs/oleview/oleview.c   |   36 +++++++++++++++++++++++++++++++++++-
 programs/oleview/resource.h  |    2 ++
 programs/oleview/typelib.c   |   23 +++++++++++++++--------
 6 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/programs/oleview/En.rc b/programs/oleview/En.rc
index f5b3a28..dfb09aa 100644
--- a/programs/oleview/En.rc
+++ b/programs/oleview/En.rc
@@ -95,6 +95,7 @@ STRINGTABLE
     IDS_ABOUT              "OleView - OLE/COM Object Viewer"
     IDS_ABOUTVER           "version 1.0"
     IDS_TYPELIBTITLE       "ITypeLib viewer"
+    IDS_OPEN               "Open"
 
     IDM_BIND,              "Bind to file via a File Moniker"
     IDM_TYPELIB,           "Open a TypeLib file and view the contents"
diff --git a/programs/oleview/Makefile.in b/programs/oleview/Makefile.in
index 2df5004..00fc481 100644
--- a/programs/oleview/Makefile.in
+++ b/programs/oleview/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = oleview.exe
 APPMODE   = -mwindows -municode
-IMPORTS   = comctl32 shell32 oleaut32 ole32 user32 advapi32 kernel32
+IMPORTS   = comdlg32 comctl32 shell32 oleaut32 ole32 user32 advapi32 kernel32
 EXTRALIBS = -luuid
 EXTRADEFS = -DUNICODE
 
diff --git a/programs/oleview/main.h b/programs/oleview/main.h
index ad200fb..689e01f 100644
--- a/programs/oleview/main.h
+++ b/programs/oleview/main.h
@@ -108,6 +108,7 @@ typedef struct
     HWND hTree;
     HWND hEdit;
     HWND hStatusBar;
+    WCHAR wszFileName[MAX_LOAD_STRING];
 }TYPELIB;
 
 extern GLOBALS globals;
@@ -138,7 +139,7 @@ void CreateInst(HTREEITEM item, WCHAR *w
 void ReleaseInst(HTREEITEM item);
 
 /* typelib.c */
-BOOL CreateTypeLibWindow(HINSTANCE hInst);
+BOOL CreateTypeLibWindow(HINSTANCE hInst, WCHAR *wszFileName);
 BOOL TypeLibRegisterClass(void);
 
 /* interface.c */
diff --git a/programs/oleview/oleview.c b/programs/oleview/oleview.c
index 73980b2..88ce725 100644
--- a/programs/oleview/oleview.c
+++ b/programs/oleview/oleview.c
@@ -25,6 +25,13 @@ static WCHAR wszRegEdit[] = { 'r','e','g
 static WCHAR wszFormat[] = { '<','o','b','j','e','c','t','\n',' ',' ',' ',
     'c','l','a','s','s','i','d','=','\"','c','l','s','i','d',':','%','s','\"','\n',
     '>','\n','<','/','o','b','j','e','c','t','>','\0' };
+WCHAR wszFilter[] = { 'T','y','p','e','L','i','b',' ','F','i','l','e','s',' ',
+    '(','*','t','l','b',';','*','o','l','b',';','*','.','d','l','l',';',
+    '*','.','o','c','x',';','*','.','e','x','e',')','\0',
+    '*','.','t','l','b',';','*','.','o','l','b',';','*','.','d','l','l',';',
+    '*','.','o','c','x','*','.','e','x','e','\0',
+    'A','l','l',' ','F','i','l','e','s',' ','(','*','.','*',')','\0',
+    '*','.','*','\0','\0' };
 
 INT_PTR CALLBACK SysConfProc(HWND hDlgWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
@@ -124,6 +131,22 @@ INT_PTR CALLBACK CreateInstOnProc(HWND h
     return FALSE;
 }
 
+void InitOpenFileName(HWND hWnd, OPENFILENAME *pofn, WCHAR *wszFilter,
+        WCHAR *wszTitle, WCHAR *wszFileName)
+{
+    memset(pofn, 0, sizeof(OPENFILENAME));
+    pofn->lStructSize = sizeof(OPENFILENAME);
+    pofn->hwndOwner = hWnd;
+    pofn->hInstance = globals.hMainInst;
+
+    pofn->lpstrTitle = wszTitle;
+    pofn->lpstrFilter = wszFilter;
+    pofn->nFilterIndex = 0;
+    pofn->lpstrFile = wszFileName;
+    pofn->nMaxFile = MAX_LOAD_STRING;
+    pofn->Flags = OFN_HIDEREADONLY;
+}
+
 void CopyClsid(HTREEITEM item)
 {
     TVITEM tvi;
@@ -380,10 +403,21 @@ int MenuCommand(WPARAM wParam, HWND hWnd
                     vis ? MF_UNCHECKED : MF_CHECKED);
             ResizeChild();
             break;
+        case IDM_TYPELIB:
+            {
+            OPENFILENAME ofn;
+            static WCHAR wszTitle[MAX_LOAD_STRING];
+            static WCHAR wszName[MAX_LOAD_STRING];
+
+            LoadString(globals.hMainInst, IDS_OPEN, wszTitle, sizeof(wszTitle));
+            InitOpenFileName(hWnd, &ofn, wszFilter, wszTitle, wszName);
+            if(GetOpenFileName(&ofn)) CreateTypeLibWindow(globals.hMainInst, wszName);
+            break;
+            }
         case IDM_VIEW:
             hSelect = TreeView_GetSelection(globals.hTree);
             if(IsInterface(hSelect)) InterfaceViewer(hSelect);
-            else CreateTypeLibWindow(globals.hMainInst);
+            else CreateTypeLibWindow(globals.hMainInst, NULL);
             break;
         case IDM_EXIT:
             DestroyWindow(hWnd);
diff --git a/programs/oleview/resource.h b/programs/oleview/resource.h
index 5d7818b..73cde3d 100644
--- a/programs/oleview/resource.h
+++ b/programs/oleview/resource.h
@@ -29,6 +29,8 @@ #define IDS_READY                  10
 #define IDS_ABOUT                  20
 #define IDS_ABOUTVER               21
 
+#define IDS_OPEN                   30
+
 #define IDM_BIND                   100
 #define IDM_TYPELIB                101
 #define IDM_SYSCONF                102
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index 09275f4..3fb8689 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -30,7 +30,6 @@ void AddToStrW(WCHAR *wszDest, const WCH
 
 int PopulateTree(void)
 {
-    TVITEM tvi;
     TVINSERTSTRUCT tvis;
     ITypeLib *pTypeLib;
     ITypeInfo *pTypeInfo, *pRefTypeInfo;
@@ -64,9 +63,6 @@ int PopulateTree(void)
     const WCHAR wszVT_BSTR[] = { 'B','S','T','R',' ','\0' };
     const WCHAR wszVT_CY[] = { 'C','U','R','R','E','N','C','Y',' ','\0' };
 
-    memset(&tvi, 0, sizeof(TVITEM));
-    tvi.hItem = TreeView_GetSelection(globals.hTree);
-
     U(tvis).item.mask = TVIF_TEXT|TVIF_CHILDREN;
     U(tvis).item.cchTextMax = MAX_LOAD_STRING;
     U(tvis).item.pszText = wszText;
@@ -74,15 +70,14 @@ int PopulateTree(void)
     tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
     tvis.hParent = TVI_ROOT;
 
-    SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
-    if(FAILED((hRes = LoadTypeLib(((ITEM_INFO*)tvi.lParam)->path, &pTypeLib))))
+    if(FAILED((hRes = LoadTypeLib(typelib.wszFileName, &pTypeLib))))
     {
         WCHAR wszMessage[MAX_LOAD_STRING];
         WCHAR wszError[MAX_LOAD_STRING];
 
         LoadString(globals.hMainInst, IDS_ERROR_LOADTYPELIB,
                 wszError, sizeof(WCHAR[MAX_LOAD_STRING]));
-        wsprintfW(wszMessage, wszError, ((ITEM_INFO*)tvi.lParam)->path, hRes);
+        wsprintfW(wszMessage, wszError, typelib.wszFileName, hRes);
         MessageBox(globals.hMainWnd, wszMessage, NULL, MB_OK|MB_ICONEXCLAMATION);
         return 1;
     }
@@ -261,11 +256,23 @@ BOOL TypeLibRegisterClass(void)
     return TRUE;
 }
 
-BOOL CreateTypeLibWindow(HINSTANCE hInst)
+BOOL CreateTypeLibWindow(HINSTANCE hInst, WCHAR *wszFileName)
 {
     WCHAR wszTitle[MAX_LOAD_STRING];
     LoadString(hInst, IDS_TYPELIBTITLE, wszTitle, sizeof(WCHAR[MAX_LOAD_STRING]));
 
+    if(wszFileName) lstrcpyW(typelib.wszFileName, wszFileName);
+    else
+    {
+        TVITEM tvi;
+
+        memset(&tvi, 0, sizeof(TVITEM));
+        tvi.hItem = TreeView_GetSelection(globals.hTree);
+
+        SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+        lstrcpyW(typelib.wszFileName, ((ITEM_INFO*)tvi.lParam)->path);
+    }
+
     globals.hTypeLibWnd = CreateWindow(wszTypeLib, wszTitle,
             WS_OVERLAPPEDWINDOW|WS_VISIBLE,
             CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInst, NULL);




More information about the wine-cvs mailing list