COM and ASP: How to manage memory

Can someone tell how memory operations work between C++ and VB/ASP. I am building a COM object that will be called from VB or ASP. I don't know if I have to insert code within the COM object for cleaning up allocated memory. The problem is shown below for a COM function, TestFunction. From C++ you can release the memory using SysFreeString(). How do I do the same from within ASP or VB?

C++ COM Code
STDMETHODIMP MyComObject::TestFunctn(BSTR* TestMsg)

     CString MyMessage("My name is James");    
     *TestMsg=MyMessage.AllocSysString();//Memory is allocated here
     return S_OK;

C++ client code
HRESULT hr=CoCreateInstance(.......pMyInstance..........);
BSTR TestMsg;  
HRESULT pMyInstance->TestFunctn(&TestMsg);//Call to TestFunctn with TestMsg as the argument.  
CString TheMessage(TestMsg);
::SysFreeString(TestMsg);//Memory is cleaned here

Equivalent ASP client Code
Set pMyInstance = Server.CreateObject("MyComApplication.MyComObject")

'Function call to TestFunctn with TestMsg as the argument.
pMyInstance.TestFunctn TestMsg  
Response.Write "Message: " & TestMsg & "<br>"

'Where does one clean the memory?
Who is Participating?
peterchen092700Connect With a Mentor Commented:
The protocol is fairly straightforward, and the scripting filter does much for you.

3 scenarios:

1) returning a string: server allocates and forgets, client frees

STDMETHODIMP MyComObject::Foo(/*[out]*/ BSTR* TestMsg)
  // you allocate the memory here, but don't store the pointer away

scripting module will free the string when no longer needed

2) passing a string to the server: client allocates, server uses and forgets, client frees after call

STDMETHODIMP MyComObject::Bar(/*[in]*/ BSTR TestMsg)
   // leave TestMsg as is. If you need to remember it past the function call, make a copy

scripting component allocates the string, passes to your function, frees the string

3) passing by reference - i.e. an in/out string: caller allocates; server uses may reallocate and forgets, client frees.

(this scenario is rare for scripting components)

STDMETHODIMP MyComObject::FooBar(/*[in,out]*/ BSTR *TestMsg)
  // you use and can change the contents of the string
  // if you need to re-allocate the string, free it before:
  *TestMsg = ::SysAllocString(L"Here's your string back");

scripting component allocates the string, passes to your function, uses returned value, frees the string

IIRC, when dealing with automation languages (like ASP), the [IN] and [OUT] qualifiers in the IDL for your object dictate who owns what memory and when.

Take a quick look at an IDL reference on [IN] and [OUT], and I believe you will find your answer.

-=- James.
As A personal rule I always set my instances of Server.Create Object to nothing

i.e., Set pMyInstance = Nothing

just to make sure ;-)
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

any memory YOU allocate within your c++ code you must free/delete etc. if you are using BSTR to return values to asp in the OUT param of you method then just make sure you detach the BSTR
makerp: the wording of your comment might be confusing. Of course when you have to return a BST you must allocate but not free it. and you can't "detach a BSTR", you can only detach a BSTR from some wrapper class (like _bstr_t or CComBSTR).

Best Regards
Dear aderounm

I think you forgot this question. I will ask Community Support to close it unless you finalize it within 7 days. You can always request to keep this question open. But remember, experts can only help you if you provide feedback to their questions.
Unless there is objection or further activity,  I will suggest to accept


comment(s) as an answer.

If you think your question was not answered at all, you can post a request in Community support (please include this link) to refund your points. The link to the Community Support area is:

Force accepted

** Mindphaser - Community Support Moderator **
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.