为什么非要用 Regsvr32.exe 在命令行中才能注册成功呢?
我在注册一个第三方发布的一组 DLL 的时候,发现其中一个 DLL 用我的安装程序中自己的注册语句不能注册成功:
#ifdef _WIN32
#define LOADLIBRARY_FAILED(x) (x == 0)
#else
#define LOADLIBRARY_FAILED(x) (x <= HINSTANCE_ERROR)
#endif
typedef HRESULT (STDAPICALLTYPE *CTLREGPROC)() ; //
BOOL SelfRegisterDLL(char *pszDllName)
{
BOOL bResult = FALSE;
HMODULE hModule = ::LoadLibrary(pszDllName) ;
if (LOADLIBRARY_FAILED(hModule)) return FALSE ;
CTLREGPROC DLLRegisterServer =
(CTLREGPROC)::GetProcAddress(hModule,"DllRegisterServer" ) ;
if (DLLRegisterServer != NULL)
{
HRESULT regResult = DLLRegisterServer() ;
bResult = (regResult == NOERROR) ;
}
::FreeLibrary(hModule) ;
return bResult;
}
但是在“开始”“运行”中用 regsvr32.exe 注册便可成功。
于是我在程序中加入另一段,用 ShellExecute 来调用 regsvr32.exe 奇怪的是仍然不行。
BOOL ReRegisterDLL(char *pszDllName)
{
char sBuffer[256];
char sBuffer1[256]="/s ";
GetWindowsDirectory(sBuffer, 256);
strcat(sBuffer, "\\SYSTEM32\\Regsvr32.exe");
strcat(sBuffer1, pszDllName);
ShellExecute(NULL, "open", sBuffer, sBuffer1, NULL, SW_SHOWNORMAL);
if (!GetLastError() == 0)
{
CString strErr;
strErr.Format("Error code:%d",GetLastError());
AfxMessageBox(strErr);
return FALSE;
}
return TRUE;
}
这说明在命令行中运行 Regsvr32.exe 有某些操作并没有包括在我的代码中,去找 MSDN 中的 Regsvr32.exe 的源代码却又发现这一块没装上来。
哪位朋友知道是什么原因吗,先谢啦。