Stub DDE interface for Progman.exe

Jeremiah Flerchinger jeremiah.flerchinger at gmail.com
Mon Feb 2 23:24:23 CST 2009


Stubs basic DDE interface of Progman.exe. Similar to Progman stub in
shell32.dll. Both will need to be extended and a 3rd progman interface
will need to be added in user32.
---
 programs/progman/main.c |  148 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/programs/progman/main.c b/programs/progman/main.c
index 83a346c..51dbcff 100644
--- a/programs/progman/main.c
+++ b/programs/progman/main.c
@@ -29,6 +29,13 @@
 
 GLOBALS Globals;
 
+/* String handles */
+static HSZ hszProgmanTopic;
+static HSZ hszProgmanService;
+static HSZ hszAppProperties;
+/* DDE Instance ID */
+static DWORD dwDDEInst;
+
 static VOID MAIN_CreateGroups(void);
 static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
 static ATOM MAIN_RegisterMainWinClass(void);
@@ -40,6 +47,94 @@ static VOID WineWarranty(HWND Wnd);
 
 #define BUFFER_SIZE 1000
 
+static inline void Dde_OnConnectConfirm(HCONV hconv, HSZ hszTopic, HSZ hszService)
+{
+    printf("Progman.exe: Dde_OnConnectConfirm stub\n");
+}
+
+static inline BOOL Dde_OnWildConnect(HSZ hszTopic, HSZ hszService)
+{
+    printf("Progman.exe: Dde_OnWildConnect stub\n");
+    return FALSE;
+}
+
+static inline HDDEDATA Dde_OnRequest(UINT uFmt, HCONV hconv, HSZ hszTopic,
+                                     HSZ hszItem)
+{
+    printf("Progman.exe: Dde_OnRequest stub\n");
+    return NULL;
+}
+
+static inline DWORD Dde_OnExecute(HCONV hconv, HSZ hszTopic, HDDEDATA hdata)
+{
+    BYTE * pszCommand;
+
+    pszCommand = DdeAccessData(hdata, NULL);
+    if (!pszCommand)
+        return DDE_FNOTPROCESSED;
+
+    printf("Progman.exe: Dde_OnExecute stub: %s\n", pszCommand);
+
+    DdeUnaccessData(hdata);
+
+    return DDE_FNOTPROCESSED;
+}
+
+static inline void Dde_OnDisconnect(HCONV hconv)
+{
+    printf("Progman.exe: Dde_OnDisconnect stub\n");
+}
+
+static HDDEDATA CALLBACK DdeCallback(UINT wType, UINT fmt, HCONV hConv, HSZ hszTopic, HSZ hszItem, HDDEDATA hData, DWORD dwData1, DWORD dwData2)
+{
+  char strBuff1[16];
+  char strBuff2[16];
+  if(DdeQueryString(dwDDEInst, hszTopic, strBuff1, 16, CP_WINANSI) != 0)
+  {
+    if(DdeQueryString(dwDDEInst, hszItem, strBuff2, 16, CP_WINANSI) != 0)
+    {
+      printf("Progman.exe: stub DdeCallback hszTopic=%s hszItem=%s \n", strBuff1, strBuff2);
+    }
+    else
+    {
+      printf("Progman.exe: stub DdeCallback hszTopic=%s \n", strBuff1);
+    }
+  }
+  switch (wType)
+  {
+    case XTYP_CONNECT:
+        printf("Progman.exe: XTYP_CONNECT stub return TRUE - Note DDE functionality is limited\n");
+        if ((hszTopic == hszProgmanTopic) && (hszItem == hszProgmanService))
+        {
+            printf("Progman.exe: XTYP_CONNECT stub return TRUE - Note DDE functionality is limited\n");
+            return TRUE;
+        }
+        printf("Progman.exe: XTYP_CONNECT stub return FALSE - DDE connection rejected\n");
+        return FALSE;
+    case XTYP_CONNECT_CONFIRM:
+        printf("Progman.exe: XTYP_CONNECT_CONFIRM stub\n");
+        Dde_OnConnectConfirm(hConv, hszTopic, hszItem);
+        return NULL;
+    case XTYP_WILDCONNECT:
+        printf("Progman.exe: XTYP_WILDCONNECT stub\n");
+        return (HDDEDATA)(DWORD_PTR)Dde_OnWildConnect(hszTopic, hszItem);
+    case XTYP_REQUEST:
+        printf("Progman.exe: XTYP_REQUEST stub\n");
+        return Dde_OnRequest(fmt, hConv, hszTopic, hszItem);
+    case XTYP_EXECUTE:
+        printf("Progman.exe: XTYP_EXECUTE stub\n");
+        return (HDDEDATA)(DWORD_PTR)Dde_OnExecute(hConv, hszTopic, hData);
+    case XTYP_DISCONNECT:
+        printf("Progman.exe: XTYP_DISCONNECT stub\n");
+        Dde_OnDisconnect(hConv);
+        return NULL;
+    default:
+        printf("Progman.exe: XTYP type=0h%X (%i) default stub\n", wType, wType);
+        return NULL;
+  }
+}
+
+
 /***********************************************************************
  *
  *           WinMain
@@ -48,6 +143,9 @@ static VOID WineWarranty(HWND Wnd);
 int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
 {
   MSG      msg;
+  static const WCHAR wszProgman[] = {'P','R','O','G','M','A','N',0};
+  static const WCHAR wszAppProperties[] =
+            {'A','p','p','P','r','o','p','e','r','t','i','e','s',0};
 
   Globals.lpszIniFile         = "progman.ini";
   Globals.lpszIcoFile         = "progman.ico";
@@ -56,6 +154,12 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show
   Globals.hGroups             = 0;
   Globals.hActiveGroup        = 0;
 
+  /**/
+  DdeInitializeW(&dwDDEInst, DdeCallback, APPCLASS_STANDARD, 0);
+  hszProgmanTopic = DdeCreateStringHandleW(dwDDEInst, wszProgman, CP_WINUNICODE);
+  hszProgmanService = DdeCreateStringHandleW(dwDDEInst, wszProgman, CP_WINUNICODE);
+  DdeNameService(dwDDEInst, hszProgmanService, 0, DNS_REGISTER);
+
   /* Read Options from `progman.ini' */
   Globals.bAutoArrange =
     GetPrivateProfileInt("Settings", "AutoArrange", 0, Globals.lpszIniFile);
@@ -102,6 +206,14 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show
 	TranslateMessage (&msg);
 	DispatchMessage (&msg);
       }
+
+  /* close dde*/
+  DdeNameService(dwDDEInst, 0, 0, DNS_UNREGISTER);
+  DdeFreeStringHandle(dwDDEInst, hszProgmanService);
+  DdeFreeStringHandle(dwDDEInst, hszProgmanTopic);
+  DdeFreeStringHandle(dwDDEInst, hszAppProperties);
+
+  DdeUninitialize(dwDDEInst);
   return 0;
 }
 
@@ -167,6 +279,13 @@ VOID MAIN_AutoStart(void)
 static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT msg,
 				 WPARAM wParam, LPARAM lParam)
 {
+    int maxstrcount = 255;
+    int strcount;
+    char strService[maxstrcount];
+    char strTopic[maxstrcount];
+    UINT_PTR		uiLo, uiHi;
+    ATOM atomApplication;
+    ATOM atomTopic;
 #if 0
   printf("M %4.4x %4.4x\n", msg, wParam);
 #endif
@@ -190,6 +309,35 @@ static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT msg,
     case WM_DESTROY:
       PostQuitMessage (0);
       break;
+    case WM_DDE_INITIATE:
+      uiLo = LOWORD(lParam);
+      uiHi = HIWORD(lParam);
+      strcount = GlobalGetAtomName(uiLo, strService, maxstrcount);
+      strcount = GlobalGetAtomName(uiHi, strTopic, maxstrcount);
+      printf("Progman.exe: WM_DDE_INITIATE stub Service=%s Topic=%s \n", strService, strTopic);
+      break;
+    case WM_DDE_POKE:
+      printf("Progman.exe: WM_DDE_POKE stub \n");
+      break;
+    case WM_DDE_EXECUTE:
+      printf("Progman.exe: WM_DDE_EXECUTE stub \n");
+      break;
+    case WM_DDE_DATA:
+      printf("Progman.exe: WM_DDE_DATA stub \n");
+      break;
+    case WM_DDE_ADVISE:
+      printf("Progman.exe: WM_DDE_ADVISE stub \n");
+      break;
+    case WM_DDE_UNADVISE:
+      printf("Progman.exe: WM_DDE_UNADVISE stub \n");
+      break;
+    case WM_DDE_REQUEST:
+      printf("Progman.exe: WM_DDE_REQUEST stub \n");
+      break;
+    case WM_DDE_TERMINATE:
+      printf("Progman.exe: WM_DDE_TERMINATE stub \n");
+//      PostMessage( (HWND)wParam, WM_DDE_TERMINATE, (WPARAM)hWnd, 0);
+      break;
     }
   return(DefFrameProc(hWnd, Globals.hMDIWnd, msg, wParam, lParam));
 }
-- 
1.5.6.3




More information about the wine-patches mailing list