From b2d91368e5e478554cc0288b9d8388f7076d0a66 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 22 Jun 2006 19:58:37 +0200 Subject: [PATCH] oleview: Added CreateInstanceOn functionality. --- programs/oleview/En.rc | 11 +++++++++++ programs/oleview/main.h | 3 ++- programs/oleview/oleview.c | 35 ++++++++++++++++++++++++++++++++++- programs/oleview/resource.h | 3 +++ programs/oleview/tree.c | 22 +++++++++++++++++++--- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/programs/oleview/En.rc b/programs/oleview/En.rc index abc4bee7e57..94ba40b8502 100644 --- a/programs/oleview/En.rc +++ b/programs/oleview/En.rc @@ -117,3 +117,14 @@ STRINGTABLE IDS_CGCOFAIL, "CoGetClassObject failed." IDS_ERROR_UNKN, "Unknown error" } + +DLG_CREATEINSTON DIALOG DISCARDABLE 0, 0, 250, 41 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "Connect to another machine" +FONT 8, "MS Shell Dlg" +{ + LTEXT "&Machine name:", IDIGNORE, 5, 6, 190, 8 + EDITTEXT IDC_MACHINE, 5, 16, 190, 12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "&OK", IDOK, 200, 5, 45, 14 + PUSHBUTTON "&Cancel", IDCANCEL, 200, 22, 45, 14 +} diff --git a/programs/oleview/main.h b/programs/oleview/main.h index f7155839b0f..1bc8cf0f8c9 100644 --- a/programs/oleview/main.h +++ b/programs/oleview/main.h @@ -51,6 +51,7 @@ typedef struct HINSTANCE hMainInst; BOOL bExpert; DWORD dwClsCtx; + WCHAR wszMachineName[MAX_LOAD_STRING]; }GLOBALS; typedef struct @@ -115,5 +116,5 @@ void AddTreeEx(void); void AddTree(void); HWND CreateTreeWindow(HINSTANCE hInst); BOOL CreateRegPath(HTREEITEM item, WCHAR *buffer, int bufSize); -void CreateInst(HTREEITEM item); +void CreateInst(HTREEITEM item, WCHAR *wszMachineName); void ReleaseInst(HTREEITEM item); diff --git a/programs/oleview/oleview.c b/programs/oleview/oleview.c index c346bcffbef..02b2b184cb2 100644 --- a/programs/oleview/oleview.c +++ b/programs/oleview/oleview.c @@ -23,6 +23,32 @@ GLOBALS globals; static WCHAR wszRegEdit[] = { 'r','e','g','e','d','i','t','.','e','x','e','\0' }; +INT_PTR CALLBACK CreateInstOnProc(HWND hDlgWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + HWND hEdit; + + switch(uMsg) + { + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDOK: + memset(globals.wszMachineName, 0, sizeof(WCHAR[MAX_LOAD_STRING])); + hEdit = GetDlgItem(hDlgWnd, IDC_MACHINE); + + if (GetWindowTextLength(hEdit)>0) + GetWindowText(hEdit, globals.wszMachineName, MAX_LOAD_STRING); + + EndDialog(hDlgWnd, IDOK); + return TRUE; + case IDCANCEL: + EndDialog(hDlgWnd, IDCANCEL); + return TRUE; + } + } + + return FALSE; +} + void ResizeChild(void) { RECT client, stat, tool; @@ -125,7 +151,14 @@ int MenuCommand(WPARAM wParam, HWND hWnd) break; case IDM_CREATEINST: hSelect = TreeView_GetSelection(globals.hTree); - CreateInst(hSelect); + CreateInst(hSelect, NULL); + SendMessage(globals.hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hSelect); + break; + case IDM_CREATEINSTON: + if(DialogBox(0, MAKEINTRESOURCE(DLG_CREATEINSTON), + hWnd, CreateInstOnProc) == IDCANCEL) break; + hSelect = TreeView_GetSelection(globals.hTree); + CreateInst(hSelect, globals.wszMachineName); SendMessage(globals.hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hSelect); break; case IDM_RELEASEINST: diff --git a/programs/oleview/resource.h b/programs/oleview/resource.h index 65fdb5e7834..2a6dc65ddb8 100644 --- a/programs/oleview/resource.h +++ b/programs/oleview/resource.h @@ -67,3 +67,6 @@ #define IDS_CGCOFAIL 300 #define IDS_ERROR_UNKN 301 + +#define DLG_CREATEINSTON 1000 +#define IDC_MACHINE 1001 diff --git a/programs/oleview/tree.c b/programs/oleview/tree.c index e59f110e2cf..9968542a132 100644 --- a/programs/oleview/tree.c +++ b/programs/oleview/tree.c @@ -50,7 +50,7 @@ LPARAM CreateITEM_INFO(INT flag, const WCHAR *info, const WCHAR *clsid) return (LPARAM)reg; } -void CreateInst(HTREEITEM item) +void CreateInst(HTREEITEM item, WCHAR *wszMachineName) { TVITEM tvi; HTREEITEM hCur; @@ -62,6 +62,8 @@ void CreateInst(HTREEITEM item) WCHAR wszRegPath[MAX_LOAD_STRING]; const WCHAR wszFormat[] = { '\n','%','s',' ','(','$','%','x',')','\n','\0' }; CLSID clsid; + COSERVERINFO remoteInfo; + MULTI_QI qi; IUnknown *obj, *unk; HRESULT hRes; @@ -86,7 +88,21 @@ void CreateInst(HTREEITEM item) if(FAILED(CLSIDFromString(((ITEM_INFO *)tvi.lParam)->clsid, &clsid))) return; - hRes = CoCreateInstance(&clsid, NULL, globals.dwClsCtx, + if(wszMachineName) + { + remoteInfo.dwReserved1 = 0; + remoteInfo.dwReserved2 = 0; + remoteInfo.pAuthInfo = NULL; + remoteInfo.pwszName = wszMachineName; + + qi.pIID = &IID_IUnknown; + + CoCreateInstanceEx(&clsid, NULL, globals.dwClsCtx|CLSCTX_REMOTE_SERVER, + &remoteInfo, 1, &qi); + hRes = qi.hr; + obj = qi.pItf; + } + else hRes = CoCreateInstance(&clsid, NULL, globals.dwClsCtx, &IID_IUnknown, (void **)&obj); if(FAILED(hRes)) @@ -637,7 +653,7 @@ LRESULT CALLBACK TreeProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(((LPNMHDR)lParam)->code) { case TVN_ITEMEXPANDING: - CreateInst(((NMTREEVIEW *)lParam)->itemNew.hItem); + CreateInst(((NMTREEVIEW *)lParam)->itemNew.hItem, NULL); break; case TVN_SELCHANGED: RefreshMenu(((NMTREEVIEW *)lParam)->itemNew.hItem);