MathGroup Archive 2002

[Date Index] [Thread Index] [Author Index]

Search the Archive

Need Help! Mathlink C++ problems

  • To: mathgroup at smc.vnet.net
  • Subject: [mg35914] Need Help! Mathlink C++ problems
  • From: Mike Stenzler <mstenzler at ssaris.com>
  • Date: Thu, 8 Aug 2002 06:06:05 -0400 (EDT)
  • Organization: SSARIS Advisors LLC
  • Sender: owner-wri-mathgroup at wolfram.com

I'm trying to call the Mathematica kernel from within a C++ app.

I can open a connection but can't keep it open.

When I step thru my code, and reach the MLOpenString() call, an instance
of the mathematica kernel is created on my machine.
I can see it in the task bar and task mgr shows it running.

However, when I attempt to do anything with that link, the instance goes
away.


here's a code snippet (edited for clarity):

#include <mathlink.h>

/*
*********************************************

*********************************************
*/
void CMainFrame::OnMLTest()
{
 long mlerr = 0L;

 // this seems OK (env is !NULL upon return)
 MLENV env = MLInitialize(0);

 // function call below returns a NOT-NULL link and no error - also
seems OK
 MLINK link = MLOpenString(env, "-linkname 'c:\\mlink\\mathkernel
-mathlink'", &mlerr);

// at this point kernel instance (link) has been created...

 int mstat = MLActivate(link);
 // anything past this point is useless as link closes as soon as the
call above is made
 // even though the value in mstat implies the call succeeded - ie;
non-zero
 // this holds true regardless of what call is made after MLOpenString()

 // call could be MLConnect() or MLPutFunction() or MLFlush() or
MLReady()
 // as soon as the newly created link is accessed
 // it closes - oddly enough without error for all subsequent calls

 // try to send 2+2 to the kernel for evaluation
 if(mstat = MLPutFunction(link, "EvaluatePacket", 1L))
  {
  if(mstat = MLPutFunction(link, "Plus", 2))
   {
   mstat = MLPutInteger(link, 2);
   mstat = MLPutInteger(link, 2);
   }
  mstat = MLEndPacket(link);
  }

 // all of the above function calls return w/o error

 // dispose of unwanted packets - there's only one (a #17 SUSPENDPKT)
and no errors
 while((pkt = MLGetNextPacket(link),pkt) && pkt != RETURNPKT)
  {
  mstat = MLNewPacket(link);
  }

 // when we get here pkt = 0 - we go to default and get error msg
saying:
 // "the other side closed the link, you may still get undelivered data"

 switch(MLGetNext(link))
  {
  case MLTKSYM:
  .
  .
  .
  default:
  s.Format("%s", MLErrorMessage(link));
  AfxMessageBox(s);
  }

}


I'm linking with ml32i2m.lib using Visual C++ 6.0 under WinXPpro

Any thoughts?


Michael Stenzler
Chief Technology Officer
SSARIS Advisors LLC
Stamford CT
mstenzler at ssaris.com



  • Prev by Date: RE: Re: Installing package "SpreadOption`"
  • Next by Date: RE: RE: plot several functions
  • Previous by thread: Putting Tables into Graphics (once again)
  • Next by thread: Kramers Kronig Relations