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)
{
     AFX_MANAGE_STATE(AfxGetStaticModuleState())

     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);
::MessageBox(TheMessage);
::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?
aderounmAsked:
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:
  ::SysFreeString(*TestMsg);
  *TestMsg = ::SysAllocString(L"Here's your string back");
}  

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


Peter
0
 
jtwine100697Commented:
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.
0
 
MattCCommented:
As A personal rule I always set my instances of Server.Create Object to nothing

i.e., Set pMyInstance = Nothing

just to make sure ;-)
0
Cloud Class® Course: Microsoft Windows 7 Basic

This introductory course to Windows 7 environment will teach you about working with the Windows operating system. You will learn about basic functions including start menu; the desktop; managing files, folders, and libraries.

 
makerpCommented:
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
0
 
peterchen092700Commented:
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
Peter
0
 
griesshCommented:
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

     "peterchen"

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: http://www.experts-exchange.com/commspt/

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
======
Werner
0
 
MindphaserCommented:
Force accepted

** Mindphaser - Community Support Moderator **
0
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.