C++中调用ActiveX组件的方法详解

来源:互联网 发布:qq for linux 最新版 编辑:程序博客网 时间:2024/06/05 22:36

  本文以 "msscript.ocx" 作为参考

  第一步:

  获取头文件

  #import "msscript.ocx"

  得到两个文件 "msscript.tlh" 和 "msscript.tli" 整合下的到个头文件"msscript.h"如下:

  + View Code

  第二步:

   138#include

  #include

  //#import "msscript.ocx"

  #include "msscript.h"

  using namespace MSScriptControl;

  HRESULT (STDAPICALLTYPE *pfnDllGetClassObject)(REFCLSID rclsid, REFIID riid, LPVOID* ppv) = 0;

  int main()

  {

  //方式一

  do

  {

  /*

  @ 注意点

  @ 1.没有判断返回值,后面直接使用 CoUninitialize 反初始化会出现问题。

  @ 2.如果不主动调用释放也会出现崩溃,因为后面直接调用了 CoUninitialize,在智能指针析构时候会出错。

  */

  ::CoInitializeEx(NULL, COINIT_MULTITHREADED);//注意点【1】

  CLSID clsid;

  CLSIDFromProgID(OLESTR("MSScriptControl.ScriptControl.1"), &clsid);

  CComPtr spScript;//智能指针

  spScript.CoCreateInstance(clsid);

  if (spScript != nullptr)

  {

  spScript->_AboutBox();

  }

  spScript.Release();//注意点【2】

  ::CoUninitialize();

  } while (0);

  //一下方式将解决上面的2个注意点

  //解决注意点[【1】

  HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);

  std::shared_ptr tmpCoUninitialize(nullptr, [hr](void *) {

  if (hr == S_OK)

  {

  ::CoUninitialize();

  }

  });

  //方式二

  do

  {

  //最好使用 try catch 来处理

  try

  {

  IScriptControlPtr spScript(__uuidof(ScriptControl)/*, NULL, CLSCTX_INPROC*/);

  //ptr->Language = "VBScript";

  //ptr->AllowUI = TRUE;

  HRESULT hr = spScript->put_Language(_bstr_t(L"VBScript"));

  hr = spScript->put_AllowUI(VARIANT_TRUE);

  spScript->AddCode(_bstr_t(LR"-(

  Private Function VBS_MsgBox()

  Msgbox "你好!"

  End Function

  )-"));

  spScript->Eval(_bstr_t(L"VBS_MsgBox"));

  spScript->_AboutBox();

  }

  catch (const _com_error &e)

  {

  e.Description();

  }

  catch (...)

  {

  }

  } while (0);

  //方式三

  do

  {

  //不注册组件 直接调用接口

  HMODULE hMSScript = ::LoadLibraryExW(_T("msscript.ocx"), NULL, 0);

  if (hMSScript != NULL)

  {

  *(LPVOID *)&pfnDllGetClassObject = ::GetProcAddress(hMSScript, "DllGetClassObject");

  if (pfnDllGetClassObject != nullptr)

  {

  try

  {

  IClassFactoryPtr pClassFactory = NULL;

  HRESULT hr = pfnDllGetClassObject(__uuidof(ScriptControl), IID_IClassFactory, (LPVOID*)&pClassFactory);

  if (SUCCEEDED(hr) && pClassFactory != nullptr)前列腺炎会给男性带来哪些危害

  {

  IScriptControlPtr spScript;

  hr = pClassFactory->CreateInstance(NULL, __uuidof(IScriptControl), (void **)&spScript);

  if (SUCCEEDED(hr) && spScript != nullptr)

  {

  spScript->_AboutBox();

  }

  }

  }

  catch (const _com_error &e)

  {

  _bstr_t des = e.Description();

  int j = 0;

  }

  }

  ::FreeLibrary(hMSScript);

  }

  } while (0);

  //方式四

  do

  {

  IClassFactoryPtr pClassFactory = NULL;

  HRESULT hr = ::CoGetClassObject(

  __uuidof(ScriptControl),成都青羊区做阴茎延长医院

  CLSCTX_ALL,

  NULL,

  __uuidof(IClassFactory),

  (void **)&pClassFactory);

  if (SUCCEEDED(hr) && pClassFactory != nullptr)

  {

  IScriptControlPtr spScript;

  hr = pClassFactory->CreateInstance(NULL, __uuidof(IScriptControl), (void **)&spScript);

  if (SUCCEEDED(hr) && spScript != nullptr)

  {

  spScript->_AboutBox();

  }成都好点的妇科医院在哪

  }

  } while (0);

  //方式五

  //在MFC窗口界面添加,可以得到接口类。

  return 0;

  }

原创粉丝点击