1,COM组件如何开发。
用VS2005的ATL工程,一步一步向导可以快速进行开发。
2,COM如何注册和卸载。
用VS2005编译成DLL后,用regsvr32 /s "xxx.dll"进行注册。
regsvr32 /u "xxx.dll"进行卸载。
3,在ASP中如何使用COM,它定位的标识在哪里?
在用VC2005开发时,工程例如:工程名是AltComApp,类是FirstClass,那么在工程中有一个文件是:FirstClass.rgs, 在这个文件中有:
ProgID = s 'AltComApp.FirstClass.1'
VersionIndependentProgID = s 'AltComApp.FirstClass'
这个标识可以给ASP用,例如ASP在DLL注册后,可以用
Set pFirstClass = Server.CreateObject("AltComApp.FirstClass")
来创建一个COM实例。
4,在VC中如何使用COM组件?
一般DLL使用时,会提供一个头文件,通过头文件来调用DLL中的方法,但COM是这样?它的头文件怎样获得?
1,通地import "xx/xx/xx.dll"的方式,来获取相关结构定义,这个import相当可以理解为include,使用这种方式一般配合“重载了->的"智能指针“使用,例如:CComPtr <IFirstClass> pFirstClass;
#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>
2,通过COM组件工程文件中的:工程名.h与工程名_i.c文件,这时可以不用import "xx.dll"指令。
5,如何调用COM方法直接返回字符串,COM组件的方法在开发时都时返回S_OK都LONG类型,如果要调用返回字符串,如何做到?
当使用import指令时,编译器会生成.tlh和.tli两个文件,两个文件中定义的类会对COM进行重先包装,这时COM方法,例如是:
[id(1), helpstring("方法Add")] HRESULT Add([in] LONG para1, [in] LONG para2, [out,retval] LONG* result);
调用方则变为:
CLSID clsid;
CLSIDFromProgID(OLESTR("AltComApp.FirstClass"),&clsid);
CComPtr <IFirstClass> pFirstClass;
pFirstClass.CoCreateInstance(clsid);
rlt = pFirstClass->Add(2,3);
如果是用#include "工程名.h"与"工程名_i.c"时则调用方法为:
LONG rlt;
hr = CoInitialize(NULL); //ADO控件使用准备
if(FAILED(hr))
{
printf("Coinitialize failed! hr=0x%x", hr);
return 1;
}
IFirstClass *pFirstClass = NULL;
hr = CoCreateInstance(CLSID_FirstClass, NULL, CLSCTX_ALL,
IID_IFirstClass, (void **)&pFirstClass);
pFirstClass->Add(41,25,&rlt);
printf("rlt=%d\r\n",rlt);
pFirstClass->Release();