项目简绍:
一.利用ATL开发一个COM,实现一个可以获得当前操作系统的接.
二.创建一个Win32 console Application 程序,在其中调用创建的
1.创建工程
(1)创建一个ATL COM AppWizard,名为 test01.
(2)插入COM对象,命名为Test Atl
(3)加入接口方法HRESUTL GetOSVersion([out,retval]BSTR * bstrVersion)
(4)修改CTestAtl的函数STDMETHODIMP CTestAtl::GetVersion(BSTR *bstrVersion);
代码如下:
STDMETHODIMP CTestAtl::GetOsVersion(BSTR *bstrVersion)
{
char szOSVersion[20];
OSVERSIONINFO VersionInfomation;
VersionInfomation.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
if(GetVersionEx(&VersionInfomation))
{
switch(VersionInfomation.dwPlatformId)
{
case VER_PLATFORM_WIN32s:
strcpy(szOSVersion,"WIN32s");
break;
case VER_PLATFORM_WIN32_WINDOWS:
strcpy(szOSVersion,"WIN95/98");
break;
case VER_PLATFORM_WIN32_NT:
strcpy(szOSVersion,"WINNT");
break;
default:
strcpy(szOSVersion,"UnKnown");
break;
}
}
else
{
strcpy(szOSVersion,"ERROR");
}
* bstrVersion=_com_util::ConvertStringToBSTR(szOSVersion);
return S_OK;
}
编译程序,至此我们建立一个进程内组件,生成test01.dll.单击集成开发环境"TOOL---RegisterCotrol"菜单,注册该组件
创建客户端程序,测试该组件
#include <windows.h>
#include <stdio.h>
#include <comutil.h>
#pragma comment (lib,"comsupp.lib")
#include "../test01/test01.h"
#include "../test01/test01_i.c"
void main()
{
ITestAtl * pITestAtl=NULL;
BSTR bstrOS;
//初始化
HRESULT hr= ::CoInitialize(NULL);
if(FAILED(hr))
{
printf("组件初始化失败!hr=0x%x",hr);
return;
}
//创建COM
hr=::CoCreateInstance(CLSID_TestAtl,NULL,CLSCTX_ALL,IID_ITestAtl,(void **)&pITestAtl);
if(FAILED(hr))
{
printf("组件创建失败!hr=0x%x",hr);
::CoUninitialize();
return;
}
hr=pITestAtl->GetOsVersion(&bstrOS);
if(FAILED(hr))
{
printf("pITestAtl->GetOSVersion()方法调用失败!hr=0x%x",hr);
pITestAtl->Release();
::CoUninitialize();
return;
}
char * pszOS;
pszOS=_com_util::ConvertBSTRToString(bstrOS);
printf("this os is %s/n",pszOS);
//释放内存资源
SysFreeString(bstrOS);
delete pszOS;
pITestAtl->Release();
::CoUninitialize();
return;
}