OleView: Added interface viewer
Piotr Caban
piotr.caban at gmail.com
Sat Jun 24 03:33:29 CDT 2006
Hi,
Changelog:
- Added interface viewer
programs/oleview/En.rc | 42 ++++++++++
programs/oleview/Makefile.in | 1
programs/oleview/interface.c | 176
++++++++++++++++++++++++++++++++++++++++++
programs/oleview/main.h | 5 +
programs/oleview/oleview.c | 13 ++-
programs/oleview/resource.h | 14 +++
6 files changed, 248 insertions(+), 3 deletions(-)
--
Piotr
-------------- next part --------------
diff --git a/programs/oleview/En.rc b/programs/oleview/En.rc
index 767fc2c..1d68f24 100644
--- a/programs/oleview/En.rc
+++ b/programs/oleview/En.rc
@@ -141,3 +141,45 @@ FONT 8, "MS Shell Dlg"
DEFPUSHBUTTON "&OK", IDOK, 70, 80, 45, 14
PUSHBUTTON "&Cancel", IDCANCEL, 120, 80, 45, 14
}
+
+DLG_DEFAULT_IV DIALOG DISCARDABLE 0, 0, 280, 50
+STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU
+CAPTION "Default Interface Viewer"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Interface", IDIGNORE, 5, 6, 50, 8
+ LTEXT "", IDC_LABEL, 60, 6, 145, 8
+ LTEXT "IID:", IDIGNORE, 5, 16, 50, 8
+ LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8
+ DEFPUSHBUTTON "&Close", IDCANCEL, 230, 6, 45, 14
+ PUSHBUTTON "&View Type Info", IDC_VIEWTYPEINFO, 6, 31, 70, 14, WS_DISABLED
+}
+
+DLG_IPERSIST_IV DIALOG DISCARDABLE 0, 0, 280, 29
+STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU
+CAPTION "IPersist Interface Viewer"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Class Name:", IDIGNORE, 5, 6, 50, 8
+ LTEXT "", IDC_LABEL, 60, 6, 145, 8
+ LTEXT "CLSID:", IDIGNORE, 5, 16, 50, 8
+ LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8
+ DEFPUSHBUTTON "&Close", IDCANCEL, 230, 6, 45, 14
+}
+
+DLG_IPERSISTSTREAM_IV DIALOG DISCARDABLE 0, 0, 280, 68
+STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU
+CAPTION "IPersistStream Interface Viewer"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Class Name:", IDIGNORE, 5, 6, 50, 8
+ LTEXT "", IDC_LABEL, 60, 6, 145, 8
+ LTEXT "CLSID:", IDIGNORE, 5, 16, 50, 8
+ LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8
+ DEFPUSHBUTTON "&Close", IDCANCEL, 230, 6, 45, 14
+ PUSHBUTTON "&IsDirty", IDC_ISDIRTY_BUTTON, 6, 31, 50, 14
+ LTEXT "???", IDC_ISDIRTY, 60, 34, 145, 8
+ PUSHBUTTON "&GetSizeMax", IDC_GETSIZEMAX_BUTTON, 6, 49, 50, 14
+ LTEXT "???", IDC_GETSIZEMAX, 60, 52, 145, 8
+}
+
diff --git a/programs/oleview/Makefile.in b/programs/oleview/Makefile.in
index 236a3de..818edc0 100644
--- a/programs/oleview/Makefile.in
+++ b/programs/oleview/Makefile.in
@@ -10,6 +10,7 @@ EXTRADEFS = -DUNICODE
C_SRCS = \
details.c \
+ interface.c \
oleview.c \
pane.c \
tree.c
diff --git a/programs/oleview/interface.c b/programs/oleview/interface.c
new file mode 100644
index 0000000..5eb1b98
--- /dev/null
+++ b/programs/oleview/interface.c
@@ -0,0 +1,176 @@
+/*
+ * OleView (interface.c)
+ *
+ * Copyright 2006 Piotr Caban
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "main.h"
+
+typedef struct
+{
+ WCHAR *wszLabel;
+ WCHAR *wszIdentifier;
+}DIALOG_INFO;
+
+BOOL IsInterface(HTREEITEM item)
+{
+ TVITEM tvi;
+
+ memset(&tvi, 0, sizeof(TVITEM));
+ tvi.hItem = item;
+
+ SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+ if(!tvi.lParam) return FALSE;
+
+ if(((ITEM_INFO*)tvi.lParam)->cFlag & INTERFACE) return TRUE;
+ return FALSE;
+}
+
+IUnknown *GetInterface(void)
+{
+ HTREEITEM hSelect;
+ TVITEM tvi;
+ CLSID clsid;
+ IUnknown *unk;
+
+ hSelect = TreeView_GetSelection(globals.hTree);
+
+ memset(&tvi, 0, sizeof(TVITEM));
+ tvi.hItem = hSelect;
+ SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+ CLSIDFromString(((ITEM_INFO *)tvi.lParam)->clsid, &clsid);
+
+ memset(&tvi, 0, sizeof(TVITEM));
+ tvi.hItem = TreeView_GetParent(globals.hTree, hSelect);
+ SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+
+ IUnknown_QueryInterface(((ITEM_INFO *)tvi.lParam)->pU, &clsid, (void *)&unk);
+
+ return unk;
+}
+
+INT_PTR CALLBACK InterfaceViewerProc(HWND hDlgWnd, UINT uMsg,
+ WPARAM wParam, LPARAM lParam)
+{
+ DIALOG_INFO *di;
+ HWND hObject;
+ IUnknown *unk;
+ HRESULT hRes;
+ ULARGE_INTEGER size;
+ WCHAR wszSize[MAX_LOAD_STRING];
+ WCHAR wszTRUE[] = { 'T','R','U','E','\0' };
+ WCHAR wszFALSE[] = { 'F','A','L','S','E','\0' };
+ WCHAR wszFormat[] = { '%','d',' ','b','y','t','e','s','\0' };
+
+ switch(uMsg)
+ {
+ case WM_INITDIALOG:
+ di = (DIALOG_INFO *)lParam;
+ hObject = GetDlgItem(hDlgWnd, IDC_LABEL);
+ SetWindowText(hObject, di->wszLabel);
+ hObject = GetDlgItem(hDlgWnd, IDC_IDENTIFIER);
+ SetWindowText(hObject, di->wszIdentifier);
+ return TRUE;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ EndDialog(hDlgWnd, IDCANCEL);
+ return TRUE;
+ case IDC_ISDIRTY_BUTTON:
+ unk = GetInterface();
+ hRes = IPersistStream_IsDirty((IPersistStream *)unk);
+ IUnknown_Release(unk);
+ hObject = GetDlgItem(hDlgWnd, IDC_ISDIRTY);
+ SetWindowText(hObject, hRes == S_OK ? wszFALSE : wszTRUE);
+ return TRUE;
+ case IDC_GETSIZEMAX_BUTTON:
+ unk = GetInterface();
+ IPersistStream_GetSizeMax((IPersistStream *)unk, &size);
+ IUnknown_Release(unk);
+ wsprintfW(wszSize, wszFormat, size);
+ hObject = GetDlgItem(hDlgWnd, IDC_GETSIZEMAX);
+ SetWindowText(hObject, wszSize);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void IPersistStreamInterfaceViewer(WCHAR *clsid)
+{
+ DIALOG_INFO di;
+ WCHAR wszClassMoniker[] = { 'C','l','a','s','s','M','o','n','i','k','e','r','\0' };
+
+ di.wszLabel = wszClassMoniker;
+ di.wszIdentifier = clsid;
+
+ DialogBoxParam(0, MAKEINTRESOURCE(DLG_IPERSISTSTREAM_IV),
+ globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
+}
+
+void IPersistInterfaceViewer(WCHAR *clsid)
+{
+ DIALOG_INFO di;
+ WCHAR wszClassMoniker[] = { 'C','l','a','s','s','M','o','n','i','k','e','r','\0' };
+
+ di.wszLabel = wszClassMoniker;
+ di.wszIdentifier = clsid;
+
+ DialogBoxParam(0, MAKEINTRESOURCE(DLG_IPERSIST_IV),
+ globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
+}
+
+void DefaultInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
+{
+ DIALOG_INFO di;
+
+ di.wszLabel = wszName;
+ di.wszIdentifier = clsid;
+
+ DialogBoxParam(0, MAKEINTRESOURCE(DLG_DEFAULT_IV),
+ globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
+}
+
+void InterfaceViewer(HTREEITEM item)
+{
+ TVITEM tvi;
+ WCHAR *clsid;
+ WCHAR wszName[MAX_LOAD_STRING];
+ WCHAR wszIPersistStream[] = { '{','0','0','0','0','0','1','0','9','-',
+ '0','0','0','0','-','0','0','0','0','-','C','0','0','0','-',
+ '0','0','0','0','0','0','0','0','0','0','4','6','}','\0' };
+ WCHAR wszIPersist[] = { '{','0','0','0','0','0','1','0','C','-',
+ '0','0','0','0','-','0','0','0','0','-','C','0','0','0','-',
+ '0','0','0','0','0','0','0','0','0','0','4','6','}','\0' };
+
+ memset(&tvi, 0, sizeof(TVITEM));
+ tvi.mask = TVIF_TEXT;
+ tvi.hItem = item;
+ tvi.cchTextMax = MAX_LOAD_STRING;
+ tvi.pszText = wszName;
+
+ SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+ clsid = ((ITEM_INFO*)tvi.lParam)->clsid;
+
+ if(!memcmp(clsid, wszIPersistStream, sizeof(wszIPersistStream)))
+ IPersistStreamInterfaceViewer(clsid);
+
+ else if(!memcmp(clsid, wszIPersist, sizeof(wszIPersist)))
+ IPersistInterfaceViewer(clsid);
+
+ else DefaultInterfaceViewer(clsid, wszName);
+}
diff --git a/programs/oleview/main.h b/programs/oleview/main.h
index 1bc8cf0..19188ba 100644
--- a/programs/oleview/main.h
+++ b/programs/oleview/main.h
@@ -118,3 +118,8 @@ HWND CreateTreeWindow(HINSTANCE hInst);
BOOL CreateRegPath(HTREEITEM item, WCHAR *buffer, int bufSize);
void CreateInst(HTREEITEM item, WCHAR *wszMachineName);
void ReleaseInst(HTREEITEM item);
+
+/* interface.h */
+BOOL IsInterface(HTREEITEM item);
+void InterfaceViewer(HTREEITEM item);
+
diff --git a/programs/oleview/oleview.c b/programs/oleview/oleview.c
index fa6bdd9..c0b17ba 100644
--- a/programs/oleview/oleview.c
+++ b/programs/oleview/oleview.c
@@ -203,6 +203,8 @@ void RefreshMenu(HTREEITEM item)
tvi.hItem = item;
SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+ parent = TreeView_GetParent(globals.hTree, item);
+
SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_CREATEINST, FALSE);
SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, FALSE);
SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_VIEW, FALSE);
@@ -228,7 +230,8 @@ void RefreshMenu(HTREEITEM item)
SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, TRUE);
}
}
- else if(tvi.lParam && ((ITEM_INFO *)tvi.lParam)->cFlag&INTERFACE)
+ else if(tvi.lParam &&
+ (((ITEM_INFO *)tvi.lParam)->cFlag&INTERFACE || parent==tree.hTL))
{
EnableMenuItem(hMenu, IDM_TYPEINFO, MF_GRAYED);
EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
@@ -249,8 +252,8 @@ void RefreshMenu(HTREEITEM item)
EnableMenuItem(hMenu, IDM_HTMLTAG, MF_GRAYED);
EnableMenuItem(hMenu, IDM_VIEW, MF_GRAYED);
}
- parent = TreeView_GetParent(globals.hTree, item);
- if(parent==tree.hAID || parent==tree.hGBCC || parent==tree.hTL)
+
+ if(parent==tree.hAID || parent==tree.hGBCC)
EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
}
@@ -377,6 +380,10 @@ int MenuCommand(WPARAM wParam, HWND hWnd
vis ? MF_UNCHECKED : MF_CHECKED);
ResizeChild();
break;
+ case IDM_VIEW:
+ hSelect = TreeView_GetSelection(globals.hTree);
+ if(IsInterface(hSelect)) InterfaceViewer(hSelect);
+ break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
diff --git a/programs/oleview/resource.h b/programs/oleview/resource.h
index 3554108..983138e 100644
--- a/programs/oleview/resource.h
+++ b/programs/oleview/resource.h
@@ -74,3 +74,17 @@ #define IDC_MACHINE 1001
#define DLG_SYSCONF 1010
#define IDC_ENABLEDCOM 1011
#define IDC_ENABLEREMOTE 1012
+
+#define DLG_IPERSIST_IV 1020
+
+#define DLG_DEFAULT_IV 1030
+#define IDC_VIEWTYPEINFO 1031
+#define IDC_LABEL 1032
+#define IDC_IDENTIFIER 1033
+
+#define DLG_IPERSISTSTREAM_IV 1040
+#define IDC_ISDIRTY 1041
+#define IDC_GETSIZEMAX 1042
+#define IDC_ISDIRTY_BUTTON 1043
+#define IDC_GETSIZEMAX_BUTTON 1044
+
More information about the wine-patches
mailing list