[资料整理]VC下创建ASP中能访问的COM组建

一、建立工程   
    打开VC++6.0,选择New   Projects中的ALT   COM   AppWizard,   并输入好工程名(如MyStudio),记住该工程名将成为ASP组件名的一部分(其实可以修改,但很麻烦),在下一页上选择Server   Type   为DLL,并可考虑在Support   MFC前打勾(想必使用MFC编程的人不少)。按Finish结束。   
  
    二、创建COM对象(新建ATL活动模版库类)   
  在菜单上选择Insert   New   Class,并新建一个ATL   Class,如取名为CmyComponent,你会发现在接口表中出现了一个ImyComponent,以后创建该接口的方法和属性就可以在ASP中使用了。把Aggregatable选项去掉,保持其他不变。   
  
  三、添加接口方法   
    在ClassView中,右击ImyComponent,在出现的菜单中按Add   Method。在Method   Name中可写上方法名如InitMyComp。在Parameters中写上方法的参数如[in]int   Number1,[out,retbal]int*   Number2。这里要特别说明的是参数的写法。   
  
  1.对于传入的参数必须在参数前加上[in],然后可跟上如int   n或float   f等。且每个传入参数前都必须写明。   
  2.对于调用方法的返回,不再是该方法名前的类型(因为所有这些方法都返回HRESULT,即表明是否调用成功),所以使用传出的参数,在参数前必须加上 [out,retval],然后可跟上如int*   n   或者float*   f等(如果返回的是int   或float   类型值时)。且每个方法仅限于返回一个这样的参数。在函数体中可如写上如“*Number2=Number1;”,表示把输入参数作为传出参数。   
  
  3.对于最常用的字符串参数应使用BSTR   str而不是通常的char*   或CString,所以在参数中需要写作[in]BSTR   str   或[out,retval]BSTR*   str。需要特别注意与CString的转换。如新建一个函数StrConv([in]BSTR   bstr1,[out,retval]BSTR*   bstr2),在函数体中可写上如:   
  CString   str;   
  str=bstr1;   
  str=str.Left(str.GetLength()-1);   
  *bstr2=str.AllocSysString();   
    4.对于想把一个ASP对象作为参数的方法(如Request对象),可以使用[in]Iunkown   *pIUnk,在函数体内,可用如下语句:(具体请查阅MSDN中的相关类的内容)    
 

IRequest* pIRequest;
HRESULT hr = pIUnk->QueryInterface(IID_IRequest,   reinterpret_cast<LPVOID*>(&pIRequest));
Long m_lDataSize;
HRESULT hr = pIRequest->get_TotalBytes(&m_lDataSize);
if (FAILED(hr)) return hr;
if (m_lDataSize   ==   0L)
{
    return S_OK;
}
COleVariant   varBytesToRead;
COleSafeArray   sarrayBytes;
varBytesToRead   =   m_lDataSize;
sarrayBytes.CreateOneDim(VT_UI1,m_lDataSize);
hr = pIRequest->BinaryRead(&varBytesToRead, &sarrayBytes);
if (FAILED(hr))
{
    sarrayBytes.Clear();
    return   hr;
}
// …     

 

  5.对于不定个数参数,可使用SAFEARRAY,但使用方法较为复杂。可以在参数中输入如下的内容[in]SAFEARRAY   array,并按Attribute…按钮,在Name中选择vararg。按确定后修改idl文件在把[in]SAFEARRAY   array改为[in]SAFEARRAY(VARIANT)   array。然后再打开MyComponent.h文件把该函数的参数SAFEARRAY   array改为SAFEARRAY*   array。再打开MyComponent.cpp文件修改参数,在函数体内使用COleSafeArray类实现该参数的控制,如 “COleSafeArray   SArray(array,VT_BSTR)”,具体操作可查阅MSDN中的该类的成员函数。 
    
  四、添加接口属性   
    在ClassView中,右击ImyComponent,在出现的菜单中按Add   Property。如图,在Property中可选择属性类型如float,在下面可写上属性名如MyFloat。保持其他不变。这里需要说明的是在生成的put_MyFloat和get_MyFloat函数体中的书写。   
  
  举个小例:   
  1.在CMyComponent   中添加成员变量m_myFloat   
  2.在put_MyFloat   中写上:m_myFloat=newVal;   
  3.在get_MyFloat中写上:*pVal=m_myFloat   
  
  有成员变量也是它优于ISAPI的一个地方,在ISAPI中要在网页间传递信息,只能通过URL参数或者是Cookie来实现,因为每次调用都是一次新的链接,无法在网页之间仍然是同一次调用DLL,所以设置成员变量意义不大,只在一次调用中有用。而那两种方法都只能传递很有限的字符,除非利用创建服务器端临时文件(此方法很不好)。再说,ASP中的Session对象本身就是很好的存储信息的对象。   
  
  
  至此,创建了一个非常简单的没有什么功能的ASP组件,意在说明如何制作。 
  下面,写一个简单的ASP网页,来看看如何使用。网页如下:  
     
  

<%@ Language=VBScript %>
<HTML>
    <HEAD>
        <title>测试ASP内使用C++ COM+组件</title>
    </HEAD>
    <BODY>
       <%
       Set Obj=Server.CreateObject("MyStudio.MyComponent")
       j=Obj.InitMyComp(5)
       Response.Write(j)
       %>
       <p>
       <%
       Obj.MyFloat=3.9
       j=Obj.MyFloat
       Response.Write(j)
       %>
       <p>
       <%
       str1="abcd"
       str2=Obj.StrConv(str1)
       Response.Write(str2)
       %>
    </BODY>
</HTML>    


   
  显示结果为:   
  5   
  3.9   
  abc    

Wednesday, March 20, 2013 | 其他技术

文章评论

No comments posted yet.

发表评论

Please add 4 and 2 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。