# HG changeset patch # User Richard M. Stallman # Date 803616839 0 # Node ID e97b202223456c3951bc9009e1d6374cb460e1b9 # Parent dbc55496f684a997c5e7e479278ef41e1fff335a Mostly rewritten. diff -r dbc55496f684 -r e97b20222345 nt/addpm.c --- a/nt/addpm.c Tue Jun 20 02:52:38 1995 +0000 +++ b/nt/addpm.c Tue Jun 20 02:53:59 1995 +0000 @@ -18,176 +18,65 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* addpm: Adds entries to the GNU Emacs Program Manager folder. - - argv[1] = full path to program to execute - argv[2] = full path to icon for emacs (optional) +/**************************************************************************** + * + * Program: addpm (adds emacs to the Windows program manager) + * + * Usage: + * argv[1] = full path to program to execute + * argv[2] = full path to icon for emacs (optional) */ -#include // required for all Windows applications -#include // required for DDEML -#include // required for strcpy and strlen - -HDDEDATA EXPENTRY dde_callback (WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD); -BOOL send_shell_command (DWORD, LPSTR); +#include +#include +#include +#include -// Global variables -HANDLE gh_inst; // current instance - -/**************************************************************************** - FUNCTION: WinMain() - - PURPOSE: Calls initialization function, processes message loop +HDDEDATA CALLBACK DdeCallback (UINT uType, UINT uFmt, HCONV hconv, + HSZ hsz1, HSZ hsz2, HDDEDATA hdata, + DWORD dwData1, DWORD dwData2) +{ + return ((HDDEDATA)NULL); +} - PARAMETERS: - HANDLE h_instance - HANDLE h_prev_instance - LPSTR lp_cmd_line - int n_cmd_show - - RETURNS: - int -****************************************************************************/ +#define DdeCommand(str) \ + DdeClientTransaction (str, strlen(str)+1, HConversation, (HSZ)NULL, \ + CF_TEXT, XTYP_EXECUTE, 30000, NULL) -int PASCAL -WinMain (HANDLE h_instance, // current instance - HANDLE h_prev_instance, // previous instance - LPSTR lp_cmd_line, // command line - int n_cmd_show) // show-window type (open/icon) +main (argc, argv) + int argc; + char *argv[]; { - DWORD id_inst = 0L; // instance identifier - FARPROC lp_dde_proc; - char *path, *icon, *s; + DWORD idDde; + HCONV HConversation; + HSZ ProgMan; char additem[MAX_PATH*2 + 100]; - gh_inst = h_instance; - - for (path = NULL, s = lp_cmd_line; *s && isspace (*s); s++); - if (*s) + if (argc < 2 || argc > 3) { - path = s; - while (*s && !isspace (*s)) - s++; - if (*s) - *(s++) = '\0'; + fprintf(stderr, "usage: addpm exe_path [icon_path]\n"); + exit(1); } - for (icon = NULL; *s && isspace (*s); s++); - if (*s) + + DdeInitialize (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0); + + ProgMan = DdeCreateStringHandle (idDde, "PROGMAN", CP_WINANSI); + + if (HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL)) { - icon = s; - while (*s && !isspace (*s)) - s++; - if (*s) - *(s++) = '\0'; + DdeCommand ("[CreateGroup(Gnu Emacs)]"); + DdeCommand ("[ReplaceItem(Emacs)]"); + sprintf (additem, "[AddItem(%s,Emacs%c%s)]", + argv[1], (argc>2 ? ',' : ' '), + (argc>2 ? argv[2] : "")); + DdeCommand (additem); + + DdeDisconnect (HConversation); } - - lp_dde_proc = MakeProcInstance ((FARPROC) dde_callback, gh_inst); - - DdeInitialize (&id_inst, // receives instance ID - (PFNCALLBACK) lp_dde_proc, // address of callback function - APPCMD_CLIENTONLY, // this is a client app - 0L); // reserved - send_shell_command (id_inst, (LPSTR) "[CreateGroup(Gnu Emacs)]"); - - send_shell_command (id_inst, (LPSTR) "[ReplaceItem(Emacs)]"); + DdeFreeStringHandle (idDde, ProgMan); - sprintf (additem, "[AddItem(%s,Emacs%c%s)]", - path, (icon ? ',' : ' '), (icon ? icon : "")); - send_shell_command (id_inst, additem); - - DdeUninitialize (id_inst); + DdeUninitialize (idDde); return (0); } - - -/**************************************************************************** - FUNCTION: dde_callback() - - PURPOSE: Processes messages for DDEML conversation - - PARAMETERS: - WORD w_type - WORD w_fmt - HCONV h_conv - HSZ hsz1 - HSZ hsz2 - HDDEDATA h_data - DWORD dw_data1 - DWORD dw_data2 - - RETURNS: - HDDEDATA -****************************************************************************/ - -HDDEDATA EXPENTRY -dde_callback (WORD w_type, // transaction type - WORD w_fmt, // clipboard format - HCONV h_conv, // handle of the conversation - HSZ hsz1, // handle of a string - HSZ hsz2, // handle of a string - HDDEDATA h_data, // handle of a global memory object - DWORD dw_data1, // transaction-specific data - DWORD dw_data2) // transaction-specific data -{ - // Nothing need be done here... - return (HDDEDATA) NULL; -} - - -/**************************************************************************** - FUNCTION: send_shell_command() - - PURPOSE: Sends the given command string to Program Manager - - PARAMETERS: - LPSTR - pointer to command string - - RETURNS: - BOOL - TRUE if this function succeeds, FALSE otherwise -****************************************************************************/ - -BOOL -send_shell_command (DWORD id_inst, // instance identifier - LPSTR lp_command) // command string to execute -{ - HSZ hsz_serv_top; // Service and Topic name are "PROGMAN" - HCONV hconv; // handle of conversation - int n_len; // length of command string - HDDEDATA h_data; // return value of DdeClientTransaction - DWORD dw_result; // result of transaction - BOOL b_result = FALSE; // TRUE if this function is successful - - // create string handle to service/topic - hsz_serv_top = DdeCreateStringHandle (id_inst, "PROGMAN", CP_WINANSI); - - // attempt to start conversation with server app - if ((hconv = DdeConnect (id_inst, hsz_serv_top, hsz_serv_top, NULL)) - != (HCONV) NULL) - { - // get length of the command string - n_len = lstrlen ((LPSTR) lp_command); - - // send command to server app - h_data = DdeClientTransaction ((LPBYTE) lp_command, // data to pass - n_len + 1, // length of data - hconv, // handle of conversation - (HCONV) NULL, // handle of name-string - CF_TEXT, // clipboard format - XTYP_EXECUTE, // transaction type - 1000, // timeout duration - &dw_result); // transaction result - - if (h_data) - b_result = TRUE; - - // end conversation - DdeDisconnect (hconv); - } - - // free service/topic string handle - DdeFreeStringHandle (id_inst, hsz_serv_top); - - return b_result; -}