C++和C#編寫調用COM組件

來源:互聯網
上載者:User

C++和C#編寫調用COM組件

來源:http://bbs.gameres.com/showthread.asp?threadid=122865

摘要:現在COM組件的使用越來越廣泛,在各個程式中調用COM組件我想大家都遇到過,這篇文章就是關於COM組件的編寫和調用的,主要包含了使用VC6.0編寫和調用COM組件,VS2005中使用C#編寫和調用COM組件,以及在VC6.0和VS2005之間互相調用COM組件。

本文:

前一陣在工作中做項目的時候,遇到了COM組件的調用和使用問題,當時研究和好一陣,才把中間的環節打通,現在寫出來為大家提供方便,這裡包含了四個類型:

1、在VS2005中,C#編寫DLL並使用C++調用

2、在VS2005中C#編寫的COM組件,使用VC6.0調用

3、在VC6.0中編寫COM組件,使用VS2005 C#調用

4、在VC6.0中編寫COM組件,使用VC6.0調用

其中每個類型都寫了兩個程式,一個為COM組件程式,一個為調用程式

程式實現:

1、在VS2005中,C#編寫DLL並使用C++調用

(1)C#編寫DLL程式

建立C#編寫的DLL程式AddDll,項目類型為:類庫

程式碼:

using System;
using System.Collections.Generic;
using System.Text;

namespace AddDll
{
    public class Add
    {
        public int iadd(int a, int b)
        {
            int c = a + b;
            return c;
        }
    }
}
      

(2)C++編寫調用程式

建立C++的Win32控制台應用程式UseDll,項目類型為:Win32控制台應用程式

配置:右鍵點擊方案總管中的UseDll,選擇“屬性”,將公用語言運行庫支援設定為“公用語言運行庫支援(/clr)”

圖一 公用語言運行庫設定

程式碼:

#include "stdafx.h"
#include "stdio.h"

#using "..\debug\AddDll.dll"
using namespace AddDll;

int _tmain(int argc, _TCHAR* argv[])
{
        int result;
        Add ^add = gcnew Add();
        result = add->iadd(10,90);
        printf("%d",result);
        scanf("%s");
        return 0;
}
      

2、在VS2005中C#編寫的COM組件,使用VC6.0調用

(1)VS2005中使用C#編寫COM組件

建立C#編寫的COM組件,項目類型為類庫

配置:右鍵點擊方案總管中的AddCom,選擇“屬性”,選擇“產生”,選擇“為COM Interop註冊(_P)”

開啟AssemblyInfo.cs檔案,設定[assembly: ComVisible(true)]

這用就可以產生AddCom.tlb檔案

圖二 COM產生設定

程式碼:

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

namespace AddCom
{
    //可以通過//菜單的 “工具/guid產生”。
    //注意要選擇Define Guid{….}格式,並全//部儲存下來,儲存到哪都行,記事本呀什麼的。
    //因為在做VC程式/////////的時候要用到的。
    [Guid("298D881C-E2A3-4638-B872-73EADE25511C")]  
    public interface AddComInterface
    {
        [DispId(1)]
        int iadd(int a, int b);
        [DispId(2)]
        float ladd(float a, float b);
    }

    [Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]
    [ClassInterface(ClassInterfaceType.None)]
    public class AddComService : AddComInterface
    {
        public AddComService()
        {
        }
        public int iadd(int a, int b)
        {
            int c = 0;
            c = a + b;
            return c;
        }
        public float ladd(float a, float b)
        {
            float c = 0;
            c = a + b;
            return c;
        }
    }
}
      

(2)VC6.0編寫調用程式

使用VC6.0編寫建立MFC應用程式UseCom,項目類型為MFC AppWizard(exe)

在stdafx.h添加:

#import "AddCom.tlb"
using namespace AddCom;
      

程式碼:

void CUseComDlg::OnButtonUse()
{
        // TODO: Add your control notification handler code here
        int dresult;
        float fresult;
        CString strResult;

        CoInitialize(NULL);//NULL換成0也可以

        AddCom::AddComInterfacePtr p_Add(__uuidof(AddComService));
        dresult = p_Add->iadd(1,2);
        fresult = p_Add->fadd(1.2,2.3);
        strResult.Format("int:%d \nfloat:%f",dresult,fresult);
        MessageBox(strResult,"計算結果",MB_OK);

        CoUninitialize();  
        
}
      

3、在VC6.0中編寫COM組件,使用VS2005 C#調用

(1)VC6.0編寫COM

使用VC6.0建立COM組件,工程類型:ATL COM AppWizard

程式碼:

介面:

interface IAdd : IDispatch
        {
                [id(1), helpstring("method iadd")] HRESULT iadd([in]int a, [in]int b, [out]int * c);
                [id(2), helpstring("method fadd")] HRESULT fadd([in]float a, [in]float b, [out]float * c);
                [id(3), helpstring("method isub")] HRESULT isub([in]int a, [in]int b, [out]int * c);
        };
      

實現:

STDMETHODIMP CAdd::iadd(int a, int b, int *c)
{
        // TODO: Add your implementation code here
        *c = a + b;

        return S_OK;
}

STDMETHODIMP CAdd::fadd(float a, float b, float *c)
{
        // TODO: Add your implementation code here
        *c = a + b;

        return S_OK;
}

STDMETHODIMP CAdd::isub(int a, int b, int *c)
{
        // TODO: Add your implementation code here
        *c = a - b;

        return S_OK;
}
      

(2)VS2005使用C#編寫調用程式(網站程式)

使用VS2005建立網站UseCom

配置:在方案總管中的主目錄點擊右鍵,選擇添加引用,選擇COM,添加剛剛建立的AddCom 1.0 Type Library

在程式中要using編寫的COM組件:using ADDCOMLib;

圖三 引用COM

程式碼:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ADDCOMLib;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void ButtonCom_Click(object sender, EventArgs e)
    {
        Add add = new Add();
        int iresult;
        float fresult;
        int sresult;

        add.IAdd(10, 20, out iresult);
        add.fadd((float)1.2,(float)2.3, out fresult);
        add.isub(100, 10, out sresult);

        TextBoxResult.Text = iresult.ToString();
        TextBoxRe2.Text = fresult.ToString();
        TextBoxRe3.Text = sresult.ToString();
    }
}
      

4、在VC6.0中編寫COM組件,使用VC6.0調用

(1)VC6.0編寫COM組件

使用VC6.0建立COM組件,工程類型:ATL COM AppWizard

程式碼:

介面:

interface IAdd : IDispatch
        {
                [id(1), helpstring("method iadd")] HRESULT iadd([in]int a, [in]int b, [out]int * c);
                [id(2), helpstring("method fadd")] HRESULT fadd([in]float a, [in]float b, [out]float * c);
                [id(3), helpstring("method isub")] HRESULT isub([in]int a, [in]int b, [out]int * c);
        };
      

實現:

STDMETHODIMP CAdd::iadd(int a, int b, int *c)
{
        // TODO: Add your implementation code here
        *c = a + b;

        return S_OK;
}

STDMETHODIMP CAdd::fadd(float a, float b, float *c)
{
        // TODO: Add your implementation code here
        *c = a + b;

        return S_OK;
}

STDMETHODIMP CAdd::isub(int a, int b, int *c)
{
        // TODO: Add your implementation code here
        *c = a - b;

        return S_OK;
}
      

(2)VC6.0編寫調用程式

使用VC6.0建立MFC應用程式UseCOM,調用剛剛建立的COM組件

將上面程式AddCom產生的AddCom.dll放入本程式的工程目錄和程式組建目錄中

在StdAfx.h中加入:

#import "AddCom.dll" no_namespace

程式碼:

void CUseComDlg::OnBUTTONUse()
{
        // TODO: Add your control notification handler code here
        CString strResult;
        CoInitialize(NULL);//NULL換成0也可以
        IAddPtr m_add = NULL;
        HRESULT hr = S_OK;
        hr = m_add.CreateInstance(__uuidof(Add));

        int d_a = 90;
        int d_b = 10;
        int d_c;
        int d_d;
        float f_a = 1;
        float f_b = 2;
        float f_c;

        m_add->_IAdd(d_a,d_b,&d_c);
        m_add->fadd(f_a,f_b,&f_c);
        m_add->isub(d_a,d_b,&d_d);

        strResult.Format("返回結果:%d; %f; %d",d_c,f_c,d_d);
        MessageBox(strResult,"結果",MB_OK);

        m_add.Release();
        m_add = NULL;
        CoUninitialize();  
        
}
      
結束語:希望能對大家有協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.