一、問題的提出
兩種註冊COM組件的方法
現在很多同一類型的軟件功能類似,由此帶來自己軟件所涉及的功能實現被別的安裝的軟件搶佔,如某種類型文件的打開播放,這樣就影響了自己軟件的使用。
二、解決思路
COM組件註冊有兩種,一種是用regsvr32.exe,另外一種是調用COM模塊中的DllRegisterServer。
這兩種方法都比較簡章,下面給出具體的代碼實現。
三、具體代碼實現
1) regsvr32.exe
TCHAR szCmdLine[2048];
_tcscpy( szCmdLine, _T("regsvr32.exe /"") );
TCHAR szPath[1024];
if( SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, szPath ) ) )
{
_tcscat( szPath, _T("//xxxx//Share Components//xxx.dll/" /s") );
_tcscat( szCmdLine, szPath );
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
BOOL bRet = CreateProcess( NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
if( bRet )
{
::WaitForSingleObject( pi.hProcess, INFINITE );
}
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
2) 調用COM模塊中的DllRegisterServer
typedef HRESULT (WINAPI *FREG)();
BOOL RegisterDll(LPCTSTR lpszPath)
{
HMODULE hMod =::LoadLibrary(lpszPath);
if(!hMod)
return FALSE;
HRESULT hResult = ::OleInitialize(NULL);
if(hResult != S_OK)
{
::FreeLibrary(hMod);
return FALSE;
}
FREG lpfunc = (FREG)::GetProcAddress(hMod, _T("DllRegisterServer"));
if(!lpfunc)
{
::FreeLibrary(hMod);
::OleUninitialize();
return FALSE;
}
hResult = lpfunc();
::OleUninitialize();
::FreeLibrary(hMod);
return (hResult == S_OK);
}
四、後續
本文僅是功能實現,不涉及軟件使用習慣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.