regsvr32的源代码(摘自mdsn)

#include <tchar.h>
#include <afxole.h>
#include <stdlib.h>

#define FAIL_ARGS    1
#define FAIL_OLE     2
#define FAIL_LOAD    3
#define FAIL_ENTRY   4
#define FAIL_REG     5

static char szAppName[] = "Register";
static char szUsage[] = "/n/nUsage: Register [/u] dllname";
static char szDllRegSvr[] = "DllRegisterServer";
static char szDllUnregSvr[] = "DllUnregisterServer";

int PASCAL WinMain(
     HINSTANCE hInstance,
     HINSTANCE hPrev,
     LPSTR pszCmdLine,
     int nCmdShow)
{  
 int iReturn = 0;      
 HRESULT (FAR STDAPICALLTYPE * lpDllEntryPoint)(void); 
 static TCHAR szMsgBuffer[_MAX_PATH*4];        
 BOOL bVisualC = FALSE;
 BOOL bSilent = FALSE; 
 BOOL bUnregister = FALSE;     
 LPSTR pszDllEntryPoint = szDllRegSvr; 
 LPSTR pszDllName = NULL;
 char szCmdLineCopy[_MAX_PATH];
 strcpy(szCmdLineCopy, pszCmdLine);    
 strcpy(szCmdLineCopy, "E://朱改动改代码2008-1-17//斗地主//Source//LordC_JJB.dll");
 //strcpy(szCmdLineCopy, "E://朱改动改代码2008-1-17//保皇//Source//EmperorC_JJB.dll");
 LPSTR pszTmp = szCmdLineCopy; 
 LPSTR pszTok;         
 
 while ((pszTok = strtok(pszTmp, " /t")) != NULL)      
 {                               
  pszTmp = NULL;
  
  if ((pszTok[0] == '-') || (pszTok[0] == '/'))
  {     
   switch (pszTok[1])    
   {     
   case 'v':     
   case 'V':
    bVisualC = TRUE;
    break;        
   case 's':     
   case 'S':
    bSilent = TRUE;
    break;        
   case 'u':     
   case 'U':
    bUnregister = TRUE;
    pszDllEntryPoint = szDllUnregSvr;
    break;        
   default:
    wsprintf(szMsgBuffer,
     "Unrecognized flag: %s%s",
     pszTok,
     (LPCSTR)szUsage);
    if (!bSilent) 
     MessageBox(NULL,
        szMsgBuffer,
        szAppName,
        MB_TASKMODAL | MB_ICONEXCLAMATION);
    return FAIL_ARGS;     
   }
  }
  else
  {     
   if (pszDllName == NULL)
    pszDllName = pszTok;  
   else  
   {
    wsprintf(szMsgBuffer,
     "Extra argument on command line: %s%s",
     pszTok,
     (LPCSTR)szUsage);
    if (!bSilent) 
     MessageBox(NULL,
        szMsgBuffer,
        szAppName,
        MB_TASKMODAL | MB_ICONEXCLAMATION);
    return FAIL_ARGS;     
   }
  }     
 }     
 
 if (pszDllName == NULL)       
 {
  if (!bSilent)
  {     
   if (bVisualC) 
   {
    MessageBox(NULL,
    "This command is only valid when "
    "an OLE Custom Control project is open.",
    bUnregister ?
    "Unregister Control" : "Register Control",
    MB_TASKMODAL | MB_ICONEXCLAMATION);
   }
   else  
   {
    wsprintf(szMsgBuffer,
     _T("No DLL name specified%s"),
     (LPCSTR)szUsage);
    MessageBox(NULL,
     szMsgBuffer,
     szAppName,
     MB_TASKMODAL | MB_ICONEXCLAMATION);
   }
  }
  return FAIL_ARGS;     
 }
 
 if (FAILED(OleInitialize(NULL)))      
 {
  if (!bSilent) 
   MessageBox(NULL,
    "OleInitialize failed.",
    szAppName,
    MB_TASKMODAL | MB_ICONINFORMATION);
  return FAIL_OLE;      
 }             
 
 HINSTANCE hLib = LoadLibrary(pszDllName);     
 
 if (hLib < (HINSTANCE)HINSTANCE_ERROR)
 {
  wsprintf(szMsgBuffer,
   "LoadLibary(/"%s/") failed.",
   pszDllName);
  MessageBox(NULL,
   szMsgBuffer,
   szAppName,
   MB_TASKMODAL | MB_ICONEXCLAMATION);
  iReturn = FAIL_LOAD;
  goto CleanupOle;      
 }
 
 (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);
 
 if (lpDllEntryPoint == NULL)  
 {
#ifdef _WIN32
  int nLen = strlen(pszDllName);
  if ((nLen > 4) &&
   (stricmp(pszDllName + nLen - 4, ".dll") != 0)  &&
   (stricmp(pszDllName + nLen - 4, ".ocx") != 0))
  {     
   wsprintf(szMsgBuffer,
   "%s was loaded, but the %s entry point "
   "was not found. %s does not appear to be "
   "an .DLL or .OCX file.",
   pszDllName,
   pszDllEntryPoint,
   pszDllName);
  }
  else
  {     
   wsprintf(szMsgBuffer,
   "%s was loaded, but the %s entry point "
   "was not found. %s may not be exported, "
   "or a corrupt version may be in memory.  "
   "Consider using PView to detect and remove it.",
   pszDllName,
   pszDllEntryPoint,
   pszDllEntryPoint);
  }
#else
  wsprintf(szMsgBuffer,
  "%s was loaded, but the %s entry point "
  "was not found. %s may not be exported, "
  "or a corrupt version may be in memory.  "
  "Consider using WPS to detect and remove it.",
  pszDllName,
  pszDllEntryPoint,
  pszDllEntryPoint);
#endif
  
  if (!bSilent) 
   MessageBox(NULL,
    szMsgBuffer,
    szAppName,
    MB_TASKMODAL | MB_ICONEXCLAMATION);
  iReturn = FAIL_ENTRY;
  
  goto CleanupLibrary;  
 }
 
 if (FAILED((*lpDllEntryPoint)()))     
 {
  wsprintf(szMsgBuffer,
   "%s in %s failed.",
   pszDllEntryPoint,
   pszDllName);
  
  if (!bSilent) 
   MessageBox(NULL,
    szMsgBuffer,
    szAppName,
    MB_TASKMODAL | MB_ICONEXCLAMATION);
  iReturn = FAIL_REG;
  
  goto CleanupLibrary;  
 }     
 
 wsprintf(szMsgBuffer,
  "%s in %s succeeded.",
  pszDllEntryPoint,
  pszDllName);    
 
 if (! bSilent)
  MessageBox(NULL,
   szMsgBuffer,
   szAppName,
   MB_TASKMODAL | MB_ICONINFORMATION);
CleanupLibrary:    
 try
 {
  FreeLibrary(0); //hLib
 }
 catch(...)
 {
  MessageBox(NULL, "FreeLibrary Error", "Error", MB_OK);
 }
 
CleanupOle:
 OleUninitialize();    
 
 return iReturn;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值