1. 程式人生 > >讓COM元件可被跨語言呼叫

讓COM元件可被跨語言呼叫

錯誤修正

首先修正一下上篇(《》)中的例子的一個小問題。類廠的CreateInstance裡面,上次是這麼寫的:

STDMETHODIMPClassFactory::CreateInstance(_In_opt_IUnknown *pUnkOuter,

_In_REFIIDriid,

_COM_Outptr_void **ppvObject)

{

if (riid == __uuidof(ISampleInterface) && m_clsid == __uuidof(SampleClass))

{

ISampleInterface *p = newSampleClass

;

p->QueryInterface(riid, ppvObject);

returnS_OK;

}

returnCLASS_E_CLASSNOTAVAILABLE;

}

其中一開始就檢查了IID,如果不是ISampleInterface,就返回錯誤,錯誤資訊是“類無效”(應該是“介面不存在”),這不科學。後面p->QueryInterface的時候,還會對IID做一次檢查,因此前面的IID檢查可以去掉。實際上,有些使用者在獲取類廠後,會來個CreateInstance(..., IID_IUnknown, ...),這是個合理的行為,應該予以支援,而像上面這樣寫就不支援了。糾正為:

STDMETHODIMPClassFactory::CreateInstance(_In_opt_IUnknown *pUnkOuter,

_In_REFIIDriid,

_COM_Outptr_void **ppvObject)

{

if (m_clsid == __uuidof(SampleClass))

{

ISampleInterface *p = newSampleClass;

p->QueryInterface(riid, ppvObject);

returnS_OK;

}

returnCLASS_E_CLASSNOTAVAILABLE;

}

同理,DllGetClassObject

中,原先是:

STDAPI DllGetClassObject(_In_REFCLSIDrclsid, _In_REFIIDriid, _Outptr_LPVOID *ppv)

{

if (riid == __uuidof(IClassFactory) && rclsid == __uuidof(SampleClass))

{

IClassFactory *p = newClassFactory(rclsid);

p->QueryInterface(riid, ppv);

returnS_OK;

}

returnCLASS_E_CLASSNOTAVAILABLE;

}

做了IIDCLSID的雙重檢查。而IID剛才說過了,具體類的QueryInterface會檢查;CLSID,類廠的CreateInstance會檢查,因此這裡大可不必檢查。改為:

STDAPI DllGetClassObject(_In_REFCLSIDrclsid, _In_REFIIDriid, _Outptr_LPVOID *ppv)

{

IClassFactory *p = newClassFactory(rclsid);

return p->QueryInterface(riid, ppv);

}

引言

好了,回到主題。看過COM介紹的,一般都會聽說,哦,可以跨語言呼叫,真牛逼!好吧,現在就來調調看。寫段VBScript

Set obj = WScript.CreateObject("Streamlet.COMProvider.SampleClass.1")

obj.SampleMethod

使用CScript呼叫這個指令碼,報錯:

Test.vbs(1, 1) Microsoft VBScript

相關推薦

COM元件語言呼叫

錯誤修正 首先修正一下上篇(《》)中的例子的一個小問題。類廠的CreateInstance裡面,上次是這麼寫的: STDMETHODIMPClassFactory::CreateInstance(_In_opt_IUnknown *pUnkOuter, _In_REFIIDriid, _

vs2019 Com元件初探-簡單的COM編寫以及實現語言呼叫

前提條件   1、掌握C++基礎語法   2、平臺安裝 vs2019   3、本地平臺為 windows 10 1909 X64   4、瞭解vbs基礎語法   本次目標   1、掌握Com元件的概念及原理   2、編寫一個簡單的以DLL形式展現的Com元件   3、通過 VBS 實現跨語言呼叫CO

thrift語言呼叫服務,以nodejs和Java為例

使用thrift的流程: 1、下載thrift的exe,編寫thrift介面檔案,使用thrift --gen java + 檔名生成Java的介面檔案,使用thrift --gen js:node +檔名 生成nodejs介面檔案。介面檔案PrintService.th

Hessian語言呼叫例項

Hessian是跨語言基於HTTP的RPC框架,傳輸的資料格式是二機制。網上找了很多例子,基本上都是同語言之間的RPC呼叫例子,基本沒有跨語言的,自己折騰一下,使用Java編寫PRC服務端,使用Java和Python作為客戶端呼叫RPC服務。 Java 服

Golang通過Thrift框架完美實現語言呼叫

每種語言都有自己最擅長的領域,Golang 最適合的領域就是伺服器端程式。   做為伺服器端程式,需要考慮效能同時也要考慮與各種語言之間方便的通訊。採用http協議簡單,但效能不高。採用TCP通訊,則需要考慮封包、解包、粘包等等很多因素,而且想寫個高效的TCP服務,也很難。

ubuntu14.04下通過JNI使用C++語言呼叫java例項

軟體環境: ubuntu14.04 eclipse clion 一、java程式碼 在eclipse中新建Test工程,package為test,建立Demo類。Demo.java如下。 package test; public class Demo {

建立最簡單的exe形式COM元件並在MFC程式呼叫

來新公司學習接手新專案,拿到程式碼開啟解決方案看到裡面竟然有40幾個工程,有點吃驚。具體看程式碼也有很多之前沒見過的寫法,上了幾天火。 有件事就沒太搞明白,按照文件的說法上層很多軟體都要呼叫IO伺服器,但看程式安裝目錄,IO伺服器其實是一個exe程式,按照我之前的印象,能被別的程式呼叫的也得是動態庫、靜態庫或

vs2019 Com元件初探-通過IDispatch介面呼叫Com

vs2019 Com元件初探-簡單的COM編寫以及實現跨語言呼叫 上一篇實現瞭如何編寫基於IDipatch介面的COM以及vbs如何呼叫編寫的COM 本次主要是實現VBS的CreateObject函式的邏輯   前提條件   1、掌握C++基礎語法   2、平臺安裝 vs2019   3、本地平臺為

Thrift是一款由Fackbook開發的伸縮、語言的服務開發框架

final 問題 不同 err gin 之間 統一 tex cgi 這段時間,一直在整理公司的內部 rpc 服務接口,面臨的一個問題就是:由於公司內部的系統由幾個不同的語言編寫的。C# ,java,node.js 等,如何實現這些內部系統之間的接口統一調用,確實是比較麻煩,

通過COM元件方式實現java呼叫C#寫的DLL檔案 轉

    最近一段時間單位在做一個Web專案,工程師用JAVA語言,需要公用人員資訊,統一使用者名稱和密碼,原有的平臺中是用C#語言開發的,在網上查詢解決方法,通過JAVA呼叫C#的DLL檔案實現。網上資料很多,自己整合總結了一下,做個備忘。 一、C#寫com元件 開發環境

python類直接呼叫

之前在pytorch和keras中經常發現一個類model被直接呼叫,發現很有意思。於是就去看了看pytorch中nn.Module的原始碼,發現是定義了__call__(self)函式再去呼叫forward()函式。舉個例子如下:  import math class Pow(o

多執行緒呼叫系統COM元件的體會(CoInitialize)

多執行緒呼叫COM元件的體會(CoInitialize) 呼叫任何COM元件之前,你必須首先初始化COM套件環境,即呼叫CoInitialize或CoInitializeEx。COM套件環境線上程的生存週期內有效,執行緒退出前需要呼叫CoUninitializ

vs2017生成COM元件,VB呼叫

新建專案 -- ATL專案  (專案屬性--連結器--常規--逐使用者重定向 --選為是)  確定,跳出ATL選項,直接再點確定 addcom專案新增專案 新增類test(atl簡單物件) 此時test.h中的標頭檔案addcom_i.h尚未生成,只是一個

COM元件呼叫返回了錯誤 HRESULT E_FAIL

背景: 用C#的Aspose.word控制元件,向word的書籤中插入圖片時,需要設定圖片文字環繞:嵌於文字下方。 要實現這一功能時加入如下程式碼時報出的錯誤: 就是這個ConvertToShape()出了錯。 解決方法: 經過多次嘗試,找各種別的控制元件

COM 元件呼叫返回了錯誤 HRESULT E_FAIL。

原文地址為: 對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL。      win7系統,用c#呼叫Interop.SHDocVw.dll時,報了個對“ COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”的錯誤。網上有人說要

AI觸類旁通93種語言:Facebook推出語言句嵌入,搞定小語種

搞定一種語言之後,是不是很希望演算法能在近百種語言上無縫遷移? AI真能無師自通,對於我們這些“因為語言不通而分散在各處”的人們來說,簡直是天大的福音。 新鮮出爐的Facebook“多語種句嵌入”,就是這樣一種“神器”。他們提出了一種新架構,為橫跨34個語族、28種不同文字寫成的的93種語言,學習了統一的

geoprocessor(GP)工具提示“對 COM 元件呼叫返回了錯誤 HRESULT E_FAIL”的幾種情況

以gp工具中的merge工具進行示例分析:1、當引數input所表示的要素型別不一致的時候會出現“對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”提示。2、當引數output所表示的要素已存在,且gp工具的overwrite屬性設定為false的時候也會出現

C#生成com元件形式的dll供C++呼叫

①建立C#類庫(ClassLibrary)、設定AssemblyInfo.cs中的[assembly: ComVisible(true)]預設是false、或者在介面和類之前新增設定為true     [ComVisible(true)]     [Guid("E709D3

關於C#操作PPT時遇到的“對COM元件呼叫返回了錯誤HRESULT E_FAIL”錯誤的解決方法

最近在做一套和圖書有關的專案,其中有一個功能為使用者上傳的各類文件(doc、docx、ppt、pptx、pdf等型別)統一轉換為PDF型別。word格式的轉為PDF就不用說了,推薦一個第三方DLL:Aspose.Words.dll. Aspose這套DLL專門用來對付Offi

AE+C#把資料寫入GDB資料庫裡出現 “對COM元件呼叫返回了錯誤 HRESULTE_FAIL”

public void CreateFeatureClass_Terrain_Info(IFeatureWorkspace IFW) { IFeatureClass tempFeatureClass = IFW.OpenFeatureClass(