C#通過COM元件呼叫C++的程式碼(轉載)
一.通過ALT建立COM元件
1、建立ATL Project
步驟1:建立一個解決方案。
步驟2:在 該解決方案中,新建一個 vc++ 的 ATL 專案。見下圖
選擇Dynamic-link library(DLL)
2、向工程中新增ATL物件
選擇ATL Simple Object
名字為FunTest
Interface選擇Custom
3、在介面中新增方法.(在類檢視中)
方法名為Sum,引數如下圖,有三個引數
介面方法的實現, 這個太簡單了
STDMETHODIMP CFunTest::Sum(LONG num1, LONG num2, LONG* pVal) {// TODO: Add your implementation code here *pVal = num1 + num2; return S_OK; }
二.在C#中呼叫COM元件
1、新建一個C# console專案,比如叫Test(winform的也是一樣道理,只是Console除錯更方便而已。第一次在C#中呼叫COM元件時,建議先用Console試試,否則會搞得一頭煙)
2、新增引用:
在彈出的對話方塊中選COM子頁,找到ATLProjectTest 1.0型別庫(或類似的東西)
就會發現在Test->引用下多了ATLProjectTestLib
3在主函式(program.cs)中呼叫元件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ATLProjectTestLib; namespace Test { class Program { static void Main(string[] args) { ATLProjectTestLib.FunTestClass f1 = new FunTestClass(); Console.Write (f1.Sum(3,4)); } } }
三.很多的細節及注意事項
僅按上面一步步地操作下來發現還會出錯,會說找不到XX COM元件,或是COM元件沒註冊。實際上很多不當操作都會導致上面這個錯誤。只有當你生成的檔案中有Interop.ATLProjectTestLib.dll時,你才算成功了。
1、所有修改都要重新編譯。如修改了ATL專案,首先要重新編譯ATL,再重新編譯C# project。當把專案移到另一臺計算機,有時編譯器由於ATL專案沒有被修改,而不會重新編譯,這就無法寫登錄檔。這時可以把ATL專案的Debug資料夾刪除,再重新編譯。
2、在建立ATL project時,由於一個選Dual或Custom的地方,我認為應該選Dual,但網上較多文章選Custom。
以下是選了Custom後應做的補救,
回到ATLProjectTest,在ATLProjectTest.idl中(或雙擊 類檢視->IFunTest)
import "oaidl.idl"; import "ocidl.idl"; [ object, uuid(90477521-7218-4CA1-AADC-EAF3C42AB24B), dual, //--------按原做法不設這個屬性,只有設了這個屬性才不會錯 helpstring("IFunTest 介面"), pointer_default(unique) ]
3、ATL預設按32位編譯,而C#中一般是按any CPU形式,像我是64位機的就要小心了。要改一下C#專案中的生成規則。
點選專案的屬性頁:
設定目標平臺為x86
4、做完上面這3點,大概Test應該能運行了。可以先跳到第四大點看完後再倒回來。
在實際的工程中,一般有很多個專案,假設以C#專案為主,還有一個ATL專案ATLProjectTest。而這個ATLProjectTest被Business專案(邏輯層)呼叫,而Business又被Form專案(使用者層)呼叫,這都是很常見的。
在“編譯”時就不能直接啟動除錯,要按ATLProjectTest->Business->Form的順序一個個地生成專案。
5、有時會因為找不到Interop.ATLProjectTestLib.dll而出錯,可以試著把各個專案的輸出路徑都改到同一個資料夾(如使用者層工程的資料夾)。
四.更具體的程式設計
ATL與C#型別對應
ATL |
C# |
LONG |
long |
DOUBLE |
double |
CHAR |
sbyte |
VARIANT_BOOL |
bool |
BSTR |
string |
* |
ref |
在C++中更多用STL string來寫
BSTR與STL string的轉化方法
#include <iostream> #include <string> #include<comutil.h> #pragma comment(lib,"comsuppw") using namespace std; string str; //STL string BSTR bs; bs = _com_util::ConvertStringToBSTR(str.c_str()); str = _com_util::ConvertBSTRToString(bs);
解決了字串的問題陣列和物件都好辦,因為可以序列化。
有關建構函式和解構函式我還不太會怎麼做,但可以自定義Init()和ToEnd()來應付一下。
相關推薦
C#通過COM元件呼叫C++的程式碼(轉載)
一.通過ALT建立COM元件 1、建立ATL Project 步驟1:建立一個解決方案。 步驟2:在 該解決方案中,新建一個 vc++ 的 ATL 專案。見下圖 選擇Dynamic-link library(DLL) 2、向工程中新增ATL物件
C# 開源控制元件DockPanel 使用心得(重要)
DockPanel中提供了幾個可用的類,重要的有兩個:DockPanel和DockContent。 DockPanel是從panel繼承出來的,用於提供可浮動的dock的子視窗進行浮動和dock的場所, DockContent是從form類中繼承出來的,用於提供可浮動的視窗基類.就是說: Doc
C#中將ListView資料匯出為excel(轉載)
首先引用excel庫,下面我把程式碼貼出來。 /// <summa
COM元件設計與應用(十三)——事件和通知(VC6.0)
一、前言 我的 COM 元件執行時產生一個視窗,當用戶雙擊該視窗的時候,我需要通知呼叫者; 我的 COM 元件用執行緒方式下載網路上的一個檔案,當我完成任務後,需要通知呼叫者; 我的 COM 元件完成一個鐘錶的功能,當預定時間到達的時候,我需要通知呼叫者; ... ... ... ... 本回書
通過前臺jquery呼叫本地WebService(二) 傳遞SOAP體
上一篇介紹了SOAP體的傳遞部分 其實距離整個SOAP體還有一個 限制很大的頭資訊 這個頭資訊也是SOAP體的一部分 這個頭資訊算得上是SOAP協議標籤 如果沒有那麼無論你傳遞的XML多麼符合SOAP的標準 沒有這個頭資訊 一樣是相當於一個普通的HTTP協議 並不是傳遞We
C++關於erase的復雜度(轉載)
線性 復雜度 mouse 攤銷 sta dia mona -c lims 被這個問題困擾了很多次,有必要整理一下。 當然最好的參考資料就是http://www.cplusplus.com/reference/set/set/erase/ 裏的Complexcity部分了,
編寫更高效的 lua 程式碼(轉載)
編寫更高效的 lua 程式碼 轉自 : https://wuzhiwei.net/lua_performance/ 我們不能靠臆想和憑空猜測來決定優化哪個部分,程式碼的執行效率必須是可測量的。我們需要藉助於分析器來測定效能的瓶頸,然後著手優化。優化後,我們仍然要藉助於分析器來測量所做的優化是否真
Unity之安卓啟動外部APK,無需安卓程式碼(轉載)
if (GUILayout.Button("LoadApk")) { openPackage("com.test.apk"); } } void openPackage(string pkgName) {
netlink監聽網路變化程式碼(轉載)+流程分析(原創+轉載)+資料結構以及相關巨集的解析(原創)
一.netlink監聽網路變化程式碼(Linux下使用NetLink 監聽網路變化) #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h>
一些實用的javascript程式碼(轉載)
oncontextmenu="window.event.returnvalue=false" 將徹底遮蔽滑鼠右鍵<table border oncontextmenu=return(false)><td>no</table> 可用於Table <body onsele
通過代理使用遠端桌面(Mstcs)(轉載)
轉載自:http://www.zfnn.com/post/451.html眾所周知Windows的遠端桌面(Mstcs)用的3389埠,而且這個遠端桌面Mstcs 沒有代理設定,很人撓頭。加之該遮蔽的埠都給網管封死,QQ都不給上,只望網管在伺服器上做埠映射了,恐怕是痴人說夢了
通過COM元件方式實現java呼叫C#寫的DLL檔案 轉
最近一段時間單位在做一個Web專案,工程師用JAVA語言,需要公用人員資訊,統一使用者名稱和密碼,原有的平臺中是用C#語言開發的,在網上查詢解決方法,通過JAVA呼叫C#的DLL檔案實現。網上資料很多,自己整合總結了一下,做個備忘。 一、C#寫com元件 開發環境
實現通過COM元件方式實現java呼叫C#寫的DLL檔案的完整demo
最近因為工作需要,客戶那邊工程師使用的是JAVA語言開發的程式,我們這邊平臺中是用C#語言開發的,因為有些操作必須統一,所以我在網上查詢解決方法,自己也實踐過,在這裡做個筆記吧,分享一下。 一、使用C#編寫com元件 開發環境 :VS2017 1、新建工程:CalcTest(類庫專案,根據自己喜好需要取工
C#生成com元件形式的dll供C++呼叫
①建立C#類庫(ClassLibrary)、設定AssemblyInfo.cs中的[assembly: ComVisible(true)]預設是false、或者在介面和類之前新增設定為true [ComVisible(true)] [Guid("E709D3
如何使用C++建立COM元件(ATL專案)
這裡新增的類one就是一個介面,在.cpp中可以實現多個方法。 注意,不要忘記在test.idl檔案中宣告將要暴露出去的方法,one介面的clsid是:59CF380D-5F6C-44A0-BAC0-F81D1ADAE4CD。 [ object, uuid(E2CC7541-888A-439B-BA
用C#通過反射實現動態調用WebService 告別Web引用(轉載)
sse data 語言 con classname ext 級別 creat 字符 我們都知道,調用WebService可以在工程中對WebService地址進行WEB引用,但是這確實很不方便。我想能夠利用配置文件靈活調用WebService。如何實現呢? 用C#通過反射
iOS 編寫高質量Objective-C程式碼(六)
級別: ★★☆☆☆ 標籤:「iOS」「Block」「Objective-C」 作者: MrLiuQ 審校: QiShare團隊 前言: 這幾篇文章是小編在鑽研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助大家以簡潔
關於MATLAB轉C++程式碼(一)
沒時間寫,上圖快一點, 1、寫好主執行檔案,m_18_10_30.m,並且執行 2、單擊MATLAB Coder 3、進入,選擇函式(而不是執行檔案) 4、Next,選擇執行的檔案,m_18_10_30.m 5、''let me enter...'',是開啟
關於MATLAB轉C++程式碼(二)
有一些遇到過的問錯誤提示 一、“The left-hand side has been constrained to be non-complex, but the right-hand side is complex. To correct this problem, make the r
iOS 編寫高質量Objective-C程式碼(八)
級別: ★★☆☆☆ 標籤:「iOS」「Foundation」「Objective-C」 作者: MrLiuQ 審校: QiShare團隊 前言: 這幾篇文章是小編在鑽研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助