亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > C# > 正文

使用C#創(chuàng)建COM對(duì)象

2023-05-18 12:33:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文中主要討論使用C#創(chuàng)建COM對(duì)象的方法,并從VC++客戶端軟件訪問(wèn)COM的方法。在創(chuàng)建COM對(duì)象時(shí)要使用COM的Interop特性,而在訪問(wèn)COM時(shí),客戶端軟件使用了TypeLibrary(.TLB文件)。

 為了簡(jiǎn)單和方便開(kāi)發(fā)人員使用、測(cè)試起見(jiàn),我們使用了SQLSERVER數(shù)據(jù)庫(kù)軟件的缺省安裝中的Northwind數(shù)據(jù)庫(kù)。

 ·修改COM對(duì)象中SQLServer的名字,與SQLServer連接。

 ·我們已經(jīng)創(chuàng)建了連接數(shù)據(jù)庫(kù)用的分別為scott、tiger的用戶名和口令,我們可以使用它或者其他現(xiàn)有的用戶名和口令。

 第一部分:用C#創(chuàng)建簡(jiǎn)單的COM對(duì)象

 COM對(duì)象是ClassLibrary類(lèi),它生成DLL文件。要在VS開(kāi)發(fā)環(huán)境中創(chuàng)建一個(gè)簡(jiǎn)單的COM對(duì)象,我們可以依次選擇“文件”->“新創(chuàng)建”->“工程”->“VisualC#工程”->“類(lèi)庫(kù)”,然后創(chuàng)建一個(gè)名字為Database_COMObject的工程。

需要注意的是:在COM中調(diào)用VC#對(duì)象需要下面的條件:

 ·類(lèi)必須是public性質(zhì)。

 ·特性、方法和事件必須是public性質(zhì)的。

 ·特性和方法必須在類(lèi)接口中定義。

 ·事件必須在事件接口中定義。

 不是在這些接口中定義的public性質(zhì)的類(lèi)成員不能被COM訪問(wèn),但它們可以被其他的.NET Framework對(duì)象訪問(wèn)。要讓COM能夠訪問(wèn)特性和方法,我們必須在類(lèi)接口中定義它們,使它們具有DispId屬性,并在類(lèi)中實(shí)現(xiàn)這些特性和方法。這些成員定義時(shí)的順序也就是它們?cè)贑OM中順序。要讓COM訪問(wèn)類(lèi)中的事件,必須在事件接口中定義這些事件,并賦予它們DispId屬性。事件接口不應(yīng)當(dāng)由類(lèi)完成,類(lèi)只實(shí)現(xiàn)類(lèi)接口(它可以實(shí)現(xiàn)不止一個(gè)接口,但第一個(gè)接口是缺省接口),應(yīng)當(dāng)在缺省接口中實(shí)現(xiàn)需要讓COM訪問(wèn)的方法和特性,方法和特性必須被標(biāo)識(shí)為public性質(zhì),并符合在類(lèi)接口中的定義。需要讓COM訪問(wèn)的事件也在缺省的類(lèi)接口中完成,它們也必須被標(biāo)識(shí)為public性質(zhì),并符合事件接口中的定義。

 在接口名字之前,每個(gè)接口需要一個(gè)GUID特性。要生成變個(gè)唯一的Guid,需要運(yùn)行g(shù)uidgen.exe工具軟件,并選擇“注冊(cè)表格式”

下面是一個(gè)類(lèi)界面:

[Guid("694C1820-04B6-4988-928F-FD858B95C880")]

 public interface DBCOM_Interface
 {
[DispId(1)]
void Init(string userid , string password);
[DispId(2)]
bool ExecuteSelectCommand(string selCommand);
[DispId(3)]
bool NextRow();
[DispId(4)]
void ExecuteNonSelectCommand(string insCommand);
[DispId(5)]
string GetColumnData(int pos);
}

COM事件接口:

 // 事件接口Database_COMObjectEvents
[Guid("47C976E0-C208-4740-AC42-41212D3C34F0"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}

下面是實(shí)際的類(lèi)定義:

[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class DBCOM_Class : DBCOM_Interface
{

需要注意的是,在類(lèi)的前面,需要設(shè)置下面的特性:

ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]

ClassInterfaceType.None表示沒(méi)有為該類(lèi)生成類(lèi)接口,如果沒(méi)有明確地實(shí)現(xiàn)接口,類(lèi)只能通過(guò)IDispatch提供后期綁定訪問(wèn)。用戶希望通過(guò)明確地由類(lèi)實(shí)現(xiàn)的接口使外部對(duì)象能夠訪問(wèn)類(lèi)的功能,這也是推薦的ClassInterfaceAttribute的設(shè)置。

 ComSourceInterfaces(typeof(DBCOM_Events))]確定許多作為COM事件向外部對(duì)象提供的接口。在本文的例子中,我們不對(duì)外部對(duì)象開(kāi)放任何事件。

下面是COM對(duì)象完整的源代碼:

using System;

using System.Runtime.InteropServices;
using System.IO;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms ;

namespace Database_COMObject
{
[Guid("694C1820-04B6-4988-928F-FD858B95C880")]
public interface DBCOM_Interface
{
[DispId(1)]
void Init(string userid , string password);
[DispId(2)]
bool ExecuteSelectCommand(string selCommand);
[DispId(3)]
bool NextRow();
[DispId(4)]
void ExecuteNonSelectCommand(string insCommand);
[DispId(5)]
string GetColumnData(int pos);
}

// 事件接口Database_COMObjectEvents
[Guid("47C976E0-C208-4740-AC42-41212D3C34F0"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}


[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class DBCOM_Class : DBCOM_Interface
{
private SqlConnection myConnection = null ;
SqlDataReader myReader = null ;

public DBCOM_Class()
{
}

public void Init(string userid , string password)
{
try
{
string myConnectString = "user id="+userid+";password="+password+
";Database=NorthWind;Server=SKYWALKER;Connect Timeout=30";
myConnection = new SqlConnection(myConnectString);
myConnection.Open();
MessageBox.Show("CONNECTED");
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}

public bool ExecuteSelectCommand(string selCommand)
{
if ( myReader != null )
myReader.Close() ;

SqlCommand myCommand = new SqlCommand(selCommand);
myCommand.Connection = myConnection;
myCommand.ExecuteNonQuery();
myReader = myCommand.ExecuteReader();
return true ;
}

public bool NextRow()
{
if ( ! myReader.Read() )
{
myReader.Close();
return false ;
}
return true ;
}

public string GetColumnData(int pos)
{
Object obj = myReader.GetValue(pos);
if ( obj == null ) return "" ;
return obj.ToString() ;
}

public void ExecuteNonSelectCommand(string insCommand)
{
SqlCommand myCommand = new SqlCommand(insCommand , myConnection);
int retRows = myCommand.ExecuteNonQuery();
}

}
}

在創(chuàng)建COM對(duì)象前,我們必須向COM Interop注冊(cè)該對(duì)象。右擊方案管理器中的工程名字,點(diǎn)擊快捷菜單上的“屬性”選項(xiàng),然后再點(diǎn)擊“配置”->“創(chuàng)建”,擴(kuò)展output小節(jié),將Register for COM Interop選項(xiàng)的值設(shè)置為true。這樣,一個(gè)COM對(duì)象就能夠與可管理性應(yīng)用程序進(jìn)行交互。

為了使COM對(duì)象能夠被外部對(duì)象調(diào)用,類(lèi)庫(kù)組合必須有一個(gè)強(qiáng)名字。創(chuàng)建強(qiáng)名字需要用到SN.EXE名字:
sn -k Database_COM_Key.snk
打開(kāi)AssemblyInfo.cs,并修改下面一行的內(nèi)容:
[assembly: AssemblyKeyFile("Database_COM_Key.snk")]

創(chuàng)建對(duì)象。創(chuàng)建對(duì)象會(huì)生成一個(gè)可以被導(dǎo)入到可管理性或非可管理性代碼中的類(lèi)庫(kù)。
第二部分:使用Visual C++創(chuàng)建訪問(wèn)COM對(duì)象的客戶端軟件
·使用VC++開(kāi)發(fā)環(huán)境創(chuàng)建一個(gè)簡(jiǎn)單的工程。
·使用#import directive導(dǎo)入類(lèi)型庫(kù)。
·在界面中創(chuàng)建一個(gè)Smart Pointer,從接口中執(zhí)行COM類(lèi)提供的功能。確保在應(yīng)用程序加載時(shí)添加CoInitialize()調(diào)用:
CoInitialize(NULL);

Database_COMObject::DBCOM_InterfacePtr p(__uuidof(Database_COMObject::DBCOM_Class));
db_com_ptr = p ;
db_com_ptr->Init("scott" , "tiger");

下面的代碼對(duì)Customers數(shù)據(jù)庫(kù)表執(zhí)行一個(gè)SQLming令,返回給定ID的客戶的信息:
char cmd[1024];
sprintf(cmd , "SELECT COMPANYNAME , CONTACTNAME ,
CONTACTTITLE , ADDRESS FROM CUSTOMERS WHERE CUSTOMERID = '%s'" , m_id );
const char *p ;

bool ret = db_com_ptr->ExecuteSelectCommand(cmd);

if ( ! db_com_ptr->NextRow() ) return ;

_bstr_t mData = db_com_ptr->GetColumnData(3);
p = mData ;
m_address = (CString)p ;

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产蜜臀一区二区打屁股调教| 精品一区二区三区蜜桃在线| 国产伦理久久久久久妇女| av日韩在线看| 久久久久久亚洲中文字幕无码| 欧美日韩免费观看视频| 91成人综合网| 被男人吃奶添下面好舒服动态图| 中文字幕人妻一区二区三区在线视频| 欧亚精品中文字幕| 亚洲色图美国十次| kk眼镜猥琐国模调教系列一区二区| 中文字幕在线视频区| 欧美精品久久久久久久久久| 欧美怡红院视频一区二区三区| 国产精品一区二区三区不卡| 蜜桃视频一区二区在线观看| 国产精彩精品视频| 日韩网站在线播放| 欧美成人精品xxx| 亚洲香蕉伊综合在人在线视看| 亚洲精品网站在线播放gif| 一区高清视频| 九一精品在线观看| 国产成人成网站在线播放青青| 永久免费黄色片| 亚洲欧洲成人| 超级白嫩亚洲国产第一| 一区视频二区视频| 69精品国产久热在线观看| 麻豆av福利av久久av| av动漫精品一区二区| 2019中文在线观看| 亚洲日本中文字幕免费在线不卡| 日韩精品一区二区三区视频播放| 午夜不卡久久精品无码免费| 午夜日韩在线电影| 青青草超碰在线| 国产黄色免费网站| 久久另类ts人妖一区二区| 伊人色综合久久久天天蜜桃| 国产无遮挡一区二区三区毛片日本| 日本成人精品在线| 国产成人在线网站| 国产又粗又猛又爽又黄的视频四季| 日韩亚洲欧美高清| 97超碰人人模人人爽人人看| 91插插插影院| 成人在线免费观看视频| 久久这里精品国产99丫e6| 久久99导航| 欧美视频免费一区二区三区| 色xxx在线播放| 成人精品美女隐私视频| www.99久久热国产日韩欧美.com| 五月天婷婷视频| 国产又黄又粗又猛又爽的| 97caocao| 久久久久亚洲av成人网人人软件| 亚洲三级黄色在线观看| 免费的黄网站在线观看| 精品国产大片大片大片| 亚洲自拍另类综合| 美女搞黄视频在线观看| 污网站免费看| 韩国三级成人在线| www.国产91| 女子免费在线观看视频www| 成人动漫一区二区| 中文字幕在线观看第二页| 中文字幕一区二区三三| 6080日韩午夜伦伦午夜伦| 国产婷婷色一区二区三区在线| 91免费的视频在线播放| 久久久久久久久99精品大| 日韩大尺度视频| 国产精品高潮呻吟av| 四虎国产精品成人免费入口| 亚洲欧美中文字幕| 久久综合色鬼综合色| 久久精品三级视频| 精品毛片乱码1区2区3区| 亚洲午夜精品一区二区三区他趣| 欧美1级2级| 精品欧美一区二区久久| 日本一区二区三区四区在线观看| 国产高清一区日本| 精品久久久久久久久久久院品网| 亚洲人成在线播放| 国产三级视频在线播放| 能在线看的av| 人妻人人澡人人添人人爽| 精品日本一区二区三区在线观看| 亚洲美女视频在线| 毛片网站免费观看| 伊人国产在线| 99久久免费国| 四虎成人精品在永久免费| 人人做人人爽| 日韩久久免费视频| 亚洲人成人一区二区三区| 国产在线观看免费视频软件| 亚洲乱码一区| 91在线中文| 先锋影音av资源在线| 亚洲日本无吗高清不卡| 精品视频9999| 四虎永久免费在线观看| 懂色av中文在线| 欧美va亚洲va在线观看蝴蝶网| 色播在线视频| 91久久国语露脸精品国产高跟| 亚洲国产高清一区二区三区| av成人午夜| 成年人免费网站在线观看| 精品美女久久久久久免费| caoporn视频在线观看| 欧美xxx在线观看| 4438x成人网全国最大| www.夜夜操| 国产66精品| 欧美成人一区二区| 精品美女一区二区| 亚洲综合色自拍一区| 国产亚洲视频中文字幕视频| 久久日文中文字幕乱码| 91在线公开视频| 久久精品97| 欧美专区一二三| 亚洲影影院av| 9国产精品午夜| 成人国产激情在线| 日韩精品一卡| 日韩欧美一区二区三区在线视频| 亚洲一区二区三区四区中文| 无码人妻精品一区二区三区99v| 欧美在线观看视频| 久久国产福利国产秒拍| 亚洲黄色免费视频| 亚洲性生活大片| 亚洲一区二区三区视频| 蜜臀av在线播放| 欧美五级在线观看视频播放| 国产精品99精品久久免费| www.玖玖玖| 国产suv精品一区二区69| 欧洲成人一区二区三区| 亚洲永久精品一区| 激情文学一区| 一区二区高清| 久久伊人成人网| 免费一级片在线观看| 午夜小视频免费| 97久久香蕉国产线看观看| 亚洲国产欧美一区二区三区不卡| 97人妻精品一区二区三区视频| 精品日韩99亚洲| 少妇高潮一区二区三区69| 偷偷看偷偷操| 色伦专区97中文字幕| 国产毛片在线视频| 蜜桃av久久久亚洲精品| 2023国产一二三区日本精品2022| 日本午夜在线观看| 国产91网红主播在线观看| 欧美日韩午夜在线视频| 亚洲图片在线视频| 老汉色老汉首页av亚洲| 国产呦精品一区二区三区网站| 欧美一区三区四区| 久久久全国免费视频| 黄色网址在线播放| 天堂久久精品忘忧草| 国产色噜噜噜91在线精品| 亚洲综合色婷婷在线观看| 日韩精品一区二区三区在线| 欧美色视频日本高清在线观看| 国产一级一片免费播放| 亚洲成a天堂v人片| 欧美第一淫aaasss性| 男人的天堂va在线| 一本久道中文字幕精品亚洲嫩| 97精品在线播放| 99久热re在线精品996热视频| 日韩免费看网站| 久久精品国产99国产精品澳门| a篇片在线观看网站| 玛雅亚洲电影| 国产理论视频在线观看| 欧美在线观看18| 欧美xxxx性| 日韩精品一区二区三区免费视频| 精品久久久久av影院| 青娱乐精品在线视频| 国产一区成人| 国产综合色产在线精品| 亚洲色图21p| 国产五月天婷婷| 亚洲理论片在线观看| 国产精品白嫩初高中害羞小美女| 免费一二一二在线视频| 日韩熟女一区二区| 亚洲国产成人精品一区二区三区| 四虎影视最新网站入口在线观看| 狠狠色伊人亚洲综合成人| av加勒比在线| 欧美在线日韩在线| 亚洲女人初尝黑人巨大| 日韩亚洲色图| 国产福利热线视频| 成人18网址在线观看| 亚洲人成免费网站| 日韩最新在线| 国产成人免费91av在线| 国内自拍视频网| 色综合天天综合狠狠| 国产一区二区视频免费观看| 亚洲欧美偷拍一区| 91啪国产在线| 波多野结衣av在线观看| 国产综合在线播放| 麻豆91在线观看| 无码人妻精品一区二区三应用大全| 无码人妻精品一区二区三区夜夜嗨| 亚洲成人自拍视频| 亚洲视频在线观看| 欧美国产激情二区三区| 高清shemale亚洲人妖| 日韩大陆毛片av| 国产一级片毛片| 色婷婷**av毛片一区| 亚洲欧洲闷骚av少妇影院| 精品国产亚洲一区二区麻豆| 中文字幕免费在线观看| 黄色毛片免费看| 国产在线观看色| 欧美jizz19性欧美| 日韩美女写真福利在线观看| 亚洲精品视频在线看| 成年人在线看| 欧美另类z0zxhd电影| 偷拍中文亚洲欧美动漫| 国产999在线观看| 牛牛精品在线视频| 亚洲欧美日韩国产手机在线| 综合中文字幕亚洲| 天堂中文字幕在线| 国产乱女淫av麻豆国产| 日韩不卡一区二区| 中文先锋资源| 99久久香蕉| 亚洲国产精品专区久久| 日韩经典中文字幕在线观看| 日韩黄在线观看| 可以在线观看的av| 国产91精品久久久久久久网曝门| 成人97人人超碰人人99| 国产99re66在线视频| 国产精品第108页| xxxxx.日韩| 天天干在线影院| 久草热视频在线观看| 国产欧美日韩专区发布| 97精品人妻一区二区三区香蕉| 97人妻人人揉人人躁人人| 欧美午夜精品久久久久免费视| 红桃成人av在线播放| 国产国语老龄妇女a片| 日本一区二区在线观看视频| 欧美视频免费播放| 国产福利精品一区二区| 18禁免费观看网站| 国产福利一区二区在线精品| 一区二区国产精品精华液| 三级黄在线播放| 国产精品免费网站在线观看| 亚洲国产一区在线观看| 免费在线一区观看| 欧美mv日韩| 美女看a上一区| 亚洲**2019国产| 国产精品久久久久久久9999| 中文在线а√天堂| 日韩激情视频一区二区| 欧美不卡1区2区3区| 成人综合婷婷国产精品久久| 日韩av在线播放中文字幕| 国产午夜精品美女视频明星a级| 亚洲大胆精品| 日韩成人久久久| 免费国产自久久久久三四区久久| 免费看涩涩视频| 欧美艳星介绍134位艳星| 超碰在线免费公开| 男人天堂综合网| 亚洲一线二线三线视频| 国产免费一区二区视频| 成人黄色影视| 91亚洲免费视频| 在线亚洲日本| 日韩欧美在线观看一区二区三区| 一个人看的免费网站www视频| 国内精品伊人久久久久av一坑| 国产亚洲精品美女久久久m| 亚洲最大天堂网| 高潮毛片7777777毛片| 欧美午夜不卡影院在线观看完整版免费| 国产日本欧美一区二区三区在线| 999国产精品永久免费视频app| 成人在线小说| 制服国产精品| 特级毛片在线免费观看| 日韩女优视频免费观看| 欧美色xxxx| 黑人巨大精品欧美一区二区小视频| 免费日韩av片| 热国产热中文视频二区| 三级在线观看| 日韩在线免费观看av| 欧美伊人久久久久久久久影院| 91香蕉一区二区三区在线观看| 精品无人区卡一卡二卡三乱码免费卡| 日韩三级精品电影久久久| 丰满人妻熟女aⅴ一区| 成人黄视频在线观看| 亚洲人成精品久久久| 亚洲精品国产精华液| 97人人爽人人喊人人模波多|