oleview: Added open TypeLib file functionality.
This commit is contained in:
parent
fa7e97e80d
commit
ecd514d5d6
|
@ -95,6 +95,7 @@ STRINGTABLE
|
||||||
IDS_ABOUT "OleView - OLE/COM Object Viewer"
|
IDS_ABOUT "OleView - OLE/COM Object Viewer"
|
||||||
IDS_ABOUTVER "version 1.0"
|
IDS_ABOUTVER "version 1.0"
|
||||||
IDS_TYPELIBTITLE "ITypeLib viewer"
|
IDS_TYPELIBTITLE "ITypeLib viewer"
|
||||||
|
IDS_OPEN "Open"
|
||||||
|
|
||||||
IDM_BIND, "Bind to file via a File Moniker"
|
IDM_BIND, "Bind to file via a File Moniker"
|
||||||
IDM_TYPELIB, "Open a TypeLib file and view the contents"
|
IDM_TYPELIB, "Open a TypeLib file and view the contents"
|
||||||
|
|
|
@ -4,7 +4,7 @@ SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = oleview.exe
|
MODULE = oleview.exe
|
||||||
APPMODE = -mwindows -municode
|
APPMODE = -mwindows -municode
|
||||||
IMPORTS = comctl32 shell32 oleaut32 ole32 user32 advapi32 kernel32
|
IMPORTS = comdlg32 comctl32 shell32 oleaut32 ole32 user32 advapi32 kernel32
|
||||||
EXTRALIBS = -luuid
|
EXTRALIBS = -luuid
|
||||||
EXTRADEFS = -DUNICODE
|
EXTRADEFS = -DUNICODE
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,7 @@ typedef struct
|
||||||
HWND hTree;
|
HWND hTree;
|
||||||
HWND hEdit;
|
HWND hEdit;
|
||||||
HWND hStatusBar;
|
HWND hStatusBar;
|
||||||
|
WCHAR wszFileName[MAX_LOAD_STRING];
|
||||||
}TYPELIB;
|
}TYPELIB;
|
||||||
|
|
||||||
extern GLOBALS globals;
|
extern GLOBALS globals;
|
||||||
|
@ -138,7 +139,7 @@ void CreateInst(HTREEITEM item, WCHAR *wszMachineName);
|
||||||
void ReleaseInst(HTREEITEM item);
|
void ReleaseInst(HTREEITEM item);
|
||||||
|
|
||||||
/* typelib.c */
|
/* typelib.c */
|
||||||
BOOL CreateTypeLibWindow(HINSTANCE hInst);
|
BOOL CreateTypeLibWindow(HINSTANCE hInst, WCHAR *wszFileName);
|
||||||
BOOL TypeLibRegisterClass(void);
|
BOOL TypeLibRegisterClass(void);
|
||||||
|
|
||||||
/* interface.c */
|
/* interface.c */
|
||||||
|
|
|
@ -25,6 +25,13 @@ static WCHAR wszRegEdit[] = { 'r','e','g','e','d','i','t','.','e','x','e','\0' }
|
||||||
static WCHAR wszFormat[] = { '<','o','b','j','e','c','t','\n',' ',' ',' ',
|
static WCHAR wszFormat[] = { '<','o','b','j','e','c','t','\n',' ',' ',' ',
|
||||||
'c','l','a','s','s','i','d','=','\"','c','l','s','i','d',':','%','s','\"','\n',
|
'c','l','a','s','s','i','d','=','\"','c','l','s','i','d',':','%','s','\"','\n',
|
||||||
'>','\n','<','/','o','b','j','e','c','t','>','\0' };
|
'>','\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)
|
INT_PTR CALLBACK SysConfProc(HWND hDlgWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
@ -124,6 +131,22 @@ INT_PTR CALLBACK CreateInstOnProc(HWND hDlgWnd, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
return FALSE;
|
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)
|
void CopyClsid(HTREEITEM item)
|
||||||
{
|
{
|
||||||
TVITEM tvi;
|
TVITEM tvi;
|
||||||
|
@ -380,10 +403,21 @@ int MenuCommand(WPARAM wParam, HWND hWnd)
|
||||||
vis ? MF_UNCHECKED : MF_CHECKED);
|
vis ? MF_UNCHECKED : MF_CHECKED);
|
||||||
ResizeChild();
|
ResizeChild();
|
||||||
break;
|
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:
|
case IDM_VIEW:
|
||||||
hSelect = TreeView_GetSelection(globals.hTree);
|
hSelect = TreeView_GetSelection(globals.hTree);
|
||||||
if(IsInterface(hSelect)) InterfaceViewer(hSelect);
|
if(IsInterface(hSelect)) InterfaceViewer(hSelect);
|
||||||
else CreateTypeLibWindow(globals.hMainInst);
|
else CreateTypeLibWindow(globals.hMainInst, NULL);
|
||||||
break;
|
break;
|
||||||
case IDM_EXIT:
|
case IDM_EXIT:
|
||||||
DestroyWindow(hWnd);
|
DestroyWindow(hWnd);
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
#define IDS_ABOUT 20
|
#define IDS_ABOUT 20
|
||||||
#define IDS_ABOUTVER 21
|
#define IDS_ABOUTVER 21
|
||||||
|
|
||||||
|
#define IDS_OPEN 30
|
||||||
|
|
||||||
#define IDM_BIND 100
|
#define IDM_BIND 100
|
||||||
#define IDM_TYPELIB 101
|
#define IDM_TYPELIB 101
|
||||||
#define IDM_SYSCONF 102
|
#define IDM_SYSCONF 102
|
||||||
|
|
|
@ -30,7 +30,6 @@ void AddToStrW(WCHAR *wszDest, const WCHAR *wszSource)
|
||||||
|
|
||||||
int PopulateTree(void)
|
int PopulateTree(void)
|
||||||
{
|
{
|
||||||
TVITEM tvi;
|
|
||||||
TVINSERTSTRUCT tvis;
|
TVINSERTSTRUCT tvis;
|
||||||
ITypeLib *pTypeLib;
|
ITypeLib *pTypeLib;
|
||||||
ITypeInfo *pTypeInfo, *pRefTypeInfo;
|
ITypeInfo *pTypeInfo, *pRefTypeInfo;
|
||||||
|
@ -64,9 +63,6 @@ int PopulateTree(void)
|
||||||
const WCHAR wszVT_BSTR[] = { 'B','S','T','R',' ','\0' };
|
const WCHAR wszVT_BSTR[] = { 'B','S','T','R',' ','\0' };
|
||||||
const WCHAR wszVT_CY[] = { 'C','U','R','R','E','N','C','Y',' ','\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.mask = TVIF_TEXT|TVIF_CHILDREN;
|
||||||
U(tvis).item.cchTextMax = MAX_LOAD_STRING;
|
U(tvis).item.cchTextMax = MAX_LOAD_STRING;
|
||||||
U(tvis).item.pszText = wszText;
|
U(tvis).item.pszText = wszText;
|
||||||
|
@ -74,15 +70,14 @@ int PopulateTree(void)
|
||||||
tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
|
tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
|
||||||
tvis.hParent = TVI_ROOT;
|
tvis.hParent = TVI_ROOT;
|
||||||
|
|
||||||
SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
|
if(FAILED((hRes = LoadTypeLib(typelib.wszFileName, &pTypeLib))))
|
||||||
if(FAILED((hRes = LoadTypeLib(((ITEM_INFO*)tvi.lParam)->path, &pTypeLib))))
|
|
||||||
{
|
{
|
||||||
WCHAR wszMessage[MAX_LOAD_STRING];
|
WCHAR wszMessage[MAX_LOAD_STRING];
|
||||||
WCHAR wszError[MAX_LOAD_STRING];
|
WCHAR wszError[MAX_LOAD_STRING];
|
||||||
|
|
||||||
LoadString(globals.hMainInst, IDS_ERROR_LOADTYPELIB,
|
LoadString(globals.hMainInst, IDS_ERROR_LOADTYPELIB,
|
||||||
wszError, sizeof(WCHAR[MAX_LOAD_STRING]));
|
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);
|
MessageBox(globals.hMainWnd, wszMessage, NULL, MB_OK|MB_ICONEXCLAMATION);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -261,11 +256,23 @@ BOOL TypeLibRegisterClass(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CreateTypeLibWindow(HINSTANCE hInst)
|
BOOL CreateTypeLibWindow(HINSTANCE hInst, WCHAR *wszFileName)
|
||||||
{
|
{
|
||||||
WCHAR wszTitle[MAX_LOAD_STRING];
|
WCHAR wszTitle[MAX_LOAD_STRING];
|
||||||
LoadString(hInst, IDS_TYPELIBTITLE, wszTitle, sizeof(WCHAR[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,
|
globals.hTypeLibWnd = CreateWindow(wszTypeLib, wszTitle,
|
||||||
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
|
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
|
||||||
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInst, NULL);
|
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInst, NULL);
|
||||||
|
|
Loading…
Reference in New Issue