我有一个支持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的类型
//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的类型
解决方案 »
- 多项式求值,怎么把字符串当成表达式求以便求值??
- 帮我分析 几个概念
- 单文档程序中CRichEditCtrl充满视图客户区,这时如何把键盘事件传递给视类。
- DLL问题求教!~~~~~~~~~劳驾解答:)
- ****好想找一些人一起学VC,愿意的进来!(分不多,人多我再发贴!)****
- 程序在运行完所有的语句后,在运行最后一个括号时发生错误,不能正常结束,请问这一般是十么原因?
- 一个非常简单的FTP问题啊!!!100分!!!
- 有使用过ActiveSkin的吗?我的弹出菜单没有变化。谁知道怎莫办?
- 200 分!!那位高手知道如何"custom marshalling a object"??
- 求教,关于绘图?
- VC图片移动问题.....
- 对话框嵌入网页时,如何去掉右边的滚动条?
IEnumerator?我不记得具体写法了建议楼主用#import的方法,系统也许会有更smart的解决方法另外:对于COM客户端,我个人认为由于C不是语言级支持的,使用将很不方便,因此我建议就用VB/C#而不要用C++来做
1、用#import的方法导入,编译的时候就是报错'_CollectionPtr' : missing storage-class or type specifiers。
2、在VB里使用成功,但领导要求用VC写。
还请大虾们帮忙啊,我对COM本来就不熟,
或者你打开那个tlh文件,看看他再哪个namespace下
给你分,再次感谢!!