1.在OPC编程开始需要初始化COM端,所以需要下面的这段程序
- static struct SOLEINIT
- {
- SOLEINIT()
- {
- CoInitialize(NULL);
- }
- ~SOLEINIT()
- {
- CoUninitialize();
- }
- } oleinit__;
但这段程序可运行的前提是必须要包含入OPC的五个头文件,五个头文件可以在OPC基金会网站下载到,注意不能重复定义。
2.Variant的用法需要注意,常常报错。
3.CComPtr被称为智能指针,是ATL提供的一个模版类,能够从语法上自动完成AddRef和Release。(源代码在atlbase.h中)
CComPtr的用法很简单,以IHello*为例,将程序中所有接口指针类型(除了参数),都使用CComPtr 代替即可。即程序中除了参数之外,再也不要使用IHello*,全部以
- CComPtr代替。
CComPtr的用法和普通COM指针几乎一样,另外使用中有以下几点需要注意。
- CComPtr已经保证了AddRef和Release的正确调用,所以不需要,也不能够再调用AddRef和Release。
如果要释放一个智能指针,直接给它赋NULL值即可。(这一点要牢记曾因为没有设置为null而出错)
- CComPtr本身析构的时候会释放COM指针。
- 当对CComPtr使用&运算符(取指针地址)的时候,要确保CComPtr为NUL。(因为通过CComPtr的地址对CComPtr赋值时,不会自动调用AddRef,若不为NULL,则前面的指针不能释放,CComPtr会使用assert报警)
以刚才的程序为例:
- void SomeApp( IHello * pHello )
- {
- CComPtr<IHello> pCopy = pHello;
- OtherApp();
- pCopy->Hello();
- }
由于pCopy是一个局部的对象,所以即使OtherApp()抛出异常,pCopy也会被析构,指针能够被释放。如果不想在程序临近发布前,还因为COM指针的引用计数造成崩溃的话,就牢记这一点吧:程序中除了参数之外,不要直接使用COM指针类型,一定要全部以CComPtr
代替。
由于在调用这个恶心的函数时需要头文件atlbase.h,所以需要将这个头文件include。
4.实例程序中还包含了若干的头文件和子程序,奇怪的是include尖括号竟然不起作用,只能用引号,再把.h文件复制到当前文件夹,不知道怎么回事。晕了,在编写过程中逐渐去理解吧。
5.一个报错的原因分析:
[Linker Error] Unresolved external 'WinMain' referenced from F:\BORLAND
\CBUILDER6\LIB\C0W32.OBJ
错误原因:之所以出现这个Error,主要是因为有一个*.bpr文件与一个*.dfm文件重名造成,也就是项目名与一个窗体名相同导致出现这个问题,只要把它们二者合理的区分开就可以解决此问题。总结一下:出现这个错误主要是因为项目中有重名文件造成。
6.为什么他的程序中没有发现include
也能执行,真奇怪,不过我加了一样也能通过了。
使用断言:
assert()宏是用于保证满足某个特定条件,用法是:
如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。使用这个宏前需要包含头文件assert.h
例如
- #include <stdio.h>
- #include <assert.h>
- void main()
- {
- float a,b;
- scan("%f %f",&a,&b);
- assert(b!=0);
- printf("%f\n",a/b);
- }
7.CoGetMalloc
函数功能:该函数获取对默认的OLE任务内存分配器指针(它支持的接口系统的IMalloc实现),这样应用程序可以调用它的方法来管理内存.
- HRESULT CoGetMalloc(
- DWORD dwMemContext,//作为保留值使用,必须设置为1
- LPMALLOC *ppMalloc);//IMalloc指针的地址,它接收接口指针的内存分配器
返回值:S_OK表示成功,返回E_INVALIDARG and E_OUTOFMEMORY 表示失败.
备注:返回的pMalloc不能够用于远程进程.
结束语:今天就到这里吧,洗洗睡了~~
阅读(5384) | 评论(0) | 转发(1) |