|
|
1.1 root 1: /************************************************************************\
2: *
3: * PROGRAM: LINKTEST.C
4: *
5: * PURPOSE: A simple demonstration of an executable file linking
6: * with and calling into a DLL we created. This necessitates
7: * the creation of a .LIB file for the DLL, which is used
8: * when linking the .EXE. Doing this eliminates the need
9: * for explicitly loading the DLL (via LoadLibrary()) at
10: * runtime.
11: *
12: * FUNTIONS: WinMain() - initialization, create window, msg loop
13: * MainWndProc() - processes main window msgs
14: * ThreadProc() - makes a single call into "THE_DLL.DLL"
15: *
16: \************************************************************************/
17:
18: #include <windows.h>
19: #include "linktest.h"
20: #include "the_dll.h"
21:
22:
23:
24: /************************************************************************\
25: *
26: * FUNCTION: WinMain (standard WinMain INPUTS/RETURNS)
27: *
28: * GLOBAL VARS: hwndMain - handle of main app window
29: *
30: * LOCAL VARS: msg - msg to get/dispatch
31: *
32: \************************************************************************/
33:
34: int APIENTRY WinMain (HANDLE hInstance,HANDLE hPrevInstance,
35: LPSTR lpCmdLine, int nCmdShow)
36: { MSG msg;
37:
38: if (!hPrevInstance)
39: {
40: WNDCLASS wc;
41:
42: wc.style = NULL;
43: wc.lpfnWndProc = (WNDPROC)MainWndProc;
44: wc.cbClsExtra = 0;
45: wc.cbWndExtra = 0;
46: wc.hInstance = hInstance;
47: wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
48: wc.hCursor = LoadCursor (NULL, IDC_ARROW);
49: wc.hbrBackground = GetStockObject (WHITE_BRUSH);
50: wc.lpszMenuName = (LPSTR) "Menu";
51: wc.lpszClassName = (LPSTR) "LINKTEST";
52:
53: if (!RegisterClass (&wc))
54: { MessageBox (NULL, "WinMain(): RegisterClass() failed",
55: "Err! - LINKTEST", MB_OK | MB_ICONHAND);
56: return(FALSE);
57: }
58: }
59:
60: if (!(hwndMain = CreateWindow ("LINKTEST",
61: "LINKTEST Sample Application",
62: WS_OVERLAPPEDWINDOW,
63: CW_USEDEFAULT, CW_USEDEFAULT,
64: CW_USEDEFAULT, CW_USEDEFAULT,
65: NULL, NULL, hInstance, NULL)))
66: return (NULL);
67:
68: ShowWindow(hwndMain, nCmdShow);
69:
70: while (GetMessage(&msg, NULL, NULL, NULL))
71: { TranslateMessage(&msg);
72: DispatchMessage(&msg);
73: }
74: return (msg.wParam);
75: UNREFERENCED_PARAMETER(lpCmdLine);
76: }
77:
78:
79:
80: /************************************************************************\
81: *
82: * FUNCTION: MainWndProc (standard window procedure INPUTS/RETURNS)
83: *
84: * COMMENTS: Menuitems IDM_DLLFUNCTION1 through IDM_DLLDIALOGBOX are
85: * all processed by calling their respective functions in
86: * "THE_DLL.DLL". The "CreateThread" menuitem causes a thread
87: * to be created- the thread then calls into "THE_DLL.DLL".
88: *
89: \************************************************************************/
90:
91: LONG APIENTRY MainWndProc (HWND hwnd, UINT message, UINT wParam,
92: LONG lParam)
93: { switch (message)
94: { case WM_COMMAND:
95: switch (LOWORD(wParam))
96: { case IDM_CREATETHREAD:
97: { DWORD threadId;
98:
99: CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadProc,
100: NULL, NULL, &threadId);
101: break;
102: }
103: case IDM_DLLFUNCTION1:
104: DLLFunction1 ();
105: break;
106: case IDM_DLLFUNCTION2:
107: DLLFunction2 ((int) 0);
108: break;
109: case IDM_DLLFUNCTION3:
110: DLLFunction3 ((HANDLE) NULL);
111: break;
112: case IDM_DLLFUNCTION4:
113: DLLFunction4 ((HWND) NULL);
114: break;
115: case IDM_DLLDIALOGBOX:
116: DLLDialogBox (hwnd);
117: break;
118: default:
119: break;
120: }
121: break;
122: case WM_DESTROY:
123: PostQuitMessage(NULL);
124: break;
125: default:
126: return (DefWindowProc(hwnd, message, wParam, lParam));
127: }
128: return (NULL);
129: }
130:
131:
132:
133: /************************************************************************\
134: *
135: * FUNCTION: Thread
136: *
137: * GLOBAL VARS: hwndMain - handle of main app window
138: *
139: \************************************************************************/
140:
141: void ThreadProc ()
142: {
143: MessageBox (hwndMain, "calling DLLFunction1", "ThreadProc()", MB_OK);
144: DLLFunction1 ();
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.