REGSVR.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // regsvr.cpp : Program to invoke OLE self-registration on a DLL.
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include <windows.h>
  13. #include <ole2.h>
  14. #include <tchar.h>
  15. #include <stdio.h>
  16. #include "resource.h"
  17. #define FAIL_ARGS   1
  18. #define FAIL_OLE    2
  19. #define FAIL_LOAD   3
  20. #define FAIL_ENTRY  4
  21. #define FAIL_REG    5
  22. const TCHAR _szAppName[] = _T("RegSvr32");
  23. const char _szDllRegSvr[] = "DllRegisterServer";
  24. const char _szDllUnregSvr[] = "DllUnregisterServer";
  25. HINSTANCE _hInstance;
  26. BOOL _bSilent;
  27. BOOL _bConsole;
  28. #define SafePutts(string) ((stdout >= 0) ? _putts(string) : 0)
  29. void
  30. FormatString2(
  31. LPTSTR lpszOut,
  32. LPCTSTR lpszFormat,
  33. LPCTSTR lpsz1,
  34. LPCTSTR lpsz2
  35. )
  36. {
  37. LPCTSTR pchSrc = lpszFormat;
  38. LPTSTR pchDest = lpszOut;
  39. while (*pchSrc != '') {
  40. if (pchSrc[0] == '%' && (pchSrc[1] >= '1' && pchSrc[1] <= '2')) {
  41. lstrcpy(pchDest, (LPCTSTR)(pchSrc[1] == '1' ? lpsz1 : lpsz2));
  42. pchDest += lstrlen(pchDest);
  43. pchSrc += 2;
  44. } else {
  45. if (_istlead(*pchSrc))
  46. *pchDest++ = *pchSrc++; // copy first of 2 bytes
  47. *pchDest++ = *pchSrc++;
  48. }
  49. }
  50. *pchDest = '';
  51. }
  52. #define MAX_STRING 1024
  53. void
  54. DisplayMessage(
  55. UINT ids,
  56. LPCTSTR pszArg1 = NULL,
  57. LPCTSTR pszArg2 = NULL,
  58. BOOL bUsage = FALSE,
  59. BOOL bInfo = FALSE
  60. )
  61. {
  62. if (_bSilent && !_bConsole)
  63. return;
  64. TCHAR szFmt[MAX_STRING];
  65. LoadString(_hInstance, ids, szFmt, MAX_STRING);
  66. TCHAR szText[MAX_STRING];
  67. FormatString2(szText, szFmt, pszArg1, pszArg2);
  68. if (bUsage) {
  69. int cch = _tcslen(szText);
  70. LoadString(_hInstance, IDS_USAGE, szText + cch, MAX_STRING - cch);
  71. }
  72. if (! _bSilent)
  73. MessageBox(NULL, szText, _szAppName,
  74. MB_TASKMODAL | (bInfo ? MB_ICONINFORMATION : MB_ICONEXCLAMATION));
  75. if (_bConsole) {
  76. TCHAR szMessage[MAX_STRING];
  77. FormatString2(szMessage, _T("%1: %2n"), _szAppName, szText);
  78. SafePutts(szMessage);
  79. }
  80. }
  81. inline void
  82. Usage(
  83. UINT ids,
  84. LPCTSTR pszArg1 = NULL,
  85. LPCTSTR pszArg2 = NULL
  86. )
  87. {
  88. DisplayMessage(ids, pszArg1, pszArg2, TRUE);
  89. }
  90. inline void
  91. Info(
  92. UINT ids,
  93. LPCTSTR pszArg1 = NULL,
  94. LPCTSTR pszArg2 = NULL
  95. )
  96. {
  97. DisplayMessage(ids, pszArg1, pszArg2, FALSE, TRUE);
  98. }
  99. int PASCAL
  100. WinMain(
  101. HINSTANCE hInstance,
  102. HINSTANCE,
  103. LPSTR,
  104. int
  105. )
  106. {
  107. int iReturn = 0;
  108. HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(void);
  109. BOOL bVisualC = FALSE;
  110. BOOL bUnregister = FALSE;
  111. LPCSTR pszDllEntryPoint = _szDllRegSvr;
  112. LPCSTR pszDllName = NULL;
  113. LPCSTR pszTok;
  114. _hInstance = hInstance;
  115. // Parse command line arguments.
  116. int iTok;
  117. for (iTok = 1; iTok < __argc; iTok++) {
  118. pszTok = __argv[iTok];
  119. if ((pszTok[0] == '-') || (pszTok[0] == '/')) {
  120. switch (pszTok[1]) {
  121. case 'v':
  122. case 'V':
  123. bVisualC = TRUE;
  124. break;
  125. case 's':
  126. case 'S':
  127. _bSilent = TRUE;
  128. break;
  129. case 'u':
  130. case 'U':
  131. bUnregister = TRUE;
  132. pszDllEntryPoint = _szDllUnregSvr;
  133. break;
  134. case 'c':
  135. case 'C':
  136. _bConsole = TRUE;
  137. break;
  138. default:
  139. Usage(IDS_UNRECOGNIZEDFLAG, pszTok);
  140. return FAIL_ARGS;
  141. }
  142. } else {
  143. if (pszDllName == NULL) {
  144. pszDllName = pszTok;
  145. break;
  146. } else {
  147. Usage(IDS_EXTRAARGUMENT, pszTok);
  148. return FAIL_ARGS;
  149. }
  150. }
  151. }
  152. if (pszDllName == NULL) {
  153. if (bVisualC)
  154. DisplayMessage(IDS_NOPROJECT);
  155. else
  156. Usage(IDS_NODLLNAME);
  157. return FAIL_ARGS;
  158. }
  159. // Initialize OLE.
  160. if (FAILED(OleInitialize(NULL))) {
  161. DisplayMessage(IDS_OLEINITFAILED);
  162. return FAIL_OLE;
  163. }
  164. SetErrorMode(SEM_FAILCRITICALERRORS);       // Make sure LoadLib fails.
  165. for (; iTok < __argc; iTok++) {
  166. pszDllName = __argv[iTok];
  167. // Load the library.
  168. HINSTANCE hLib = LoadLibraryEx(pszDllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  169. if (hLib < (HINSTANCE)HINSTANCE_ERROR) {
  170. TCHAR szError[12];
  171. wsprintf(szError, _T("0x%08lx"), GetLastError());
  172. DisplayMessage(IDS_LOADLIBFAILED, pszDllName, szError);
  173. iReturn = FAIL_LOAD;
  174. goto CleanupOle;
  175. }
  176. // Find the entry point.
  177. (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);
  178. if (lpDllEntryPoint == NULL) {
  179. TCHAR szExt[_MAX_EXT];
  180. _tsplitpath(pszDllName, NULL, NULL, NULL, szExt);
  181. if ((_stricmp(szExt, ".dll") != 0) && (_stricmp(szExt, ".ocx") != 0))
  182. DisplayMessage(IDS_NOTDLLOROCX, pszDllName, pszDllEntryPoint);
  183. else
  184. DisplayMessage(IDS_NOENTRYPOINT, pszDllName, pszDllEntryPoint);
  185. iReturn = FAIL_ENTRY;
  186. goto CleanupLibrary;
  187. }
  188. // Call the entry point.
  189. if (FAILED((*lpDllEntryPoint)())) {
  190. DisplayMessage(IDS_CALLFAILED, pszDllEntryPoint, pszDllName);
  191. iReturn = FAIL_REG;
  192. goto CleanupLibrary;
  193. }
  194. Info(IDS_CALLSUCCEEDED, pszDllEntryPoint, pszDllName);
  195. CleanupLibrary:
  196. FreeLibrary(hLib);
  197. }
  198. CleanupOle:
  199. OleUninitialize();
  200. return iReturn;
  201. }