以前在windows服务器上使用过Asp+Com的方式。记录Com组件开发的一些回忆,可能不准确。使用工具:vc6。
Com开发关键是参数的传入和传出。我只使用了字符串和整数。字符串使用BSTR,整数long。
首先新建一个atl com appwizard工程。
1、插入一个“atl class”。
2、函数的添加,classview模式,右键点击接口名,选择"add method"。举例:
返回值:HRESULT
函数名:自己定义
参数示例:[in] BSTR parm1,[in] long parm2,[out] BSTR*parm3,[out]long *parm4,[out, retval] long* ret 或 [out, retval] BSTR* retstring
[in]为传入参数
[out]为传出参数
[out,retval]为返回值,只能一个
确定后,vc6自动生成class中的函数声明:
STDMETHOD(函数名)(BSTR parm1,long parm2,BSTR *parm3, long *parm4,long *ret 或 BSTR *retstring);
在idl文件中自动生成:
interface 接口名 : IDispatch
{
[id(顺序号), helpstring("帮助字符串")] 添加的method声明;
.....
};
还可以“add property”,添加属性,将自动添加get_函数。只要在函数中返回对应的值。以后在asp中就可以用"对象.属性"的方式来获取值。
3、BSTR转化为字符串,使用CString最方便:
CString str=BSTR串;
如果工程是unicode模式,则可以直接把BSTR作为字符串(OLECHAR *)使用,使用SysStringByteLen(BSTR串)来获取长度。
unicode模式下,字符串使用OLECHAR来定义。字符串转化为整数是_wtoi()。字符串常量加L:L"字符串"。
4、返回值,字符串转化为BSTR
多字节模式:
BSTR A2WBSTR(char *);
unicode模式:
BSTR SysAllocString(OLECHAR *);
......
6、class实现后,编译并注册com组件(用regsvr32命令)。
7、asp调用com
dim obj
set obj=Server.CreateObject("文件名.class名")
调用函数:
obj.func(参数)
最后
set obj=nothing
8、c语言调用com组件
#import "com文件名.dll" no_namespace
#include "atlbase.h"
CLSID comid;
CLSIDFromProgID(OLESTR("文件名.class名"),&comid);
CComPtr pfunc;
pfunc.CoCreateInstance(comid);
_variant_t a=pfunc->函数(参数);
if(a.vt != VT_NULL){
ret=_ttoi((LPCTSTR)(_bstr_t)a); //ret转换为整数
}