兩種註冊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);
}
四、後續
本文僅是功能實現,不涉及軟件使用習慣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章