深入解析atl 笔记1 添加一个simple object时做了什么.
在图书馆拿到这本不错的书,英文名为“ATL Internals”,第二版,用的是VC2005和ATL8。作者都是很牛的,决定好好看一下,补充一下ATL, COM的知识。一边看一遍记笔记,。。恩。。
首先新建一个ATL dll 工程,添加一个ATL Simple Object, 设置用default,然后用winmerge看看多了什么东西 .
添加的文件:
SimpleObj2.cpp
SimpleObj2.h
SimpleObj2.rgs
修改的文件:
atlDemo.idl
atlDemo.rc
atlDemo.vcproj
resource.h
先看看修改的文件,主要是idl
1
[
2
object,
3
uuid(66B9309A-2907-44CD-8DE9-0B5D774147DD),
4
dual,
5
nonextensible,
6
helpstring("ISimpleObj2 Interface"),
7
pointer_default(unique)
8
]
9
interface ISimpleObj2 : IDispatch{
10
};

2

3

4

5

6

7

8

9

10

以及在library atlDemoLib下面添加的
1
[
2
uuid(24A41D8D-5367-4C6B-A7D3-3930361A7387),
3
helpstring("_ISimpleObj2Events Interface")
4
]
5
dispinterface _ISimpleObj2Events
6
{
7
properties:
8
methods:
9
};
10
[
11
uuid(220C4A97-B240-4443-BEE9-73D15D66B92D),
12
helpstring("SimpleObj2 Class")
13
]
14
coclass SimpleObj2
15
{
16
[default] interface ISimpleObj2;
17
[default, source] dispinterface _ISimpleObj2Events;

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18 };
多了的文件内容
_ISimpleObj2Events_CP.h:
1
#pragma once
2
3
template <class T>
4
class CProxy_ISimpleObj2Events : public IConnectionPointImpl<T, &__uuidof( _ISimpleObj2Events ), CComDynamicUnkArray>
5
{
6
//Warning this class will be regenerated by the wizard.
7
public:
8
};
9

2

3

4

5

6

7

8

9

SimpleObj2.cpp:
1
// SimpleObj2.cpp : Implementation of CSimpleObj2
2
3
#include "stdafx.h"
4
#include "SimpleObj2.h"
5
6
7
// CSimpleObj2
8
9

2

3

4

5

6

7

8

9

SimpleObj2.h
1
// SimpleObj2.h : Declaration of the CSimpleObj2
2
3
#pragma once
4
#include "resource.h" // main symbols
5
6
#include "atlDemo_i.h"
7
#include "_ISimpleObj2Events_CP.h"
8
9
10
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
11
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
12
#endif
13
14
15
16
// CSimpleObj2
17
18
class ATL_NO_VTABLE CSimpleObj2 :
19
public CComObjectRootEx<CComSingleThreadModel>,
20
public CComCoClass<CSimpleObj2, &CLSID_SimpleObj2>,
21
public IConnectionPointContainerImpl<CSimpleObj2>,
22
public CProxy_ISimpleObj2Events<CSimpleObj2>,
23
public IDispatchImpl<ISimpleObj2, &IID_ISimpleObj2, &LIBID_atlDemoLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
24
{
25
public:
26
CSimpleObj2()
27
{
28
}
29
30
DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLEOBJ2)
31
32
33
BEGIN_COM_MAP(CSimpleObj2)
34
COM_INTERFACE_ENTRY(ISimpleObj2)
35
COM_INTERFACE_ENTRY(IDispatch)
36
COM_INTERFACE_ENTRY(IConnectionPointContainer)
37
END_COM_MAP()
38
39
BEGIN_CONNECTION_POINT_MAP(CSimpleObj2)
40
CONNECTION_POINT_ENTRY(__uuidof(_ISimpleObj2Events))
41
END_CONNECTION_POINT_MAP()
42
43
44
DECLARE_PROTECT_FINAL_CONSTRUCT()
45
46
HRESULT FinalConstruct()
47
{
48
return S_OK;
49
}
50
51
void FinalRelease()
52
{
53
}
54
55
public:
56
57
};
58
59
OBJECT_ENTRY_AUTO(__uuidof(SimpleObj2), CSimpleObj2)
60

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

SimpleObj2.rgs
1
HKCR
2
{
3
atlDemo.SimpleObj2.1 = s 'SimpleObj2 Class'
4
{
5
CLSID = s '{220C4A97-B240-4443-BEE9-73D15D66B92D}'
6
}
7
atlDemo.SimpleObj2 = s 'SimpleObj2 Class'
8
{
9
CLSID = s '{220C4A97-B240-4443-BEE9-73D15D66B92D}'
10
CurVer = s 'atlDemo.SimpleObj2.1'
11
}
12
NoRemove CLSID
13
{
14
ForceRemove {220C4A97-B240-4443-BEE9-73D15D66B92D} = s 'SimpleObj2 Class'
15
{
16
ProgID = s 'atlDemo.SimpleObj2.1'
17
VersionIndependentProgID = s 'atlDemo.SimpleObj2'
18
ForceRemove 'Programmable'
19
InprocServer32 = s '%MODULE%'
20
{
21
val ThreadingModel = s 'Apartment'
22
}
23
'TypeLib' = s '{CFE54601-E42B-4851-8A14-D259630A8648}'
24
}
25
}
26
}
27

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

添加一个叫TestXXX地方法之后,多了这些东东
1
2
interface IMySimpleObj : IDispatch{
3
[id(1), helpstring("method Test")] HRESULT TestXXX(void);
4
};
5
6
7
STDMETHODIMP CMySimpleObj::TestXXX(BSTR str)
8
{
9
// TODO: Add your implementation code here
10
11
return S_OK;
12
}
13
14
15
class ATL_NO_VTABLE CMySimpleObj :
16
public CComObjectRootEx<CComSingleThreadModel>,
17
public CComCoClass<CMySimpleObj, &CLSID_MySimpleObj>,
18
public IDispatchImpl<IMySimpleObj, &IID_IMySimpleObj, &LIBID_atlDemoLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
19
{
20
STDMETHOD(TestXXX)(BSTR str);

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

添加一个叫MyProperty的属性后,多了这些
1
2
interface IMySimpleObj : IDispatch{
3
[propget, id(4), helpstring("property MyProperty")] HRESULT MyProperty([out, retval] BSTR* pVal);
4
[propput, id(4), helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR newVal);
5
};
6
7
8
STDMETHODIMP CMySimpleObj::get_MyProperty(BSTR* pVal)
9
{
10
// TODO: Add your implementation code here
11
12
return S_OK;
13
}
14
15
STDMETHODIMP CMySimpleObj::put_MyProperty(BSTR newVal)
16
{
17
// TODO: Add your implementation code here
18
19
return S_OK;
20
}
21
22
23
class ATL_NO_VTABLE CMySimpleObj {
24
STDMETHOD(get_MyProperty)(BSTR* pVal);
25
STDMETHOD(put_MyProperty)(BSTR newVal);

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

- 上一篇 几种特殊的模板偏特化.
- 下一篇 使用opencv + python.