第四讲:简单对象SimpleObject的创建与调用

来自:http://www.vckbase.com/index.php/video/listview/fid/2/sid/15

本节内容:

1、用ATL制作简单对象(Simple Object)

2、在网页中测试简单对象

3、在MFC中测试简单对象

4、在C#中测试简单对象

1、用ATL制作简单对象(Simple Object)

项目创建向导

打开 VS2005 。新建项目,项目类型选择 ATL ,模板选择 ATL 项目 ,输入项目名称,比如 "Section4Demo1" ,点确定。
点下一步。
点完成。
添加简单对象 (Simple Object) 向导
目前项目已创建完毕,我们需要往这个项目添加简单对象 (Simple Object)
在我们的 ATL 项目右键,选择 添加类
类别选择 ATL ,模板选择 ATL 简单对象 ( 英文名 SimpleObject) ,点添加。
在简称处写入简单对象的简称,比如 " HelloSimpleObject "
接口选 双重 ( 英文名 Dual) ,只有选了 双重 ,组件才支持 IDispatch 接口,这样子,组件才能正常被解释性语言 ( vbscript javascript ) 跟宏语言调用。点完成。
为简单对象添加加法方法
目前简单对象 (Simple Object) 已添加完毕。接下来,我们来为简单对象添加方法。
我们要添加一个整数加法的方法。点击 类视图 ,右击 IHelloSimpleObject ,选择 添加方法
填写方法名,先择参数类型,参数属性选 "in"( 代表输入性参数 ) ,填写参数名,点添加。
输入第二个参数的信息,点添加
设置方法的求和数值返回参数。参数类型选择 LONG* ,参数属性打勾 "out" " retval "( 代表该参数是函数的返回值 ) ,点添加。
比较下图,看看信息是否正确,可通过移除按钮进行重新修改。
我们现在看到的这个 ID ,就是我们上一节讲过的调度 ID ,这个 ID 跟刚才添加的方法是对应的。点完成。
查看目前向导添加的代码
回到 " 解决方案资源管理器 "
查看 Section4Demo1.idl 的代码。会发现我们的组件 ( 简单对象 ) 支持我们的自定义接口 IHelloSimpleObject ,接口的定义上面,会看到我们接口的 IID ,在 idl 文件是 uuid
IHelloSimpleObject 该接口里有一个 SumLong 的方法。
查看 HelloSimpleObject.h 文件与 HelloSimpleObject.cpp 文件,我们会看到,我们接口的方法已被声明与定义,不过方法内容是空的,需要我们自己实现。
我们往 CHelloSimpleObject :: SumLong 方法添加* plSum = lA + lB ;   这样子,我们就完成了加法方法的功能了。
为简单对象添加属性
点击 类视图 ,在 IHelloSimpleObject 右键,选择 添加属性
我们要添加两个字符串属性进去,现在先添加第一个字符串属性。属性类型选择 BSTR, 属性名叫 Description ,点下一步。
点完成。
查看目前向导添加的代码
同样查看 idl 文件,我们会发现 idl 已添加了 propput propget 的属性存取方法。
对于存属性的方法,函数参数是 [in] BSTR newVal
对于取属性的方法,函数参数是 [out, retval ]BSTR* pVal
查看 HelloSimpleObject.h HelloSimpleObject.cpp 代码,我们发现我们的代码被添加了 get_Description put_Description 方法。
实现属性
我们为 CHelloSimpleObject 类添加成员变量 BSTR m_bstrDescription ; 用于存取 Description 的属性。
CHelloSimpleObject 类添加析构函数。
构造函数中添加 Description 属性的初始化设置。 m_bstrDescription = SysAllocString (L" 我是 HelloSimpleObject 组件,我是简单对象! ");
在析构函数中,添加 BSTR 字符串的销毁代码,由于该 Description 属性是 BSTR 类型,所以需要 SysFreeString 函数来销毁字符串,其它属性如果是 LONG FLOAT 类型,在析构函数中就不需要处理。

SysFreeString(m_bstrDescription);

get_Description的实现:

  //释放旧的字符串

  SysFreeString(*pVal);

  //申请新的字符串

  *pVal = SysAllocStringLen(m_bstrDescription,SysStringLen(m_bstrDescription));

  return S_OK;

put_Description的实现:

  //释放旧的字符串

  SysFreeString(m_bstrDescription);

  //申请新的字符串

  m_bstrDescription = SysAllocStringLen(newVal,SysStringLen(newVal));

  return S_OK;

简单对象的事件
简单对象的事件,就是让简单对象的调用者能够接收的从简单对象内部触发出来的事件。我们会在第七讲中讲解简单对象的事件。
编译生成
我们把项目编译生成后,会发现,我们的项目除了生成组件的dll文件之外,还生成了两个代码文件(Section4Demo1.h与Section4Demo1_i.c)。
这两个文件里面描述的是组件的相关信息。如接口的方法,接口的IID,组件的CLSID等。
组件的CLSID
组件的CLSID同IID一样,都是GUID。
组件的CLSID用于标识组件,每一个组件都有一个与之对应的CLSID。
组件的CLSID可以在idl文件中找到,比如我们组件的简称是HelloSimpleObject,那么,我们查看idl文件的末尾,查找coclassHelloSimpleObject,它前面的[]里面的uuid就是组件的clsid。
2、 在网页中测试简单对象
我们往项目添加新项
 
类别选择"web",模板选择"HTML页(.htm)",输入名称,点添加。
往test.htm的<BODY></BODY>中添加<OBJECTID="HelloSimpleObjectTest"CLASSID="CLSID:F65204D1-4E2E-494C-AB52-02D4D1D5438F"></OBJECT>

  其中的CLSID要从你们的idl文件中复制过来,不能用我这边写的CLSID。

<TITLE></TITLE>的中间写入 在网页中测试简单对象
<TITLE>...</TITLE>的下面写入:

<script>

functionOnTestAddMethord()

{

    //

}

functionOnReadDescriptionProp()

{

  //

}

functionOnWriteDescriptionProp()

{

    //

}

</script>

网页中的<OBJECT...></OBJECT>下面写入:

<buttontype="button"οnclick="OnTestAddMethord()">测试简单对象的加法方法</button>

<buttontype="button"οnclick="OnReadDescriptionProp()">读取简单对象的描述属性</button>

<buttonbyte="button"οnclick="OnWriteDescriptionProp()">写入简单对象的描述属性</button>

function OnTestAddMethord()

{

    varspo =document.getElementById("HelloSimpleObjectTest");

    varslr =spo.SumLong(9,99);

    alert(slr);

}

function OnReadDescriptionProp()

{

    varspo =document.getElementById("HelloSimpleObjectTest");

  vardesp =spo.Description;

  alert(desp);

}

function OnWriteDescriptionProp()

{

   varspo =document.getElementById("HelloSimpleObjectTest");

   spo.Description = "我已通过网页修改了简单对象的描述属性!这是新描述!";

   alert("修改属性完成!点击中间的按钮测试!");

}

在浏览器中查看:
 
 
 
 
 
 
 
 
3、在MFC中测试简单对象
为解决方案添加MFC项目。
 
往stdafx.h文件添加如下代码:
 
往stdafx.cpp中添加如下代码:
往CMFCTestSection4Demo1Dlg::OnInitDialog()中添加简单对象的测试代码。具体查看项目MFCTestSection4Demo1。

 //简单对象的测试
 HRESULT hr = E_FAIL;
 hr = CoInitialize(NULL);  //使用com组件对象之前要添加这一句,这句一般可以放在CMFCTestSection4Demo1App::InitInstance()里

 if (SUCCEEDED(hr))
 {
  IHelloSimpleObject *pIHelloSimpleObject = NULL;
  hr = CoCreateInstance(CLSID_HelloSimpleObject, NULL, CLSCTX_INPROC_SERVER, IID_IHelloSimpleObject, (void**)&pIHelloSimpleObject);
  if (SUCCEEDED(hr))
  {
   //加法方法测试
   LONG lSum = 0;
   hr = pIHelloSimpleObject->SumLong(9, 99, &lSum);

   //读描述属性
   BSTR bstrDescriptionA = SysAllocString(L"");
   hr = pIHelloSimpleObject->get_Description(&bstrDescriptionA);
   SysFreeString(bstrDescriptionA);
   bstrDescriptionA = NULL;

   //写描述属性
   BSTR bstrDescriptionB = SysAllocString(L"我运行在MFC里,我是新的描述属性!");
   hr = pIHelloSimpleObject->put_Description(bstrDescriptionB);
   SysFreeString(bstrDescriptionB);
   bstrDescriptionB = NULL;

   //读描述属性
   BSTR bstrDescriptionC = SysAllocString(L"");
   hr = pIHelloSimpleObject->get_Description(&bstrDescriptionC);
   SysFreeString(bstrDescriptionC);
   bstrDescriptionC = NULL;
  }

  pIHelloSimpleObject->Release();  //不使用这个接口,引用计数减一
 }

 CoUninitialize();  //不使用com组件对象时添加这一句,这句一般可以放在CMFCTestSection4Demo1App::ExitInstance()里。

//注:输出BSTR指可以用            MessageBoxW(NULL, bstrDescriptionA, NULL, 0);

 
 
 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值