struct TDetailedZodiacSignImpl : public TDetailedZodiacSign
{
   TDetailedZodiacSignImpl()
   {
      Sign = NULL;
      Element = NULL;
      Element = NULL;
      Planet = NULL;
      Details = NULL;
      Details = NULL;
      Advice = NULL;
   }
   ~TDetailedZodiacSignImpl()
   {
      if (Sign != NULL)
        SysFreeString(Sign);
      if (Element != NULL)
        SysFreeString(Element);
      if (Planet != NULL)
        SysFreeString(Planet);
      if (Details != NULL)
        SysFreeString(Details);
      if (Advice != NULL)
        SysFreeString(Advice);
   }
};

//...

STDMETHODIMP TZodiacImpl::GetDetailedZodiacSignAsync(long Day, long Month)
{
  try
  {
    TCOMCriticalSection::Lock Lock(CS);

    TDetailedZodiacSignImpl DetailedSign;
    ::GetDetailedZodiacSign(Day, Month, DetailedSign);
	  Fire_OnDetailedZodiacSignReady(&DetailedSign);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IDetailedZodiac, E_FAIL);
  }
  return S_OK;
};