Article ID: 197957
Article Last Modified on 3/21/2005
APPLIES TO
- Microsoft Active Server Pages 4.0
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 6.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ 6.0 Professional Edition
- Microsoft Visual C++ 6.0 Standard Edition
- Microsoft Internet Information Server 4.0
- Microsoft Internet Information Services 5.0
This article was previously published under Q197957
SYMPTOMS
When passing a parameter to a COM Component's method in Active Server Pages (ASP) using VBScript, either the following error occurs:
Or the value stored in the variable passed to the method is not changed.
CAUSE
VBScript will pass parameters to a method by value if the argument's data type is NOT declared as a variant and the parameter is passed by reference if the argument's data type is declared as variant by the method.
RESOLUTION
Parameters to be passed as [out] parameters (that is, by reference) to a method should always be declared as a pointer to a variant data type by the method, while [in] parameters (that is, passed by value) can be declared as any type.
STATUS
This behavior is by design.
MORE INFORMATION
Steps to Reproduce Behavior
- Create an ATL DLL Project called "ByRefProj."
- Insert an ATL Object named "ByRefObj."
- Add and implement the method.
Add a method with the following information:
Method Name: ByRefMethod Parameters : [out]BSTR* bstrVal
Implement the method as follows:
STDMETHODIMP CByRefObj::ByRefMethod( BSTR* bstrVal ) { CComBSTR bstrRtnVal = L"This variable is passed by Reference"; *bstrVal = bstrRtnVal.Detach(); return S_OK; }
Create an Active Server Pages (ASP) page that calls this method:
<% Dim objTest, strByRefVal Set objTest = Server.CreateObject("ByRefProj.ByRefObj") objTest.ByRefMethod strByRefVal %>
- Run ASP, and the following error occurs:
To fix this problem, change the type to VARIANT:
- Change the IDL declaration in the ByRefProj.idl file to:
[id(1), helpstring("method ByRefMethod")] HRESULT ByRefMethod([out] VARIANT* vVal);
- Change the method in the .h and .cpp file. Change the method as follows:
// Where m_bstr is a BSTR member of SomeComObject. vVal->vt = VT_BSTR; vVal->bstrVal = m_bstr.Copy();
- Recompile.
REFERENCES
For additional information, click the article number below to view the article in the Microsoft Knowledge Base:
244012 INFO: Type Mismatch Errors When You Pass Parameters from ASP to a Visual Basic Component
Keywords: kberrmsg kbcodesnippet kbprb KB197957