VC调用com的两种方式


在vc中需要调用com

测试了两种可用方式,记录一下~


1.import 方式

将com放在源代码对应路径下

代码中添加

#include <initguid.h>
#import "G_ET_GESCOM_164.dll" named_guids //named_guids将com参数装载在对应的类的变量中,以方便后期com的使用,如G_ET_GESCOM_164Lib等
using namespace G_ET_GESCOM_164Lib;

使用时:

CoInitialize(NULL);     //初始化com使用环境
IET_GESCOM_164Ptr	m_pGescom;
m_pGescom.CreateInstance( CLSID_ET_GESCOM_164 );
BSTR* pExpnum = new BSTR;
memset( pExpnum , 0 , sizeof(BSTR));
if( m_pGescom == NULL )
{
	return false;
}
try{
   m_pGescom->InitStatus( _T("test"), AWBflag , WaybillDB_DIR );
}
catch( COleDispatchException *e )
{
   e->Delete();
   return false;
}
try{
   m_pGescom->OtherFunction( pExpnum );
}
catch( COleDispatchException *e )
{
   e->Delete();
   return false;
}

由于我的装载没有成功载入G_ET_GESCOM_164Lib和CLSID_ET_GESCOM_164的变量导致后期调用失败

解决办法为先使用#import "G_ET_GESCOM_164.dll" named_guids  import对应的com,生成 S_ET_GESCOM_164.tlh 和 S_ET_GESCOM_164.tli (装载成功了部分数据结构)

再修改import为 #import "G_ET_GESCOM_164.dll" no_namespace并删除using namespace G_ET_GESCOM_164Lib;

在注册表中寻找com对应的注册信息,可以在tlh文件中添加CLSID_ET_GESCOM_164 = uuid;

或直接使用注册表中信息( 如S_ET_GESCOM.ET_GESCOM_164)

修改后如下:

CoInitialize(NULL);     //初始化com使用环境
IET_GESCOM_164Ptr	m_pGescom;
m_pGescom.CreateInstance( _T("S_ET_GESCOM.ET_GESCOM_164") );
BSTR* pExpnum = new BSTR;
memset( pExpnum , 0 , sizeof(BSTR));
if( m_pGescom == NULL )
{
	return false;
}
try{
   m_pGescom->InitStatus( _T("test"), AWBflag , WaybillDB_DIR );
}
catch( COleDispatchException *e )
{
   e->Delete();
   return false;
}
try{
   m_pGescom->OtherFunction( pExpnum );
}
catch( COleDispatchException *e )
{
   e->Delete();
   return false;
}

2. 第二种方式是用ctrl + w的方式导入class,将com用类的方式使用(类似于excel类库的使用方法)
ctrl+ w选择com导入
使用代码为:
BSTR* pExpnum = new BSTR;
memset( pExpnum , 0 , sizeof(BSTR));
CoInitialize(NULL); 
IET_testCOM_102 WB;
COleException *e = new COleException;

if( WB.CreateDispatch( _T("S_ET_testCOM.ET_testCOM_102"),NULL ) != 0 )
{
	try{
		WB.InitStatus( _T("test") );
	}
	catch( COleDispatchException *e )
	{
		e->Delete();
		return false;
	}
	try{
		WB.InitStatus( pExpnum );
	}
	catch( COleDispatchException *e )
	{
		e->Delete();
		return false;
	}

}
S_ET_testCOM.ET_testCOM_102为注册表中信息

以上两种方法使用com均需要在使用之前注册com


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值