Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

140 lines
3.9 KiB

/****************************** Module Header ******************************\
* Module Name: register.c
*
* DDE Manager - server registration module
*
* Created: 4/15/94 sanfords
* to allow interoperability between DDEML16 and DDEML32
\***************************************************************************/
#include <windows.h>
#include <string.h>
#include "ddemlp.h"
/*
* interoperable DDEML service registration is accomplished via the
* two messages UM_REGISTER and UM_UNREGISTER. (WM_USER range)
* wParam=gaApp,
* lParam=src hwndListen, (for instance specific HSZ generation.)
* These messages are sent and the sender is responsible for freeing
* the gaApp.
*/
/*
* Broadcast-sends the given message to all top-level windows of szClass
* except to hwndSkip.
*/
VOID SendMessageToClass(
ATOM atomClass,
UINT msg,
GATOM ga,
HWND hwndFrom,
HWND *ahwndSkip,
int chwndSkip,
BOOL fPost)
{
HWND hwnd;
int i;
BOOL fSkipIt;
hwnd = GetWindow(GetDesktopWindow(), GW_CHILD);
while (hwnd != NULL) {
if (GetClassWord(hwnd, GCW_ATOM) == atomClass) {
fSkipIt = FALSE;
for (i = 0; i < chwndSkip; i++) {
if (hwnd == ahwndSkip[i]) {
fSkipIt = TRUE;
break;
}
}
if (!fSkipIt) {
IncHszCount(ga); // receiver frees
if (fPost) {
PostMessage(hwnd, msg, (WPARAM)ga, (LPARAM)hwndFrom);
} else {
SendMessage(hwnd, msg, (WPARAM)ga, (LPARAM)hwndFrom);
}
}
}
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
}
/*
* Broadcast-sends a UM_REGISTER or UM_UNREGISTER message to all DDEML16
* and DDEML32 listening windows in the system except hwndSkip.
*/
VOID RegisterService(
BOOL fRegister,
GATOM gaApp,
HWND hwndListen)
{
PAPPINFO paiT;
int cSkips = 1;
HWND *ahwndSkip;
int i;
extern ATOM gatomDDEMLMom;
extern ATOM gatomDMGClass;
/*
* First send (always!) to our own guys the same way we used to
* for compatability. WordPerfect 6.0a relies on this!
*/
for (paiT = pAppInfoList; paiT != NULL; paiT = paiT->next) {
IncHszCount(gaApp); // receiver frees atom
SendMessage(paiT->hwndDmg,
fRegister ? UM_REGISTER : UM_UNREGISTER,
(WPARAM)gaApp, (LPARAM)hwndListen);
cSkips++;
}
/*
* build up the hwndskip list.
*/
ahwndSkip = (HWND *)LocalAlloc(LPTR, sizeof(HWND) * cSkips);
if (ahwndSkip == NULL) {
return;
}
for (paiT = pAppInfoList, i = 0;
paiT != NULL;
paiT = paiT->next, i++) {
ahwndSkip[i] = paiT->hwndDmg;
}
AssertF(gatomDDEMLMom, "gatomDDEMLMom not initialized in RegisterService");
AssertF(gatomDMGClass, "gatomDMGClass not initialized in RegisterService");
/*
* Send notification to each DDEML32 listening window.
*/
SendMessageToClass(gatomDDEMLMom, fRegister ? UM_REGISTER : UM_UNREGISTER,
gaApp, hwndListen, ahwndSkip, i, fRegister);
/*
* Send notification to each DDEML16 listening window.
*/
SendMessageToClass(gatomDMGClass, fRegister ? UM_REGISTER : UM_UNREGISTER,
gaApp, hwndListen, ahwndSkip, i, fRegister);
LocalFree((HLOCAL)ahwndSkip);
}
LRESULT ProcessRegistrationMessage(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
/*
* wParam = GATOM of app
* lParam = hwndListen of source
*/
DoCallback((PAPPINFO)GetWindowWord(hwnd, GWW_PAI), (HCONV)0L, (HSZ)wParam,
MakeInstAppName(wParam, (HWND)lParam), 0,
msg == UM_REGISTER ? XTYP_REGISTER : XTYP_UNREGISTER,
(HDDEDATA)0, 0L, 0L);
GlobalDeleteAtom((ATOM)wParam); // receiver frees.
return(1);
}