Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530229
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: C/C++

2012-03-07 23:06:47

主要用于了解一个COM 组件的开发过程和调用方式。

参考:
 
  http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html


还有以下几个问题以后有时间、兴趣的话再来解决。
TODO: 1. 如何使用 ATL 开发一个带界面(比如文本输入)。
      (PS:VC的自动生成代码太多了,都有点晕了)
       2. 开发一个 MFC ActiveX 控件。
       3. 分别使用 VC,VB调用上述两个含窗口界面的控件/组件。
FIXME: 下面的示例中,VB调用该COM组件时,只读字符串属性 MyTxt 返回值不正确,VC调用却木问题。


 MyAtlCom.zip  


VC 开发的 COM组件 实现文件:

MyText.cpp
  1. // MyText.cpp : Implementation of CMyText
  2. #include "stdafx.h"
  3. #include "MyAtlCom.h"
  4. #include "MyText.h"

  5. /////////////////////////////////////////////////////////////////////////////
  6. // CMyText

  7. long _MyNum = 0;
  8. char * _MyTxt = "Hi~~";

  9. STDMETHODIMP CMyText::MyAdd(long Num1, long Num2, long *ReturnVal)
  10. {
  11.     // TODO: Add your implementation code here
  12.     *ReturnVal = Num1 + Num2;
  13.     return S_OK;
  14. }

  15. STDMETHODIMP CMyText::get_MyNum(long *pVal)
  16. {
  17.     // TODO: Add your implementation code here
  18.     *pVal = _MyNum;
  19.     return S_OK;
  20. }

  21. STDMETHODIMP CMyText::put_MyNum(long newVal)
  22. {
  23.     // TODO: Add your implementation code here
  24.     _MyNum = newVal;
  25.     return S_OK;
  26. }

  27. STDMETHODIMP CMyText::get_MyTxt(BSTR *pVal)
  28. {
  29.     // TODO: Add your implementation code here
  30.     *pVal = CComBSTR(_MyTxt);
  31.     return S_OK;
  32. }

======================================Client

VC 的命令行 Client

MAIN.CPP
  1. #include <iostream.h>
  2. #include <atlbase.h>
  3. #import "MyAtlCom.dll" no_namespace
  4. //using namespace MYATLCOMLib;

  5.  


  6. void main(void) {

  7.     const IID IID_IMyText = {0x2C197EE8,0xA71C,0x4545,{0xB6,0x13,0xE5,0xE3,0xA5,0xAF,0x36,0x4C}};
  8.     const IID LIBID_MYATLCOMLib = {0x15AC74AB,0x7178,0x4CF5,{0xAD,0x7A,0xED,0x9B,0xD4,0x91,0x93,0xED}};
  9.     const CLSID CLSID_MyText = {0x5BDB5A8F,0xED08,0x4AD7,{0xB5,0x52,0x24,0xF3,0xF3,0xDE,0x81,0x76}};

  10.     HRESULT hr;
  11.     // IMyText* i = NULL;

  12.     hr = CoInitialize(NULL);
  13.     if(SUCCEEDED(hr)){
  14.         CComPtr<IMyText> p ;
  15.         hr = p.CoCreateInstance( CLSID_MyText);
  16.         if(SUCCEEDED(hr)) {
  17.             long ReturnValue;
  18.             hr = p->MyAdd(5, 7, &ReturnValue);
  19.             cout << "The answer for 5 + 7 is: " << ReturnValue << endl;
  20.             
  21.             cout <<"MyNum = "<<p->GetMyNum()<< endl;
  22.             p->PutMyNum(333);
  23.             cout <<"MyNum = "<<p->GetMyNum()<< endl;

  24.             cout <<"MyTxt = "<<p->GetMyTxt()<< endl;

  25.         } else {
  26.             cout << "CoCreateInstance Failed." << endl;
  27.         }
  28.     }
  29.     CoUninitialize();
  30. }

------------- VB Client

Form1.frm
  1. VERSION 5.00
  2. Begin VB.Form Form1
  3.    Caption = "Form1"
  4.    ClientHeight = 3090
  5.    ClientLeft = 60
  6.    ClientTop = 450
  7.    ClientWidth = 4680
  8.    LinkTopic = "Form1"
  9.    ScaleHeight = 3090
  10.    ScaleWidth = 4680
  11.    StartUpPosition = 3 'Windows Default
  12.    Begin VB.CommandButton Command1
  13.       Caption = "Command1"
  14.       Height = 735
  15.       Left = 1440
  16.       TabIndex = 0
  17.       Top = 720
  18.       Width = 1575
  19.    End
  20. End
  21. Attribute VB_Name = "Form1"
  22. Attribute VB_GlobalNameSpace = False
  23. Attribute VB_Creatable = False
  24. Attribute VB_PredeclaredId = True
  25. Attribute VB_Exposed = False
  26. Private Sub Command1_Click()
  27.     Dim m As MYATLCOMLib.MyText
  28.     Set m = New MyText
  29.     Dim l As Long

  30.     m.MyAdd 1, 2, l
  31.     MsgBox "MyAdd(1,2) = " & l

  32.     Dim s As String
  33.     s = m.MyTxt
  34.     MsgBox "MyTxt = " & m.MyTxt 'FIXME wrong, 应该是 "Hi~~", 实际是 "MyTx"
  35.     

  36.     MsgBox " myNum = " & m.MyNum
  37.     m.MyNum = 333
  38.     MsgBox " myNum = " & m.MyNum
  39. End Sub





阅读(1160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~