Chinaunix首页 | 论坛 | 博客
  • 博客访问: 686526
  • 博文数量: 90
  • 博客积分: 1631
  • 博客等级: 上尉
  • 技术积分: 1413
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-15 22:43
文章分类
文章存档

2017年(8)

2016年(9)

2015年(11)

2014年(10)

2013年(9)

2012年(9)

2010年(2)

2009年(10)

2008年(22)

我的朋友

分类: C/C++

2012-12-08 23:39:52

1.在OPC编程开始需要初始化COM端,所以需要下面的这段程序

 

点击(此处)折叠或打开

  1. static struct SOLEINIT
  2. {
  3.    SOLEINIT()
  4.    {
  5.       CoInitialize(NULL);
  6.    }
  7.    ~SOLEINIT()
  8.    {
  9.       CoUninitialize();
  10.    }
  11. } 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报警)
    以刚才的程序为例:

点击(此处)折叠或打开

  1. void SomeApp( IHello * pHello )
  2. {
  3. CComPtr<IHello> pCopy = pHello;
  4. OtherApp();
  5. pCopy->Hello();
  6. }


     由于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()宏是用于保证满足某个特定条件,用法是:

点击(此处)折叠或打开

  1. assert(表达式);
     如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。使用这个宏前需要包含头文件assert.h
   例如

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <assert.h>
  3. void main()
  4. {
  5.    float a,b;
  6.    scan("%f %f",&a,&b);
  7.    assert(b!=0);
  8.    printf("%f\n",a/b);
  9. }
7.CoGetMalloc
    函数功能:该函数获取对默认的OLE任务内存分配器指针(它支持的接口系统的IMalloc实现),这样应用程序可以调用它的方法来管理内存.

点击(此处)折叠或打开

  1. HRESULT CoGetMalloc(
  2.   DWORD dwMemContext,//作为保留值使用,必须设置为1
  3.   LPMALLOC *ppMalloc);//IMalloc指针的地址,它接收接口指针的内存分配器
  返回值:S_OK表示成功,返回E_INVALIDARG and E_OUTOFMEMORY 表示失败.
  备注:返回的pMalloc不能够用于远程进程.

结束语:今天就到这里吧,洗洗睡了~~
阅读(5413) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~