1. 程式人生 > >C# 怎麼建立COM元件 C++中的ATL

C# 怎麼建立COM元件 C++中的ATL

環境:VS2012。 1、新建一個類庫專案,命名ComTestDLL。進去後將預設的類Class1改成自己喜歡的名字如ComTest.cs,系統會提醒是否給類改名,選確定; 2、修改Properties目錄下面的AssemblyInfo.cs,將ComVisible屬性設定為true;然後點選專案->屬性 在生成選項卡的底部位置勾選“為COM互操作註冊”;如果想加密的話,在簽名選項卡尚勾選為程式集簽名,建立一個強名稱金鑰。下面就是要新增程式碼了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ComTestDLL
{
    [Guid("EBD4A297-3BEE-4F29-B6BC-85D9DED1FFD8")]
    public interface IComTest
    {
        [DispId(1)]//指定屬性,欄位,函式的COM排程識別符號
        int Add(int x, int y);
        [DispId(2)]
        string AddString(string a, string b);
    }
    [Guid("E580CBE7-A8E2-4375-A949-C85D6315A326")]
    [ProgId("ComTestDLL.IComTest")]//允許使用者指定類的ProgId
    [ClassInterface(ClassInterfaceType.None)]//設定com介面類的型別
    public class ComTest : IComTest
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
        public string AddString (string a,string b)
        {
            return a+b;
        }

    }
}

一般會報錯,因為你不是用管理員身份來執行的,如果沒有報錯,恭喜。 刪除線格式

ATL

在COM技術的建立給開發帶來了諸多的便利,但是卻有點難。為了簡化COM程式設計,提高開發效率,人們想了很多辦法。1995年的時候,微軟推出了一種全新的COM開發工具ATL。ATL是ActiveX Template Library 的縮寫,它是一套C++模板。 個人在工作中也用了ATL技術。他會自動生成DLL檔案,需要你 注意幾個檔案。 刪除線格式 “MyATL_i.h”、“MyATL_i.c”(這個檔案主要用來檢視CLSID_MyATLClass和IID_IMyATLClass的值)

刪除線格式 還有一個.idl檔案。 IDL(介面描述語言)_ interface IMyATLClass : IDispatch{ [id(1)] HRESULT Sum([in] LONG para1, [in] LONG para2, [out] LONG* sum); [id(2)] HRESULT PopupDialog([in] CHAR* text);

library MyATLLib中類定義的順序決定了GetTypeInfo中index引數的值

刪除線格式 應有的檔案如下圖:

在這裡插入圖片描述 就圖片啊 (網上down來的) 刪除線格式

例子

//在CPP裡面寫
STDMETHODIMP MyClass::Cal()
{
	...
	return S_OK;
}
//在.h檔案裡面寫
STDMETHOD Cal();
//在idl裡面寫
[id(5)] HRESULT Cal( [in] int i,[out,retval] int* pVal);//in代表輸入 ,out代表 輸出,retval代表返回值。

然後就會 生成一個介面指標,我們在C#裡面就可以通過指標讀了。 比如

#region 程式集 Interop.WaxCal.dll,v1.1.0.0;
//D:\...\Interop.WaxCal.dll
#endregion
using System;
using System.Runtime.InteropServices;
namespace  Interop.WaxCal
{
    [Guid("7CECEF52-A386-47CD-A8FA-AB9A463A23D1")]//是不是跟COM元件很像啊。
    [TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
public interface ICal
{
   //可以是類,也可以是函式
    [DispId(2)]
    WaxCar waxCar{get;set;}
    [Displd(3)]
    void WaxAdd{get;set;}
    //按順序會自動新增 。
}
}

我們要用 的話就定義一個指標物件。

IWaxCal wax; wax. 裡面註冊好了的東西就會出來 。 刪除線格式 注意區別,特別是語言別混了。一個是C#的COM元件,一個是C++中的ATL。