OleView: Added CreateInstanceOn functionality

Piotr Caban piotr.caban at gmail.com
Thu Jun 22 12:58:37 CDT 2006


Hi,

Changelog:
 - Added CreateInstanceOn functionality

 programs/oleview/En.rc      |   12 ++++++++++++
 programs/oleview/main.h     |    3 ++-
 programs/oleview/oleview.c  |   35 ++++++++++++++++++++++++++++++++++-
 programs/oleview/resource.h |    4 ++++
 programs/oleview/tree.c     |   22 +++++++++++++++++++---
 5 files changed, 71 insertions(+), 5 deletions(-)

--
Piotr

-------------- next part --------------
diff --git a/programs/oleview/En.rc b/programs/oleview/En.rc
index 45e905a..354bd75 100644
--- a/programs/oleview/En.rc
+++ b/programs/oleview/En.rc
@@ -117,3 +117,15 @@ 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 f715583..1bc8cf0 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 c346bcf..02b2b18 100644
--- a/programs/oleview/oleview.c
+++ b/programs/oleview/oleview.c
@@ -23,6 +23,32 @@ #include "main.h"
 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 65fdb5e..d4889fe 100644
--- a/programs/oleview/resource.h
+++ b/programs/oleview/resource.h
@@ -67,3 +67,7 @@ #define IDS_TAB_ACTIV              252
 
 #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 e59f110..9968542 100644
--- a/programs/oleview/tree.c
+++ b/programs/oleview/tree.c
@@ -50,7 +50,7 @@ LPARAM CreateITEM_INFO(INT flag, const W
     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, UIN
             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);



More information about the wine-patches mailing list