COM组件开发遇到的问题总结

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();


你可能感兴趣的:(COM组件开发遇到的问题总结)