讓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; } |
做了IID和CLSID的雙重檢查。而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
錯誤修正 首先修正一下上篇(《》)中的例子的一個小問題。類廠的CreateInstance裡面,上次是這麼寫的: STDMETHODIMPClassFactory::CreateInstance(_In_opt_IUnknown *pUnkOuter, _In_REFIIDriid, _ 前提條件
1、掌握C++基礎語法
2、平臺安裝 vs2019
3、本地平臺為 windows 10 1909 X64
4、瞭解vbs基礎語法
本次目標
1、掌握Com元件的概念及原理
2、編寫一個簡單的以DLL形式展現的Com元件
3、通過 VBS 實現跨語言呼叫CO
使用thrift的流程:
1、下載thrift的exe,編寫thrift介面檔案,使用thrift --gen java + 檔名生成Java的介面檔案,使用thrift --gen js:node +檔名
生成nodejs介面檔案。介面檔案PrintService.th
Hessian是跨語言基於HTTP的RPC框架,傳輸的資料格式是二機制。網上找了很多例子,基本上都是同語言之間的RPC呼叫例子,基本沒有跨語言的,自己折騰一下,使用Java編寫PRC服務端,使用Java和Python作為客戶端呼叫RPC服務。
Java 服
每種語言都有自己最擅長的領域,Golang 最適合的領域就是伺服器端程式。
做為伺服器端程式,需要考慮效能同時也要考慮與各種語言之間方便的通訊。採用http協議簡單,但效能不高。採用TCP通訊,則需要考慮封包、解包、粘包等等很多因素,而且想寫個高效的TCP服務,也很難。
軟體環境:
ubuntu14.04
eclipse
clion
一、java程式碼
在eclipse中新建Test工程,package為test,建立Demo類。Demo.java如下。
package test;
public class Demo {
來新公司學習接手新專案,拿到程式碼開啟解決方案看到裡面竟然有40幾個工程,有點吃驚。具體看程式碼也有很多之前沒見過的寫法,上了幾天火。
有件事就沒太搞明白,按照文件的說法上層很多軟體都要呼叫IO伺服器,但看程式安裝目錄,IO伺服器其實是一個exe程式,按照我之前的印象,能被別的程式呼叫的也得是動態庫、靜態庫或 vs2019 Com元件初探-簡單的COM編寫以及實現跨語言呼叫
上一篇實現瞭如何編寫基於IDipatch介面的COM以及vbs如何呼叫編寫的COM
本次主要是實現VBS的CreateObject函式的邏輯
前提條件
1、掌握C++基礎語法
2、平臺安裝 vs2019
3、本地平臺為 final 問題 不同 err gin 之間 統一 tex cgi 這段時間,一直在整理公司的內部 rpc 服務接口,面臨的一個問題就是:由於公司內部的系統由幾個不同的語言編寫的。C# ,java,node.js 等,如何實現這些內部系統之間的接口統一調用,確實是比較麻煩,
最近一段時間單位在做一個Web專案,工程師用JAVA語言,需要公用人員資訊,統一使用者名稱和密碼,原有的平臺中是用C#語言開發的,在網上查詢解決方法,通過JAVA呼叫C#的DLL檔案實現。網上資料很多,自己整合總結了一下,做個備忘。
一、C#寫com元件
開發環境
之前在pytorch和keras中經常發現一個類model被直接呼叫,發現很有意思。於是就去看了看pytorch中nn.Module的原始碼,發現是定義了__call__(self)函式再去呼叫forward()函式。舉個例子如下:
import math
class Pow(o
多執行緒呼叫COM元件的體會(CoInitialize)
呼叫任何COM元件之前,你必須首先初始化COM套件環境,即呼叫CoInitialize或CoInitializeEx。COM套件環境線上程的生存週期內有效,執行緒退出前需要呼叫CoUninitializ
新建專案 -- ATL專案 (專案屬性--連結器--常規--逐使用者重定向 --選為是)
確定,跳出ATL選項,直接再點確定
addcom專案新增專案
新增類test(atl簡單物件)
此時test.h中的標頭檔案addcom_i.h尚未生成,只是一個
背景:
用C#的Aspose.word控制元件,向word的書籤中插入圖片時,需要設定圖片文字環繞:嵌於文字下方。
要實現這一功能時加入如下程式碼時報出的錯誤:
就是這個ConvertToShape()出了錯。
解決方法:
經過多次嘗試,找各種別的控制元件
原文地址為:
對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL。
win7系統,用c#呼叫Interop.SHDocVw.dll時,報了個對“ COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”的錯誤。網上有人說要 搞定一種語言之後,是不是很希望演算法能在近百種語言上無縫遷移?
AI真能無師自通,對於我們這些“因為語言不通而分散在各處”的人們來說,簡直是天大的福音。
新鮮出爐的Facebook“多語種句嵌入”,就是這樣一種“神器”。他們提出了一種新架構,為橫跨34個語族、28種不同文字寫成的的93種語言,學習了統一的
以gp工具中的merge工具進行示例分析:1、當引數input所表示的要素型別不一致的時候會出現“對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”提示。2、當引數output所表示的要素已存在,且gp工具的overwrite屬性設定為false的時候也會出現
①建立C#類庫(ClassLibrary)、設定AssemblyInfo.cs中的[assembly: ComVisible(true)]預設是false、或者在介面和類之前新增設定為true
[ComVisible(true)]
[Guid("E709D3
最近在做一套和圖書有關的專案,其中有一個功能為使用者上傳的各類文件(doc、docx、ppt、pptx、pdf等型別)統一轉換為PDF型別。word格式的轉為PDF就不用說了,推薦一個第三方DLL:Aspose.Words.dll.
Aspose這套DLL專門用來對付Offi
public void CreateFeatureClass_Terrain_Info(IFeatureWorkspace IFW)
{
IFeatureClass tempFeatureClass = IFW.OpenFeatureClass( 相關推薦
讓COM元件可被跨語言呼叫
vs2019 Com元件初探-簡單的COM編寫以及實現跨語言呼叫
thrift跨語言呼叫服務,以nodejs和Java為例
Hessian跨語言呼叫例項
Golang通過Thrift框架完美實現跨語言呼叫
ubuntu14.04下通過JNI使用C++跨語言呼叫java例項
建立最簡單的exe形式COM元件並在MFC程式呼叫
vs2019 Com元件初探-通過IDispatch介面呼叫Com
Thrift是一款由Fackbook開發的可伸縮、跨語言的服務開發框架
通過COM元件方式實現java呼叫C#寫的DLL檔案 轉
讓python類直接被呼叫
多執行緒呼叫系統COM元件的體會(CoInitialize)
vs2017生成COM元件,VB呼叫
對COM元件的呼叫返回了錯誤 HRESULT E_FAIL
對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL。
讓AI觸類旁通93種語言:Facebook推出跨語言句嵌入,搞定小語種
geoprocessor(GP)工具提示“對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”的幾種情況
C#生成com元件形式的dll供C++呼叫
關於C#操作PPT時遇到的“對COM元件的呼叫返回了錯誤HRESULT E_FAIL”錯誤的解決方法
AE+C#把資料寫入GDB資料庫裡出現 “對COM元件的呼叫返回了錯誤 HRESULTE_FAIL”