如何调用com中的事件?
解决方案 »
- VC处理excle格式,word格式,pdf文件格式怎么样》
- 关于实现窗口最小化、还原的问题
- 串口通信问题
- 本人从事嵌入式开发,希望结交一些同行的朋友
- strmbasd.lib的问题
- 新手初学,多多照顾.为什么向浏览器发送双击消息无效?那位大虾指点指点,有代码..谢谢
- 如何用DIRECT DRAW实现:显示一帧YUV420的图像?
- 美丽少女,欲购从速,急需交友,QQ:2144897
- vs2010一打开就奔溃????怎么办
- 数据类型转换问题
- 请问如何获取对话框中的某部分区域的背景啊?谢谢
- 我的对话框上放一个CListCtrl空间,当我按win+d组合健后,该CListCtrl控件变灰色,要重新拉一下才恢复,可以看到!
class ATL_NO_VTABLE CEventSink : IDispEventSimpleImpl<1, CEventSink,&__uuidof(Ti30ComLib::EventInterface)>
{
SINK_ENTRY_INFO(1, __uuidof(EventInterface),1, OnError, &OnErrorInfo)
void __stdcall OnError(VARIANT sender, ErrorEventArgs* e);
}
怎么处理OnError事件中的ErrorEventArgs参数?这个参数中有两个属性,ErrorCode和ErrorMessage.
这里ErrorEventArgs已经转换为IDispatch了,不能直接用ErrorEventArgs.
VC的调用方法是:
#include <Atlbase.h>
#import "c:\\winnt\\mycom.dll" no_namespace
void CTTTDlg::OnButton1()
{
// TODO: Add your control notification handler code here
::CoInitialize(NULL);
CLSID clsid;
HRESULT hresult;
IMyCom* pMyCom;
hresult = CLSIDFromProgID( OLESTR( "MyCom.MyCom" ), &clsid); //retrieve CLSID of component
if ( FAILED(hresult) )
{
MessageBox("hr Failed!!!"); //失败
}
else
{
hresult = CoCreateInstance( clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(ICustomer), (LPVOID *)&pCustomer );
if ( FAILED(hresult) )
{
MessageBox("Create Failed!!!");//失败
::CoUninitialize();
return;
}
else
MessageBox("Load Success!" ); //成功
} BSTR Info_In;
BSTR ErrInfo;
BSTR Serial;
BSTR CustNo;
LONG ErrNo; ErrNo = pMyCom->MyComFunction( Info_In, &ErrInfo, &Serial, &CustNo );
CString strErrInfo;
CString strSerial;
CString strCustNo;
strErrInfo.Format( "%s%s", _com_util::ConvertBSTRToString( ErrInfo ) , _com_util::ConvertBSTRToString( CustNo ) );
strSerial.Format( "%s__%ld",_com_util::ConvertBSTRToString( Serial ), ErrNo ); MessageBox( strErrInfo, strSerial );
::CoUninitialize();
}
在工程的Refrence里边增加Mycom.dll库
在代码里面
Dim obj As MYComLib.MYCom
Set obj = CreateObject("mycom.mycom")
Dim szRet As String
Dim szSrc As String
szSrc = Text1.Text
szRet = obj.MyFunc1(szSrc)
Text2.Text = szRet
MsgBox szRet, vbOKOnly
IMyComInterfacePtr com(__uuidof(MyCom));
MyCom 类继承自 IMyComInterface
com.MyMethod();楼上的兄弟,我问的是怎么处理事件及事件中的参数,而不是属性和方法的调用。
用ActiveX写的东西放到一个窗口之后,添加一个variable,会生成这个接口的类,可以在类里面实现COM接口定义的事件就可以
而一个COM接口用import方法后,不知道怎么去实现这个事件
http://www.vckbase.com/document/viewdoc/?id=212
http://www.vckbase.com/document/viewdoc/?id=213
现在的问题是事件中的参数怎么处理?
例如:OnMyEvent(object sender, MyCustomEventArgs e)
{}
vc:__Stdcall OnMyEvent(VARIANT sender, IDispatch* e)
以前就可以直接用e.xx访问MyCustomEventArgs的属性。
现在的IDispatch怎么访问?
看你的代码似乎是COM接口中的
COM接口可以用ConnectionPoint去做事件
先在idl中定义事件,再在接口类中Add Connection Point
自动在事件代理类中把事件的东西全都生成了
在其他地方直接调用事件函数就可以。
这是事件的接口idl:
[
uuid(7C59B515-E90A-3EB9-8CF3-F0C48DBCA390),
version(1.0),
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "Ti30ComLib.EventInterface")]
dispinterface EventInterface {
properties:
methods:
[id(0x00000001)]
void Error(
[in] VARIANT sender,
[in] _SessionErrorEventArgs* e);
[id(0x00000002)]
void Connect(
[in] VARIANT sender,
[in] _ConnectEventArgs* e);
[id(0x00000003)]
void StartAutoDownload(
[in] VARIANT sender,
[in] _EventArgs* e);
[id(0x00000004)]
void DownLoad(
[in] VARIANT sender,
[in] _TransferEventArgs* e);
[id(0x00000005)]
void UpLoad(
[in] VARIANT sender,
[in] _TransferEventArgs* e);
[id(0x00000006)]
void DownloadProgress(
[in] VARIANT sender,
[in] _ProgressEventArgs* e);
[id(0x00000007)]
void UploadProgress(
[in] VARIANT sender,
[in] _ProgressEventArgs* e);
};
这是包含事件的类的idl:
[
uuid(A3C6916D-358E-3AC9-949A-BF23A38AD45A),
version(1.0),
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "Ti30ComLib.Communication")
]
coclass Communication {
interface _Object;
[default] interface ITi30ComLib;
[default, source] dispinterface EventInterface;
};
现在就要在vc写个调用com事件的程序。困难的是怎么处理事件中的参数_SessionErrorEventArgs.....等。
这是参数的idl:
[
uuid(56600F03-6082-3DFD-921C-9441F849AB14),
hidden,
dual,
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "IRCommunication.SessionErrorEventArgs")]
dispinterface _SessionErrorEventArgs {
properties:
methods:
};