我有一个支持IDispatch接口的COM组件ihSDK.dll,在VC中用ClassWizard->Add   Class...->From   a   type   library导入,生成ihSDK.h和ihSDK.cpp,里面有很多接口,如有:_ServerManager,_Server等.代码如下:
//ihSDK.h
class _ServerManager : public COleDispatchDriver
{
public:
_ServerManager() {} // Calls COleDispatchDriver default constructor
_ServerManager(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
_ServerManager(const _ServerManager& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}// Attributes
public:// Operations
public:
LPDISPATCH GetDefaultServer();
void SetRefDefaultServer(LPDISPATCH* newValue);
LPDISPATCH GetServers();
BOOL AddServer(BSTR* ServerName, BSTR* UserName, BSTR* Password);
BOOL RemoveServer(BSTR* ServerName);
void ManageServerDialog(BSTR* SelectedServer);
CString GetLastError();
};
/////////////////////////////////////////////////////////////////////////////
// _Server wrapper classclass _Server : public COleDispatchDriver
{
public:
_Server() {} // Calls COleDispatchDriver default constructor
_Server(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
_Server(const _Server& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}// Attributes
public:// Operations
public:
long GetHandle();
VARIANT GetSecurityGroupList();
long GetLicensedTags();
long GetActualTags();
        .....
};
/////////////////////////////////////////////////////////////////////////////
.......//ihSDK.cpp
/////////////////////////////////////////////////////////////////////////////
// _ServerManager properties/////////////////////////////////////////////////////////////////////////////
// _ServerManager operationsLPDISPATCH _ServerManager::GetDefaultServer()
{
LPDISPATCH result;
InvokeHelper(0x68030003, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}void _ServerManager::SetRefDefaultServer(LPDISPATCH* newValue)
{
static BYTE parms[] =
VTS_PDISPATCH;
InvokeHelper(0x68030003, DISPATCH_PROPERTYPUTREF, VT_EMPTY, NULL, parms,
 newValue);
}LPDISPATCH _ServerManager::GetServers()
{
LPDISPATCH result;
InvokeHelper(0x68030002, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}BOOL _ServerManager::AddServer(BSTR* ServerName, BSTR* UserName, BSTR* Password)
{
BOOL result;
static BYTE parms[] =
VTS_PBSTR VTS_PBSTR VTS_PBSTR;
InvokeHelper(0x60030004, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,
ServerName, UserName, Password);
return result;
}BOOL _ServerManager::RemoveServer(BSTR* ServerName)
{
BOOL result;
static BYTE parms[] =
VTS_PBSTR;
InvokeHelper(0x60030005, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,
ServerName);
return result;
}void _ServerManager::ManageServerDialog(BSTR* SelectedServer)
{
static BYTE parms[] =
VTS_PBSTR;
InvokeHelper(0x60030006, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
 SelectedServer);
}CString _ServerManager::GetLastError()
{
CString result;
InvokeHelper(0x68030001, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
/////////////////////////////////////////////////////////////////////////////
// _Server properties/////////////////////////////////////////////////////////////////////////////
// _Server operationslong _Server::GetHandle()
{
long result;
InvokeHelper(0x68030067, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}VARIANT _Server::GetSecurityGroupList()
{
VARIANT result;
InvokeHelper(0x68030066, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}
///////////////////////////////////////////
.......我在程序中使用如下:
BOOL CIHistorianVCDlg::OnInitDialog()
{
        .....
  _ServerManager m_ServerManager;//服务器管理器接口

// COM 初始化在 InitInstance()中调用了 AfxOleInit()
CString strServername;
CString strLastError;
BSTR bstr; //参数iHistorian_SDK.ServerManager,是组件K在注册表中的ProgID
if( !m_ServerManager.CreateDispatch( _T("iHistorian_SDK.ServerManager") ) )// 启动组件
{
AfxMessageBox( _T("启动失败。组件注册了吗?COM 初始化了吗?") );
return TRUE;
} //Displays a dialog to manage server connections
_Server m_Server = m_ServerManager.GetDefaultServer();//返回服务管理器中的默认服务器接口《======成功
       
       XXXXType    m_ServerCollection    = m_ServerManager.GetServers();//返回服务管理器中的服务器的集合   〈=======XXXXType 
         return TRUE;  // return TRUE  unless you set the focus to a control
}
现在问题如下:
XXXXType    m_ServerCollection    = m_ServerManager.GetServers();//返回服务管理器中的服务器的集合   〈=======XXXXType 该如何表示!!!
我在VB中查看_ServerManager::GetServers()函数返回的是_Server的Collection集合。Collection是VBA的类型

解决方案 »

  1.   

    这种应该是一个梅举器类型吧
    IEnumerator?我不记得具体写法了建议楼主用#import的方法,系统也许会有更smart的解决方法另外:对于COM客户端,我个人认为由于C不是语言级支持的,使用将很不方便,因此我建议就用VB/C#而不要用C++来做
      

  2.   

    谢谢arong1234的回复
    1、用#import的方法导入,编译的时候就是报错'_CollectionPtr' : missing storage-class or type specifiers。
    2、在VB里使用成功,但领导要求用VC写。
    还请大虾们帮忙啊,我对COM本来就不熟,
      

  3.   

    #import时加no namespace选项
    或者你打开那个tlh文件,看看他再哪个namespace下
      

  4.   

    有时#import一个不够,tlh文件开头会告诉你需要#import哪些tlb
      

  5.   

    太感谢arong1234了,就是你说的“有时#import一个不够,tlh文件开头会告诉你需要#import哪些tlb”
    给你分,再次感谢!!