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

Last change on this file since 6502 was 5612, checked in by sandervl, 24 years ago

compile fix

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