检测MSWORD.OLB是否注册及注册的代码

此文章为MSWORD.OLB未正确注册导致问题现象及解决方法的代码解决:

 

代码逻辑:

1、先检测是否注册了wordolb。

      检测方法:看能否得到word 文档对象的接口。如果得不到且错误返回码为TYPE_E_CANTLOADLIBRARY,则定义为olb未注册成功。

 

2、发现未注册,使用regtlibv12.exe注册wordolb。

 

以下是关键代码:

(1)检测wordolb是否注册

 

 
  1. /*

  2. * check if word ole is register

  3. * return 0 MSWORD.OLB is registered

  4. * return -1 MSWORD.OLB is not registered

  5. * return other CoCreateInstance's return

  6. *

  7. */

  8. int WordOlbRegisterCheck()

  9. {

  10. int nReturn = -2;

  11. const CLSID CLSID_WORD_DOCUMENT_DOC = {0x00020906, 0x0000, 0x0000,{0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};

  12. const IID IID_IDocument = {0x0002096b, 0x0000, 0x0000,{0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};

  13.  
  14. CoInitialize(NULL);

  15.  
  16. IUnknown *pIDocument = NULL;

  17. IUnknown *pUnk = NULL;

  18. HRESULT hr = CoCreateInstance(CLSID_WORD_DOCUMENT_DOC, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&pUnk);

  19. if (

  20. (hr == S_OK)

  21. && (pUnk != NULL)

  22. )

  23. {

  24. hr = pUnk->QueryInterface(IID_IDocument, (void**)&pIDocument);

  25. if (hr == S_OK)

  26. {

  27. nReturn = 0;

  28. pIDocument->Release();

  29. }

  30. else if (hr == TYPE_E_CANTLOADLIBRARY)

  31. {

  32. nReturn = -1;

  33. }

  34. else

  35. {

  36. nReturn = hr;

  37. }

  38. pUnk->Release();

  39.  
  40. }

  41. else if (hr == TYPE_E_CANTLOADLIBRARY)

  42. {

  43. nReturn = -1;

  44. }

  45. else

  46. {

  47. nReturn = hr;

  48. }

  49.  
  50. return nReturn;

  51. }


(2)

 

获得当前程序目录下的注册工具regtlibv12.exe路径

 

 
  1. //strcat regtool path

  2. memset(szPathRegTool, 0, sizeof(TCHAR)*MAX_PATH);

  3. DWORD nResult = GetModuleFileName(NULL, szPathRegTool, MAX_PATH);

  4. if (nResult > 0 && nResult < MAX_PATH)

  5. {

  6. while (nResult > 0)

  7. {

  8. if (szPathRegTool[nResult] != _T('\\'))

  9. {

  10. szPathRegTool[nResult] = _T('\0');

  11. nResult --;

  12. }

  13. else

  14. {

  15. break;

  16. }

  17. }

  18. }

  19. _tcscat(szPathRegTool, _T("regtlibv12.exe"));


(3)

 

获得注册表中office安装目录

 

 
  1. memset(szOfficeDirectory, 0, sizeof(TCHAR)*MAX_PATH);

  2. HKEY hKey;

  3. if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Office\\12.0\\Common\\InstallRoot"), 0, KEY_READ, &hKey) == ERROR_SUCCESS)

  4. {

  5. DWORD nDataSize = 1024;

  6. LPBYTE pData = new BYTE[nDataSize];

  7. if (pData != NULL)

  8. {

  9. memset(pData, 0, nDataSize);

  10. DWORD dataType = REG_SZ;

  11. if (::RegQueryValueEx(hKey, _T("Path"), NULL, &dataType, pData, &nDataSize) == ERROR_SUCCESS)

  12. {

  13. memcpy(szOfficeDirectory, pData, nDataSize);

  14. }

  15. delete pData;

  16. pData = NULL;

  17. }

  18. }


(4)

 

打开文件对话框选择文件并注册

 

 
  1. TCHAR szFilters[] = _T("MSWORD.OLB |*.OLB||");

  2. CFileDialog fileDlg(TRUE, _T(""), _T("MSWORD.OLB"), OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,

  3. szFilters);

  4. fileDlg.m_ofn.lpstrInitialDir = szOfficeDirectory;

  5. if (fileDlg.DoModal() == IDOK)

  6. {

  7. //use regtool to register MSWORD.OLB

  8. ShellExecute(NULL, _T("open"), szPathRegTool, _T("\"")+fileDlg.GetPathName()+_T("\""), NULL, SW_SHOWNORMAL);

  9. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值