2011-08-06 1 views
0

regsvr32をプログラム的に実行するwin32 APIについて知りたかったです。他の.exeを実行するためのwin32 API

私はCOMポートデバイスと通信できるアプリケーションを1つ持っていますが、通信を実現するためにregsvr32.exeを使用してMSCOMM32.ocxを登録する必要があります。

今は自分のコードにこの規定を追加して、regsvrを手動で実行する必要はありません。

答えて

3

MSDNはあなたのお友達です。

私は、コードをコピーして貼り付けます:

#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);    
     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:  
    FreeLibrary(hLib); 

CleanupOle: 
    OleUninitialize();  

    return iReturn; 
} 
0

は、なぜあなたはCOMコンポーネントを登録するREGSVR.EXEを実行したいですか?

次のコードを使用して、COMコンポーネントから直接DllRegisterServer()を呼び出すことができます。

void RegisterDll() 
{ 
    typedef HRESULT (WINAPI *pDllRegisterServer)(void); 
    pDllRegisterServer pfnDllRegisterServer; 
    HMODULE hModule = LoadLibrary("MSCOMM32.ocx"); 
    pfnDllRegisterServer = (pDllRegisterServer) GetProcAddress(hMoudle , "DllRegisterServer"); 
    pfnDllRegisterServer(); 
} 

おかげで、 Shaarangティアギ(Tyagi)

関連する問題