1. 程式人生 > >C#通過COM元件呼叫C++的程式碼(轉載)

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。希望能幫助