首先对COM+组件的写法需要注意以下几点:
1.接口,事件,方法,属性必须是public,
2.方法和属性必须在接口中声明,事件也必须在事件接口中声明.
否则将在VC中无法调用,在接口中声明主要是为了在COM 中的vtab中.
3.必须对接口中的方法,属性,事件前声明[DispId(1)]
4.每个接口都必须有一个GUID
5.而且项目一定需要是COM Interop,并且具有强命名
示例:
//接口声明
[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);
}// // 事件接口声明
[Guid("47C976E0-C208-4740-AC42-41212D3C34F0"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}//对于实现类的声明
[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E")]
ClassInterface(ClassInterfaceType.None),//不产生类接口,如果需要产生声明为ClassInterfaceAttribute
ComSourceInterfaces(typeof(DBCOM_Events))]//声明产生一个COMSource的事件列表
public class DBCOM_Class : DBCOM_Interface
{}
在VC中的调用方法如下:
在VC++中进行组件调用的步骤(以DBCOM.tlb为例):
1、在头文件中导入类型库tlb
#import “DBCOM.tlb”
2、初始化COM以及产生智能指针(一般是在需要调用COM组件中提供的方法时就需要产生指向该接口的智能指针)
CoInitialize(NULL);//初始化COM
DBCOM::DBCOM_Interface p((__uuidof(DBCOM::DBCOM_Class ))); //名字空间::接口Ptr p((__uuidof(名字空间::类)))
DBCOM::DBCOM_Interface * Test=p; //名字空间::接口 指向接口的智能指针
3、调用COM中的方法
_bstr_t m_string=”select * from user”; //传入参数
bool bRet=Test-> ExecuteSelectCommand(m_string);//调用ExecuteSelectCommand方法
4、释放环境