COM在OLE32.DLL和 OLE32.LIB定义了一些常用的函数。在使用这些函数前要先调用CoInitialize来初始化COM库。当进程不再需要使用COM库函数时要调用CoUninitialize.

原型:

WINOLEAPI CoInitialize(__in_opt LPVOID pvReserved); // pvReserved为NULL
WINOLEAPI_(void) CoUninitialize(void);

 

由于对每一个进程,COM库只需初始化一次,并且由于COM是用于创建组件的,因此进程中组件无需初始化COM库。COM库的初始化一般只是在EXE中进行,而DLL中则无需进行。

关于OleInitialize的使用

OLE是建立在COM基础之上的,它增加了对类型库、剪贴板、拖放、AcitiveX文档、自动化以及AcitveX控件的支持。在使用这些特性时,应调用OleInitialize及OleInitialize,但如果不使用那些额外的功能,使用Ole***会造成资源的浪费。

 


 

#include "stdafx.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    //声明HRESULT和Ikuan接口指针
    Ikuan * IkuanATL = NULL;

    HRESULT hr = CoInitialize(NULL);    //初始化COM

    //使用SUCCEEDED宏并检查我们是否能得到一个接口指针
    if(SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_kuan,
            NULL,
            CLSCTX_INPROC_SERVER,
            IID_Ikuan,
            (void **)&IkuanATL);
        //如果成功,则调用AddNumbers方法,否则显示相应的出错信息
        if(SUCCEEDED(hr))
        {
            long ReturnValue;
            IkuanATL->Add(8,9,&ReturnValue);
            cout << "The answer for 8+9 is:" << ReturnValue << endl;
            IkuanATL->Release();
        }
        else
        {
            cout << "CoCreateInstance Failed." << endl;
        }
    }
    CoUninitialize();//释放COM
    return 0;
}