在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