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