1. 程式人生 > >C++中呼叫ActiveX元件的方法詳解

C++中呼叫ActiveX元件的方法詳解

  本文以 "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;

  }

相關推薦

C++呼叫ActiveX元件方法

  本文以 "msscript.ocx" 作為參考   第一步:   獲取標頭檔案   #import "msscript.ocx"   得到兩個檔案 "msscript.tlh" 和 "msscript.tli" 整合下的到個頭檔案"msscript.h"如下:   +

JNI呼叫JAVA各種方法

總結一下 C 如何 通過 JNI 層呼叫 Java 的靜態和非靜態方法 對於:JNIEXPORT void JNICALL Java_com_example_TestNative_sayHello(JNIEnv * env, jobject th

Python 在子類呼叫父類方法(單繼承、多層繼承、多重繼承)

測試環境: win7 64位 Python版本:Python 3.3.5 程式碼實踐: 1、在子類中通過“類名”呼叫父類的方法 class FatherA: def __init__(self): print('init

c++呼叫Com元件方法

轉載自:http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html需求: 1.建立myCom.dll,該COM只有一個元件,兩個介面:    IGetRes--方法Hello(),    IGetResEx--方法HelloEx() 2

C#的IDisposable模式用法

數據庫 nor 是否 entry block 記錄日誌 自定義 技術分享 ssa 本文實例講述了C#中IDisposable模式的用法,針對垃圾資源的回收進行了較為詳細的講解。分享給大家供大家參考之用。具體方法如下: 首先,對於垃圾回收而言,在C#中,托管資源的垃圾回收是

C#的Linq to Xml

image 查詢 學習 ebo ret 遞增 xdoc 裏的 事件 前言 我相信很多從事.NET開發的,在.NET 3.5之前操作XML會比較麻煩,但是在此之後出現了Linq to Xml,而今天的主人公就是Linq to Xml,廢話不多說,直接進入主題。 一、生

C++,getline函式的

C++中本質上有兩種getline函式,一種在標頭檔案<istream>中,是istream類的成員函式。一種在標頭檔案<string>中,是普通函式。 在<istream>中的getline函式有兩種過載形式: istream&am

C++ this指標的 C++this指標的用法

C++中this指標的用法詳解   轉自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指標的用處:   一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果

c++this指標的用法

為什麼引入this指標?     最簡單的應用場景就是:當我們在類中定義了一個變數,同時在類成員函式中定義了同一變數時,也就是說變數名重複時,但是我們想使用類中定義的變數,這個時候我們該怎麼辦呢?這個時候就是this指標大顯身手的時候了。為此我們引入this指標

C++的freopen()函式使用

所謂重定向輸出,就是可以把原本只是輸出在控制檯的字元,輸出到你指定的路徑檔案中。(輸入類似,就是從指定的檔案中讀取,而不是讀取在控制檯中的輸入。)重定向函式可以在任何時候開啟、關閉。   函式名:freopen  標準宣告:FILE *freopen( const c

C++map容器的用法

Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料 處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一

C++抽象類和介面

1.抽象類 在面向物件程式設計中,抽象類是一種只能定義型別,不能生成物件的類,它是對一系列看上去不同,但是本質相同的具體概念的抽象。最典型的抽象類就是“圖形”,三角形、矩形、圓都是圖形,它們都有邊長、面積屬性,“圖形”類就是對這系列的抽象。 程式設計中,我們可以定義一個表

C++ sort 函式的使用

STL主要包含容器,迭代器,演算法三塊內容,使用者可以對容器進行一系列的操作,比如遍歷和計算,而STL提供的迭代器和容器完美地提供了這樣的介面。其中std::vector是最常用的容器之一,vector是一個模板類,定義在名稱空間namespace下,使用vector需要在包含相關標頭檔案。今天主要講解對ve

前端學習筆記之jsapply()和call()方法

經過網上的大量搜尋,漸漸明白了apply()和call方法的使用,為此寫一篇文章記錄一下。 定義 apply()方法: Function.apply(obj,args)

C++vector和map使用

    Map是c++的一個標準容器,她提供了很好一對一的關係,在一些程式中建立一個map可以起到事半功倍的效果,總結了一些map基本簡單實用的操作! 1. map最基本的建構函式;    map<string , int >mapstring;         map<int ,str

資料爬蟲(三):pythonrequests庫使用方法

一、什麼是Requests Requests 是⽤Python語⾔編寫,基於urllib,採⽤Apache2 Licensed開源協議的 HTTP 庫。它⽐ urllib 更加⽅便,可以節約我們⼤量的⼯作,完全滿⾜HTTP測試需求。 ⼀句話——Python實現的簡單易

C++的名稱空間namespace及細節參考

名稱空間特性 c++中要求可以通過定義一種新的宣告區域來建立名稱空間,這樣目的之一就是提供一個宣告名稱的區域。一個名稱區域中的名稱不會與另外一個名稱空間的相同名稱發生衝突,同時允許程式中的其他部分使用該名稱訪問空間中宣告的東西 使用namespace建立名稱空間的栗子: namespac

【轉載】C# 的委託和事件(:簡單易懂的講解) C# 的委託和事件()

本文轉載自http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委託和事件(詳解) C# 中的委託和事件

c++ set集合的使用方法

set集合是c++ stl庫中自帶的一個容器,set具有以下兩個特點: 1、set中的元素都是排好序的 2、set集合中沒有重複的元素 常用操作: begin()    返回set容器的第一個元素的地址 end()      返回set容器的最後一個元素地址 clear()

Objective-C@property的所有屬性

1,assign : 簡單賦值,不更改索引計數 假設你用malloc分配了一塊記憶體,並且把它的地址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給(assign)了b。此時a 和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定