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

Last change on this file since 8266 was 6929, checked in by sandervl, 24 years ago

Regsvr32 fix: must use LoadLibrary

File size: 7.8 KB
Line 
1/* $Id: regsvr32.cpp,v 1.7 2001-10-02 17:14:57 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//SvL: Use LoadLibrary here, not CoLoadLibrary
183// Some dlls (divx codec) call CoFreeUnusedLibraries which unloads our dll
184// if we use CoLoadLibrary
185// NT's regsvr32 doesn't use CoLoadLibrary either.
186#if 1
187 hdlObject = LoadLibraryA(szFile);
188#else
189 LPOLESTR libnameW = (LPOLESTR)HEAP_strdupAtoW(GetProcessHeap(), 0, szFile);
190 hdlObject = LoadLibraryW(libnameW);
191 HeapFree(GetProcessHeap(), 0, libnameW);
192#endif
193 if (hdlObject == 0)
194 return report_err(S_FALSE, "Failed to load '%s'", szFile);
195
196 return S_OK;
197}
198
199// ----------------------------------------------------------------------
200// register_object
201// ----------------------------------------------------------------------
202static HRESULT register_object(void)
203{
204 typedef HRESULT(*LPFNREGISTER)(void);
205
206 LPFNREGISTER pfnRegister;
207 HRESULT hr;
208
209 pfnRegister = (LPFNREGISTER)GetProcAddress(hdlObject, "DllRegisterServer");
210
211 if (pfnRegister == NULL)
212 return report_err(S_FALSE, "Unable to locate registration entry point in '%s'", szFile);
213
214 hr = pfnRegister();
215 if (hr != S_OK)
216 return report_err(hr, "Registration for '%s' returned error 0x%08lx", szFile, hr);
217
218 return S_OK;
219}
220
221// ----------------------------------------------------------------------
222// deregister_object
223// ----------------------------------------------------------------------
224static HRESULT deregister_object(void)
225{
226 typedef HRESULT(*LPFNUNREGISTER)(void);
227
228 LPFNUNREGISTER pfnUnregister;
229 HRESULT hr;
230
231 pfnUnregister = (LPFNUNREGISTER)GetProcAddress(hdlObject, "DllUnregisterServer");
232
233 if (pfnUnregister == NULL)
234 return report_err(S_FALSE, "Unable to locate unregistration entry point in '%s'", szFile);
235
236 hr = pfnUnregister();
237 if (hr != S_OK)
238 return report_err(hr, "Unregistration for '%s' returned error 0x%08lx", szFile, hr);
239
240 return S_OK;
241}
242
243// ----------------------------------------------------------------------
244// unload_object
245// ----------------------------------------------------------------------
246static HRESULT unload_object(void)
247{
248#if 1
249 FreeLibrary(hdlObject);
250#else
251 CoFreeLibrary(hdlObject);
252#endif
253 return S_OK;
254}
255
256// ----------------------------------------------------------------------
257// report_msg
258// ----------------------------------------------------------------------
259static HRESULT report_msg(char * fmt, ...)
260{
261 if (!fSilent)
262 {
263 va_list va_ptr;
264 HWND hwnd = GetDesktopWindow();
265 char text[1024];
266
267 va_start(va_ptr, fmt);
268 vsprintf(text, fmt, va_ptr);
269 va_end(va_ptr);
270
271 MessageBoxA(hwnd, text, "RegSvr32", MB_OK | MB_ICONINFORMATION);
272 }
273 return S_OK;
274}
275
276// ----------------------------------------------------------------------
277// report_err
278// ----------------------------------------------------------------------
279static HRESULT report_err(HRESULT hr, char * fmt, ...)
280{
281 va_list va_ptr;
282 HWND hwnd = GetDesktopWindow();
283 char text[1024];
284
285 va_start(va_ptr, fmt);
286 vsprintf(text, fmt, va_ptr);
287 va_end(va_ptr);
288
289 MessageBoxA(hwnd, text, "RegSvr32", MB_OK | MB_ICONERROR);
290
291 return hr;
292}
293
294// ----------------------------------------------------------------------
295// usage
296// ----------------------------------------------------------------------
297static HRESULT usage(char * fmt, ...)
298{
299 va_list va_ptr;
300 HWND hwnd = GetDesktopWindow();
301 char text[256];
302 char msg[1024];
303
304 va_start(va_ptr, fmt);
305 vsprintf(text, fmt, va_ptr);
306 va_end(va_ptr);
307 sprintf(msg, "Error - %s\n\n"
308 "Usage:\n"
309 "regsvr32 [/s] [/u] filename\n"
310 "where\n"
311 "/s - silent completion\n"
312 "/u - unregister", text);
313
314 MessageBoxA(hwnd, msg, "RegSvr32", MB_OK | MB_ICONWARNING);
315
316 return S_FALSE;
317}
Note: See TracBrowser for help on using the repository browser.