·使用C#創建一個簡單的COM對象(使用COM的Interop特性)
·從VC++客戶端軟件中訪問COM
·修改COM對象中SQLServer的名字
·我們已經創建了連接數據庫用的分別為scott
第一部分
COM對象是ClassLibrary類
需要注意的是
·類必須是public性質
·特性
·特性和方法必須在類接口中定義
·事件必須在事件接口中定義
不是在這些接口中定義的public性質的類成員不能被COM訪問
在接口名字之前
下面是一個類界面
[Guid(
public interface DBCOM_Interface
{
[DispId(
void Init(string userid
[DispId(
bool ExecuteSelectCommand(string selCommand);
[DispId(
bool NextRow();
[DispId(
void ExecuteNonSelectCommand(string insCommand);
[DispId(
string GetColumnData(int pos);
}
COM事件接口
// 事件接口Database_COMObjectEvents
[Guid(
InterfaceType(ComInterfaceType
public interface DBCOM_Events
{
}
下面是實際的類定義
[Guid(
ClassInterface(ClassInterfaceType
ComSourceInterfaces(typeof(DBCOM_Events))]
public class DBCOM_Class : DBCOM_Interface
{
需要注意的是
ClassInterface(ClassInterfaceType
ComSourceInterfaces(typeof(DBCOM_Events))]
ClassInterfaceType
ComSourceInterfaces(typeof(DBCOM_Events))]確定許多作為COM事件向外部對象提供的接口
下面是COM對象完整的源代碼
using System;
using System
using System
using System
using System
using System
namespace Database_COMObject
{
[Guid(
public interface DBCOM_Interface
{
[DispId(
void Init(string userid
[DispId(
bool ExecuteSelectCommand(string selCommand);
[DispId(
bool NextRow();
[DispId(
void ExecuteNonSelectCommand(string insCommand);
[DispId(
string GetColumnData(int pos);
}
// 事件接口Database_COMObjectEvents
[Guid(
InterfaceType(ComInterfaceType
public interface DBCOM_Events
{
}
[Guid(
ClassInterface(ClassInterfaceType
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
{
try
{
string myConnectString =
myConnection = new SqlConnection(myConnectString);
myConnection
MessageBox
}
catch(Exception e)
{
MessageBox
}
}
public bool ExecuteSelectCommand(string selCommand)
{
if ( myReader != null )
myReader
SqlCommand myCommand = new SqlCommand(selCommand);
myCommand
myCommand
myReader = myCommand
return true ;
}
public bool NextRow()
{
if ( ! myReader
{
myReader
return false ;
}
return true ;
}
public string GetColumnData(int pos)
{
Object obj = myReader
if ( obj == null ) return
return obj
}
public void ExecuteNonSelectCommand(string insCommand)
{
SqlCommand myCommand = new SqlCommand(insCommand
int retRows = myCommand
}
}
}
在創建COM對象前
為了使COM對象能夠被外部對象調用
sn
打開AssemblyInfo
[assembly: AssemblyKeyFile(
創建對象
第二部分
·使用VC++開發環境創建一個簡單的工程
·使用#import directive導入類型庫
·在界面中創建一個Smart Pointer
CoInitialize(NULL);
Database_COMObject::DBCOM_InterfacePtr p(__uuidof(Database_COMObject::DBCOM_Class));
db_com_ptr = p ;
db_com_ptr
下面的代碼對Customers數據庫表執行一個SQL命令
char cmd[
sprintf(cmd
CONTACTTITLE
const char *p ;
bool ret = db_com_ptr
if ( ! db_com_ptr
_bstr_t mData = db_com_ptr
p = mData ;
m_address = (CString)p ;
From:http://tw.wingwit.com/Article/program/net/201311/15785.html