|
|
1.1 root 1:
2: /******************************************************************************\
3: * This is a part of the Microsoft Source Code Samples.
4: * Copyright (C) 1993 Microsoft Corporation.
5: * All rights reserved.
6: * This source code is only intended as a supplement to
7: * Microsoft Development Tools and/or WinHelp documentation.
8: * See these sources for detailed information regarding the
9: * Microsoft samples programs.
10: \******************************************************************************/
11:
12: /*
13:
14: ddeadd.c
15: DDEML Execute functions to add selected items
16: and create new group if specified.
17:
18: */
19:
20: #include <windows.h>
21: #include <stdio.h>
22: #include <string.h>
23:
24: #include "ddeinst.h"
25: #include "ddextrn.h"
26: #include "dialogs.h"
27:
28: CONVCONTEXT CCFilter = { sizeof (CONVCONTEXT), 0, 0, 0, 0L, 0L };
29:
30:
31: /********************************************************************
32:
33: StartAddThread
34:
35: Function to Start the program item addition thread.
36:
37: ********************************************************************/
38:
39: BOOL StartAddThread () {
40: HANDLE hThread;
41: LONG lThreadId;
42:
43: hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) AddProgramItems,
44: "Dummy", CREATE_SUSPENDED | STANDARD_RIGHTS_REQUIRED, &lThreadId);
45: if (hThread) {
46: SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL);
47: ResumeThread (hThread);
48:
49: /* Close the handle since we don't need it anymore */
50:
51: CloseHandle (hThread);
52: return (TRUE);
53: }/*endIf*/
54: return (FALSE);
55: }/* end StartAddThread */
56:
57: /********************************************************************
58:
59: CreateGroup
60:
61: Function that creates a group in the Program Manager. If the specified
62: name already exists the group is activated.
63:
64: ********************************************************************/
65:
66: BOOL CreateGroup () {
67: HDDEDATA hData;
68: LPSTR szText;
69: LPSTR szCommand;
70: HCONV hConv;
71: HSZ szProgMan;
72: LONG lResult;
73:
74: // Allocate a block of memory for the group name that the user has selected.
75: szText = VirtualAlloc (NULL, 64, MEM_COMMIT, PAGE_READWRITE);
76:
77: // Allocate a block of memory for the command to send to the Program Manager.
78: szCommand = VirtualAlloc (NULL, 128, MEM_COMMIT, PAGE_READWRITE);
79: if (szText) {
80: // We got the memory so we can proceed.
81:
82: // Initialize the DDE conversation here.
83:
84: if (DdeInitialize (&lIdInst, (PFNCALLBACK) GroupDDECallback,
85: (DWORD) APPCMD_CLIENTONLY, 0L)) {
86: MessageBox (ghwndMain, "DDEML Initialization Failure", "Error", MB_OK);
87: VirtualFree (szText, 128, MEM_DECOMMIT);
88: return (FALSE);
89: }/*endIf*/
90:
91: // Create a DDEML string handle for the Program Manager.
92: szProgMan = DdeCreateStringHandle (lIdInst, "PROGMAN", CP_WINANSI);
93: if (szProgMan) {
94:
95: // String handle created so continue.
96:
97: // Establish a conversation with the Program Manager.
98: hConv = DdeConnect (lIdInst, szProgMan, szProgMan, &CCFilter);
99:
100: PostMessage (hwndStatus, WM_USER_UPDATE_STATUS, 0,
101: ID_DDEML_CONNECT);
102:
103: // Retrieve the text of the combo control. This will return back what the
104: // user has typed in if nothing has been selected.
105: GetWindowText (hwndCombo, szText, 64);
106:
107: // Find out if this string is in the list or not. If not create a group
108: // Otherwise just activate the group.
109: lResult = (LONG) SendMessage (hwndCombo, CB_FINDSTRING, (WPARAM) -1,
110: (LPARAM) (LPCSTR) szText);
111: if (lResult == CB_ERR) {
112:
113: // Create the group by creating the command line.
114: // The program manager will activate an existing group if the name matches
115: // a DDE attempt to create a new group so the create versus show is somewhat
116: // redundant.
117: sprintf (szCommand, "[CreateGroup(%s)]", szText);
118:
119: // Create a DDEML data handle for the command.
120: hData = DdeCreateDataHandle (lIdInst, szCommand,
121: strlen (szCommand) + 1, 0, (HSZ) NULL, CF_TEXT, 0L);
122:
123: // Send the transaction to the server waiting a maximum of 10 seconds.
124: // The server will release the data handle.
125: if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF, hConv,
126: (HSZ) NULL, 0, XTYP_EXECUTE, 10000, &lResult)) {
127:
128: // If it fails get the error code.
129: lResult = DdeGetLastError (lIdInst);
130: MessageBox (NULL, "DdeClientTransaction Failed", "Error",
131: MB_OK);
132: }/*endIf*/
133:
134: PostMessage (hwndStatus, WM_USER_UPDATE_STATUS, 0,
135: ID_DDEML_CREATE);
136:
137: } else {
138:
139: // Group already exists so activate it.
140: sprintf (szCommand, "[ShowGroup(%s,1)]", szText);
141:
142: // Create a DDEML data handle for the command.
143: hData = DdeCreateDataHandle (lIdInst, szCommand, strlen (szCommand),
144: 0, (HSZ) NULL, CF_TEXT, 0L);
145:
146: // Send the transaction to the server waiting a maximum of 10 seconds.
147: // The server will release the data handle.
148: if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF, hConv,
149: (HSZ) NULL, 0, XTYP_EXECUTE, 10000, &lResult)) {
150:
151: // If it fails get the error code.
152: lResult = DdeGetLastError (lIdInst);
153: }/*endIf*/
154:
155: PostMessage (hwndStatus, WM_USER_UPDATE_STATUS, 0,
156: ID_DDEML_ACTIVATE);
157:
158: }/*endIf*/
159:
160: // Release the Program Manager string handle.
161: DdeFreeStringHandle (lIdInst, szProgMan);
162:
163: // Disconnect from the server.
164: DdeDisconnect (hConv);
165: PostMessage (hwndStatus, WM_USER_UPDATE_STATUS, 0,
166: ID_DDEML_COMPLETE);
167: } else {
168: lResult = DdeGetLastError (lIdInst);
169: }/*endIf*/
170:
171: // Free the two blocks of memory that were allocated.
172: VirtualFree (szText, 64, MEM_DECOMMIT);
173: VirtualFree (szCommand, 64, MEM_DECOMMIT);
174: EnableWindow (hwndAddButton, TRUE);
175:
176: // Uninitialize the conversation here so that resources are freed.
177:
178: DdeUninitialize (lIdInst);
179: lIdInst = 0L;
180: return (TRUE);
181: } else {
182: MessageBox (NULL, "Memory Allocation failure", "Error", MB_OK);
183: }/*endIf*/
184: EnableWindow (hwndAddButton, FALSE);
185: return (FALSE);
186: }/* end CreateGroup */
187:
188:
189: // Local function
190: void UpdateProgressBar (int, int);
191:
192: // Flag for progress bar update
193: BOOL fFirst;
194:
195: /********************************************************************
196:
197: AddProgramItems
198:
199: Function that uses DDEML to add program items to group in Program
200: Manager.
201:
202: ********************************************************************/
203:
204: BOOL AddProgramItems (LPSTR szDummy) {
205: char szPercent[8];
206: HDDEDATA hData;
207: HCONV hConv;
208: HSZ szProgMan;
209: int lSelCount;
210: LONG lResult;
211: LPLONG lpSelection;
212: LPSTR szProgName;
213: LPSTR szExePath;
214: LPSTR szExecuteString;
215: int iIndex;
216: int iGroupCount;
217:
218: fFirst = FALSE;
219: iGroupCount = 2;
220: // Retrieve the number of selected items from the file list.
221: lSelCount = (int) SendMessage (hwndFileList, LB_GETSELCOUNT, 0, 0L);
222:
223: // Allocate a block of memory to hold the indexes of the list selection.
224: lpSelection = VirtualAlloc (NULL, lSelCount * sizeof (int), MEM_COMMIT,
225: PAGE_READWRITE);
226: if (lpSelection) {
227:
228: // Establish a new conversation.
229: if (DdeInitialize (&lIdInst2, (PFNCALLBACK) GroupDDECallback,
230: (DWORD) APPCMD_CLIENTONLY, 0L)) {
231: VirtualFree (lpSelection, lSelCount * sizeof (int), MEM_DECOMMIT);
232: return (FALSE);
233: }/*endIf*/
234:
235: // Create a DDEML string handle for the Program Manager.
236: szProgMan = DdeCreateStringHandle (lIdInst2, "PROGMAN", CP_WINANSI);
237:
238: // Establish the conversation.
239: hConv = DdeConnect (lIdInst2, szProgMan, szProgMan, &CCFilter);
240:
241: PostMessage (hwndStatus, WM_USER_UPDATE_STATUS, 0,
242: ID_DDEML_CONNECT);
243:
244:
245: // Release the string handle that we created.
246: DdeFreeStringHandle (lIdInst2, szProgMan);
247:
248:
249: // Allocate a block of memory to hold the path and name of the item.
250: szProgName = VirtualAlloc (NULL, MAX_PATH * 2, MEM_COMMIT,
251: PAGE_READWRITE);
252: szExePath = szProgName + MAX_PATH;
253:
254: // Allocate some memory to hold the command string.
255: szExecuteString = VirtualAlloc (NULL, MAX_PATH * 4, MEM_COMMIT,
256: PAGE_READWRITE);
257:
258: // Retrieve the array of list selections.
259: SendMessage (hwndFileList, LB_GETSELITEMS, (WPARAM) lSelCount,
260: (LPARAM) lpSelection);
261:
262: // Loop through the array of selections.
263: for (iIndex = 0; iIndex < lSelCount; iIndex++) {
264:
265: // Work around for limitation for in ProgMan (no more than 50 items per group)
266: if (!(iIndex % 50) && (iIndex > 0)) {
267: LPSTR szText;
268: LPSTR szText2;
269:
270: // Allocate a block of memory for the group name
271: szText = VirtualAlloc (NULL, 64, MEM_COMMIT, PAGE_READWRITE);
272: szText2 = VirtualAlloc (NULL, 256, MEM_COMMIT, PAGE_READWRITE);
273: if (szText && szText2) {
274: GetWindowText (hwndCombo, szText, 64);
275: sprintf (szText2, "[CreateGroup(%s Part %ld )]", szText,
276: iGroupCount++);
277:
278: // Create a DDEML data handle for the command.
279: hData = DdeCreateDataHandle (lIdInst2, szText2,
280: strlen (szText2) + 1, 0, (HSZ) NULL, CF_TEXT, 0L);
281:
282: // Send the transaction to the server waiting a maximum of 10 seconds.
283: // The server will release the data handle.
284: if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF, hConv,
285: (HSZ) NULL, 0, XTYP_EXECUTE, 10000, &lResult)) {
286: // If it fails get the error code.
287: lResult = DdeGetLastError (lIdInst);
288: MessageBox (NULL, "DdeClientTransaction Failed",
289: "Error", MB_OK);
290: }/*endIf*/
291: VirtualFree (szText, 64, MEM_DECOMMIT);
292: VirtualFree (szText2, 256, MEM_DECOMMIT);
293: }
294: }/*endIf*/
295:
296: // Retrieve the Name of the Program Item to add.
297: SendMessage (hwndFileList2, LB_GETTEXT, (WPARAM) lpSelection[iIndex],
298: (LPARAM) szProgName);
299:
300: // Set the name in the progress dialog
301: SetDlgItemText (hwndDialog, IDL_ITEMNAME, szProgName);
302:
303: // Retrieve the absolute path of the item to add.
304: SendMessage (hwndPathList, LB_GETTEXT, (WPARAM) lpSelection[iIndex],
305: (LPARAM) szExePath);
306:
307: // Set the path in the progress dialog
308: SetDlgItemText (hwndDialog, IDL_EXEPATH, szExePath);
309:
310: // Set the percentage in the progress dialog
311: sprintf (szPercent, "%d%%", (iIndex * 100) / lSelCount);
312: SetDlgItemText (hwndDialog, IDL_PERCENTAGE, szPercent);
313: UpdateProgressBar (iIndex + 1, lSelCount);
314:
315: // Create the command string to add the item.
316: sprintf (szExecuteString, "[AddItem(%s,%s)]", szExePath,
317: (LPARAM) szProgName);
318:
319: // Create a DDEML Data handle for the command string.
320: hData = DdeCreateDataHandle (lIdInst2, szExecuteString,
321: strlen (szExecuteString) + 1, 0, (HSZ) NULL, CF_TEXT, 0L);
322:
323: // Send the command over to the program manager.
324: if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF,
325: hConv, (HSZ) NULL, 0, XTYP_EXECUTE, 1000, &lResult)) {
326: lResult = DdeGetLastError (lIdInst2);
327: }/*endIf*/
328: }/*endFor*/
329:
330: // Release the memory allocated for path and name retrieval.
331: VirtualFree (szProgName, MAX_PATH * 2, MEM_DECOMMIT);
332:
333: // Release the command line memory.
334: VirtualFree (szExecuteString, MAX_PATH * 4, MEM_DECOMMIT);
335:
336: // Disoconnect the DDEML Conversation
337: DdeDisconnect (hConv);
338:
339: // Release the memory allocate for the list selections.
340: VirtualFree (lpSelection, lSelCount * sizeof (int), MEM_DECOMMIT);
341: }/*endIf*/
342:
343: // Clear the selection in the lists.
344:
345: SendMessage (hwndFileList, LB_SETSEL, (WPARAM) FALSE, (LPARAM) -1);
346: SendMessage (hwndFileList2, LB_SETSEL, (WPARAM) FALSE, (LPARAM) -1);
347: EnableWindow (hwndAddAll, FALSE);
348:
349: // Uninitialize the local conversation.
350: DdeUninitialize (lIdInst2);
351:
352: if (hwndDialog) {
353: PostMessage (ghwndMain, WM_USER_CLOSE_DIALOG, 0, 0L);
354: }/*endIf*/
355: lIdInst2 = 0L;
356: if (fBatch) {
357: PostMessage (ghwndMain, WM_COMMAND, (WPARAM)
358: (WPARAM) MAKELONG (ID_EXITBUTTON, BN_CLICKED),
359: (LPARAM) hwndExitButton);
360: }/*endIf*/
361: return (TRUE);
362: }/* end AddProgramItems */
363:
364:
365: HWND hwndBar;
366: RECT rc;
367: double iStep;
368: HBRUSH hBrush;
369:
370: /********************************************************************
371:
372: UpdateProgressBar
373:
374: Function to update the progress bar in the dialog while items are
375: added to the Program Manager.
376:
377: ********************************************************************/
378:
379: void UpdateProgressBar (int iIndex, int iCount) {
380: HDC hdc;
381:
382: if (!fFirst) {
383: hwndBar = GetDlgItem (hwndDialog, IDL_PROGRESSBAR);
384: if (hwndBar) {
385: GetClientRect (hwndBar, &rc);
386: fFirst = TRUE;
387: } else {
388: return;
389: }/*endIf*/
390: iStep = (double) rc.right / (double) iCount;
391: hBrush = GetStockObject (BLACK_BRUSH);
392: }/*endIf*/
393: hdc = GetDC (hwndBar);
394: rc.right = (int) (iStep * (double) iIndex);
395: FillRect (hdc, &rc, hBrush);
396: ReleaseDC (hwndBar, hdc);
397:
398: PostMessage (hwndStatus, WM_USER_UPDATE_STATUS, iIndex, ID_DDEML_ADD);
399: }/* end UpdateProgressBar */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.