用于运行其他.exe的win32 API

我想知道win32 API以编程方式运行regsvr32

我有一个应用程序,我可以通过它与COM端口设备进行通信,但为​​了实现通信,我必须使用regsvr32.exe注册MSCOMM32.ocx

但是现在我想在代码中添加这个规定,所以不需要手动运行regsvr

MSDN是你的朋友。

  • Regsvr32.exe如何注册和取消注册COM DLL
  • COM服务器的职责

我将复制并粘贴代码:

  #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; } 

为什么要运行regsvr.exe来注册COM组件?

您可以使用下面的代码从COM组件直接调用DllRegisterserver()。

 void RegisterDll() { typedef HRESULT (WINAPI *pDllRegisterserver)(void); pDllRegisterserver pfnDllRegisterserver; HMODULE hmodulee = LoadLibrary("MSCOMM32.ocx"); pfnDllRegisterserver = (pDllRegisterserver) GetProcAddress(hMoudle , "DllRegisterserver"); pfnDllRegisterserver(); } 

谢谢,Shaarang Tyagi