source: trunk/src/ole32/regsvr32.cpp@ 6871

Last change on this file since 6871 was 6855, checked in by sandervl, 24 years ago

* empty log message *

File size: 7.5 KB
Line 
1/* $Id: regsvr32.cpp,v 1.6 2001-09-28 07:49:05 sandervl Exp $ */
2/*
3 * RegSvr32 for OS/2
4 *
5 * 1/9/99
6 *
7 * Copyright 1999 David J. Raison
8 *
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13
14#include <windows.h>
15#include <odinlx.h>
16#include <stdarg.h>
17#include <stdio.h>
18#include <string.h>
19#include <ctype.h>
20#include <heapstring.h>
21
22// ======================================================================
23// Local Data
24// ======================================================================
25static int fRegister = 1;
26static int fSilent = 0;
27static char szFile[1024];
28static HANDLE hdlObject;
29
30// ======================================================================
31// Prototypes.
32// ======================================================================
33
34static HRESULT parse_command(int argc, char * argv[]);
35static HRESULT load_object(void);
36static HRESULT register_object(void);
37static HRESULT deregister_object(void);
38static HRESULT unload_object(void);
39static HRESULT sign_on(void);
40static HRESULT sign_off(void);
41static HRESULT report_msg(char * fmt, ...);
42static HRESULT report_err(HRESULT hr, char * fmt, ...);
43static HRESULT usage(char * fmt, ...);
44static int WIN32API EntryPoint(HINSTANCE hInstance, HINSTANCE hPrevInstance,
45 LPSTR lpCmdLine, int nCmdShow);
46
47// ======================================================================
48// Public API's
49// ======================================================================
50
51// ----------------------------------------------------------------------
52// main
53// ----------------------------------------------------------------------
54int main(int argc, char *argv[])
55{
56 RegisterLxExe(EntryPoint, NULL);
57
58 HRESULT hr;
59
60 if((hr = sign_on()) != S_OK)
61 return hr;
62
63 if((hr = parse_command(argc, argv)) != S_OK)
64 return hr;
65
66 if((hr = load_object()) != S_OK)
67 return hr;
68
69 if (fRegister)
70 hr = register_object();
71 else
72 hr = deregister_object();
73
74 if (hr != S_OK)
75 return hr;
76
77 if((hr = unload_object()) != S_OK)
78 return hr;
79
80 return sign_off();
81}
82
83// ======================================================================
84// Private functions.
85// ======================================================================
86
87// ----------------------------------------------------------------------
88// EntryPoint
89// ----------------------------------------------------------------------
90static int WIN32API EntryPoint
91 (HINSTANCE hInstance,
92 HINSTANCE hPrevInstance,
93 LPSTR lpCmdLine,
94 int nCmdShow)
95{
96 return S_OK;
97}
98
99// ----------------------------------------------------------------------
100// sign_on
101// ----------------------------------------------------------------------
102static HRESULT sign_on(void)
103{
104 HRESULT hr;
105
106 hr = OleInitialize(NULL);
107 if (hr != S_OK)
108 return report_err(hr, "Error initialising OLE");
109
110 return S_OK;
111}
112
113// ----------------------------------------------------------------------
114// sign_off
115// ----------------------------------------------------------------------
116static HRESULT sign_off(void)
117{
118 OleUninitialize();
119 return report_msg("%s initialised OK", szFile);
120}
121
122// ----------------------------------------------------------------------
123// parse_command
124// ----------------------------------------------------------------------
125static HRESULT parse_command(int argc, char * argv[])
126{
127 int ii;
128 char * pArg;
129
130 // Initial conditions.
131 fRegister = 1;
132 fSilent = 0;
133 szFile[0] = 0;
134
135 // Loop through args...
136 for (ii = 1; ii < argc; ii++)
137 {
138 pArg = argv[ii];
139
140 if ((pArg[0] == '-') || (pArg[0] == '/'))
141 {
142 switch(toupper(pArg[1]))
143 {
144 case 'S':
145 {
146 fSilent = 1;
147 break;
148 }
149
150 case 'U':
151 {
152 fRegister = 0;
153 break;
154 }
155
156 default:
157 {
158 return usage("Unknown switch '%c'", pArg[1] );
159 }
160 }
161 }
162 else if (strlen(szFile) == 0)
163 {
164 strcpy(szFile, pArg);
165 }
166 else
167 {
168 return usage("Too many files specified");
169 }
170 }
171 if (strlen(szFile) == 0)
172 return usage("No file specified");
173
174 return S_OK;
175}
176
177// ----------------------------------------------------------------------
178// load_object
179// ----------------------------------------------------------------------
180static HRESULT load_object(void)
181{
182 LPOLESTR libnameW = (LPOLESTR)HEAP_strdupAtoW(GetProcessHeap(), 0, szFile);
183 hdlObject = CoLoadLibrary(libnameW, TRUE);
184 HeapFree(GetProcessHeap(), 0, libnameW);
185 if (hdlObject == 0)
186 return report_err(S_FALSE, "Failed to load '%s'", szFile);
187
188 return S_OK;
189}
190
191// ----------------------------------------------------------------------
192// register_object
193// ----------------------------------------------------------------------
194static HRESULT register_object(void)
195{
196 typedef HRESULT(*LPFNREGISTER)(void);
197
198 LPFNREGISTER pfnRegister;
199 HRESULT hr;
200
201 pfnRegister = (LPFNREGISTER)GetProcAddress(hdlObject, "DllRegisterServer");
202
203 if (pfnRegister == NULL)
204 return report_err(S_FALSE, "Unable to locate registration entry point in '%s'", szFile);
205
206 hr = pfnRegister();
207 if (hr != S_OK)
208 return report_err(hr, "Registration for '%s' returned error 0x%08lx", szFile, hr);
209
210 return S_OK;
211}
212
213// ----------------------------------------------------------------------
214// deregister_object
215// ----------------------------------------------------------------------
216static HRESULT deregister_object(void)
217{
218 typedef HRESULT(*LPFNUNREGISTER)(void);
219
220 LPFNUNREGISTER pfnUnregister;
221 HRESULT hr;
222
223 pfnUnregister = (LPFNUNREGISTER)GetProcAddress(hdlObject, "DllUnregisterServer");
224
225 if (pfnUnregister == NULL)
226 return report_err(S_FALSE, "Unable to locate unregistration entry point in '%s'", szFile);
227
228 hr = pfnUnregister();
229 if (hr != S_OK)
230 return report_err(hr, "Unregistration for '%s' returned error 0x%08lx", szFile, hr);
231
232 return S_OK;
233}
234
235// ----------------------------------------------------------------------
236// unload_object
237// ----------------------------------------------------------------------
238static HRESULT unload_object(void)
239{
240 CoFreeLibrary(hdlObject);
241 return S_OK;
242}
243
244// ----------------------------------------------------------------------
245// report_msg
246// ----------------------------------------------------------------------
247static HRESULT report_msg(char * fmt, ...)
248{
249 if (!fSilent)
250 {
251 va_list va_ptr;
252 HWND hwnd = GetDesktopWindow();
253 char text[1024];
254
255 va_start(va_ptr, fmt);
256 vsprintf(text, fmt, va_ptr);
257 va_end(va_ptr);
258
259 MessageBoxA(hwnd, text, "RegSvr32", MB_OK | MB_ICONINFORMATION);
260 }
261 return S_OK;
262}
263
264// ----------------------------------------------------------------------
265// report_err
266// ----------------------------------------------------------------------
267static HRESULT report_err(HRESULT hr, char * fmt, ...)
268{
269 va_list va_ptr;
270 HWND hwnd = GetDesktopWindow();
271 char text[1024];
272
273 va_start(va_ptr, fmt);
274 vsprintf(text, fmt, va_ptr);
275 va_end(va_ptr);
276
277 MessageBoxA(hwnd, text, "RegSvr32", MB_OK | MB_ICONERROR);
278
279 return hr;
280}
281
282// ----------------------------------------------------------------------
283// usage
284// ----------------------------------------------------------------------
285static HRESULT usage(char * fmt, ...)
286{
287 va_list va_ptr;
288 HWND hwnd = GetDesktopWindow();
289 char text[256];
290 char msg[1024];
291
292 va_start(va_ptr, fmt);
293 vsprintf(text, fmt, va_ptr);
294 va_end(va_ptr);
295 sprintf(msg, "Error - %s\n\n"
296 "Usage:\n"
297 "regsvr32 [/s] [/u] filename\n"
298 "where\n"
299 "/s - silent completion\n"
300 "/u - unregister", text);
301
302 MessageBoxA(hwnd, msg, "RegSvr32", MB_OK | MB_ICONWARNING);
303
304 return S_FALSE;
305}
Note: See TracBrowser for help on using the repository browser.