24小时热门版块排行榜    

查看: 1034  |  回复: 1

9685233

铜虫 (正式写手)

[求助] delphi如何通过 mathlink,或者api函数调用mathematica的mathkernel 已有1人参与

delphi如何通过 mathlink,或者api函数调用mathematica的mathkernel

日本人做了一个activX插件,可用,但不好用。想自己做一个,但没找到方法。

网上有国人用vb做了,但找不到源码,无法入手。

目的,通过delphi传递计算公式到mathkernel,然后从math计算的结果传回delphi。
尝试了通讯tcp协议,没成功。


谢谢哟!!!!!
回复此楼

» 猜你喜欢

有所不为,有所为
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

aassaabc

新虫 (初入文坛)

【答案】应助回帖

delphi没试出来。cb试出来的,不过不完美,下面是代码
CMathLink::CMathLink(String  strEnginePath)
{
        m_strEnginePath = strEnginePath;
        m_bConnected = FALSE;

        m_mlenvp = (MLENV)0;
        m_mlinkp = (MLINK)0;
        m_hemfGlobal = NULL;

        m_eInputMode = ExpressionExpected;
        m_bFirstPiece = TRUE;
        m_bVerboseMenuComing = FALSE;
        m_iDialogLevel = 0;

        m_strMsgInfo = "";
        m_strGraphic = "";
        m_strOutput = "";
        m_strInput = "";
        m_strOutputPrompt = "";
        m_strInputPrompt = "";

        m_strInitString = "";
        m_strInitString = m_strInitString + "$Display := OpenTemporary[];" +
                                "$DisplayFunction = (Module[{tmpstream = $Display, tmpfile}, " +
                                "tmpfile = tmpstream[[1]]; Close[tmpstream]; " +
                                "Display[tmpfile, #1, \"Metafile\"]; LinkWrite[$ParentLink, " +
                                "DisplayEndPacket[tmpfile]]]; #1)&; SetOptions[{ContourGraphics, " +
                                "ContourPlot, DensityGraphics, DensityPlot, Graphics, Graphics3D, " +
                                "GraphicsArray, ListContourPlot, ListDensityPlot, ListPlot, " +
                                "ListPlot3D, ParametricPlot, ParametricPlot3D, Plot, Plot3D, " +
                                "SurfaceGraphics}, AspectRatio -> 2]; SetOptions[ \"stdout\", " +
                                "PageWidth->65]; Format[LineBreak[_]]:= \"\";\n " +
                                "Format[Continuation[_]]:= \"\"; SetAttributes[MessagePacket, " +
                                "HoldFirst];";
}

CMathLink::~CMathLink()
{
        Disconnect();
}

BOOL CMathLink::Connect()
{
        BOOL bRet = FALSE;

        if(FALSE == m_bConnected)
        {
                INT lErr;
                m_mlenvp = MLInitialize( (MLParametersPointer)0);
                if(m_mlenvp != (MLENV)0)
                {
/*                        int argc = 4;
                        char *argv[5] = {"-linkname",
                                 "D:\\Program Files\\Mathematica\\9.0\\mathkernel -mathlink",
                                 "-linkmode",
                                 "launch",
                                 NULL};
                        m_mlinkp = MLOpen(argc,argv);  */
                        String strLaunch;
                        strLaunch = " -linkname '\"";
                        strLaunch += m_strEnginePath;
                        strLaunch += "\"-mathlink' -linkmode Launch";
                        m_mlinkp = MLOpenString(m_mlenvp,AnsiString(strLaunch).c_str(), &lErr);
                        if(m_mlinkp != (MLINK)0)
                        {
                                m_bConnected = TRUE;
                                fnEvaluate(m_mlinkp, "");

                                MLPutFunction(m_mlinkp, "EvaluatePacket", 1);
                                MLPutFunction(m_mlinkp, "ToExpression", 1);

                                MLPutByteString(m_mlinkp, AnsiString(m_strInitString).c_str(), m_strInitString.Length());
//                                MLPutString(m_mlinkp, AnsiString(Form1->Edit1->Text).c_str());

                                fnEvaluate(m_mlinkp, NULL);
                                bRet = TRUE;
                        }
                        else
                        {
                                MLDeinitialize(m_mlenvp);
                                m_mlenvp = (MLENV)0;
                        }
                }
        }
        else
                bRet = TRUE;

        return bRet;
}
BOOL CMathLink::Connect2()
{
   int argc = 4;
   char *argv[5] = {"-linkname",
                                 "D:\\Program Files\\Mathematica\\9.0\\mathkernel -mathlink",
                                 "-linkmode",
                                 "launch",
                                 NULL};
   m_mlenvp = MLInitialize(NULL); if(m_mlenvp == NULL) Form1->Edit2->Text = "出错env" ;
   m_mlinkp = MLOpen(argc, argv);  if(m_mlinkp == NULL) Form1->Edit2->Text = "出错lp" ;

   return TRUE;
}

void CMathLink::Disconnect()
{
        if(NULL != m_hemfGlobal)
                DeleteEnhMetaFile(m_hemfGlobal);

        if(TRUE == m_bConnected)
        {
                MLPutFunction(m_mlinkp, "Quit", 0);
                MLClose(m_mlinkp);
                MLDeinitialize(m_mlenvp);
                m_mlenvp = (MLENV)0;
                m_mlinkp = (MLINK)0;
                m_bConnected = FALSE;
        }
}

INT CMathLink::fnCheckError(MLINK mlinkp)
{
    INT iResult;

        if(mlinkp == (MLINK)0) return MLEDEAD;
        iResult = MLError(mlinkp);
        if(iResult)
        {
                m_strMsgInfo = MLErrorMessage(mlinkp);
                MLClose(mlinkp);
        }
    return iResult;
}

BOOL CMathLink::Evaluate(String pInputString)
{
        if(TRUE == m_bConnected)
        {
                if(pInputString.Length() > MAXLENGTH_INPUT)
                        return FALSE;

                if(pInputString != "")
                {
                        char buffer[MAXLENGTH_INPUT];
                        memset(buffer, 0, MAXLENGTH_INPUT*sizeof(char));
                        strcpy(buffer, AnsiString(pInputString).c_str());
                        fnEvaluate(m_mlinkp, buffer);
                }

                return TRUE;
        }
        return FALSE;
}

void CMathLink::DisplayGraphic(HDC hdcGraphic, RECT& rect)
{
        if(m_hemfGlobal)
        {
                RECT rc;
                INT cxborder, cyborder;

                FillRect(hdcGraphic, &rect, (HBRUSH) (COLOR_WINDOW + 1));
                cxborder        = GetSystemMetrics(SM_CXEDGE);
                cyborder        = GetSystemMetrics(SM_CYEDGE);
                rc.left                = rect.left + 4 + cxborder;
                rc.right        = rect.right  - 4 - cxborder;
                rc.top                = rect.top + 4 + cyborder;
                rc.bottom        = rect.bottom - 4 - cyborder;
                PlayEnhMetaFile(hdcGraphic, m_hemfGlobal, &rect);
        }
}

void CMathLink::Interrupt()
{
        MLPutMessage(m_mlinkp, MLInterruptMessage);
}

void CMathLink::Abort()
{
        MLPutMessage(m_mlinkp, MLAbortMessage);
}

char * CMathLink::fnReplaceSlashZeroOneTwo(char *pString)
{
        char str[] = "\\012";
        char ht[]  = {10, 9, 0};
        char *pInstance = pString;

        pInstance = strstr(pInstance, str);
        while(pInstance)
        {
                pInstance[0] = ' ';
                pInstance[1] = ' ';
                pInstance[2] = 13;
                pInstance[3] = 10;
                pInstance = strstr(pInstance, str);
        }
        pInstance = pString;
        pInstance = strstr(pInstance, ht);
        while(pInstance)
        {
                pInstance[0] = 13;
                pInstance[1] = 10;
                pInstance = strstr(pInstance, ht);
        }
        return pString;
}

BOOL CMathLink::fnEvaluate(MLINK mlinkp, CHAR *pInputString)
{
        const CHAR *pOutputString,*temp;
        BOOL bDone = FALSE;
        INT  iSyntaxErrorPosition = -1;
        INT  iInterruptMenu;
        INT  pak;

        if(NULL != pInputString)
        {
                if(m_eInputMode == ExpressionExpected)
                {
                 //                MLPutFunction(mlinkp, "EvaluatePacket", 1);
                //                MLPutFunction(mlinkp, "ToExpression", 1);
                        MLPutFunction(mlinkp, "EnterTextPacket", 1);
                }
                else
                {
                        MLPutFunction(mlinkp, "TextPacket", 1);
                        m_eInputMode = ExpressionExpected;
                }
                MLPutByteString(mlinkp, (const unsigned char*)pInputString, strlen(pInputString));
                MLEndPacket(mlinkp);
                // Check linkp
                if(fnCheckError(mlinkp)) return FALSE;
        }

        m_strOutput = "";

        while(!bDone)
        {
                while(1)
                {
                        MLFlush(mlinkp);
                        if(MLReady(mlinkp)) break;
                }

                switch(pak = MLNextPacket(mlinkp)) {
                case ILLEGALPKT:
                        if(!MLClearError(mlinkp) || !MLNewPacket(mlinkp))
                                bDone = TRUE;
                        break;

                case INPUTNAMEPKT:

                case INPUTPKT:
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                m_strInputPrompt = pOutputString;
                                MLDisownString(mlinkp, pOutputString);
                        }
                        bDone = TRUE;
                        break;

                case TEXTPKT:
                Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" TEXTPKT"+String(pak);
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString);
                                m_strOutput += pOutputString;
                                m_strOutput += "\n";
                                MLDisownString(mlinkp, pOutputString);
                        }
                        if(m_bVerboseMenuComing)
                        {
                                m_bVerboseMenuComing = FALSE;
                                m_strOutput += pInputString;
                                bDone = TRUE;
                        }
                        break;

                case OUTPUTNAMEPKT:
                Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" OUTPUTNAMEPKT"+String(pak);
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                m_strOutputPrompt = pOutputString;
                                MLDisownString(mlinkp, pOutputString);
                        }
                        break;

                case RETURNTEXTPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" RETURNTEXTPKT"+String(pak);
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString);
                                m_strOutput += pOutputString;
                                m_strOutput += "\n";
                                MLDisownString(mlinkp, pOutputString);
                        }
                        break;

                case RETURNPKT:
                        //MLNewPacket(mlinkp);
                   //        MLGetString(mlinkp, &temp);
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +"    RETURNTPKT"+String(pak);
                        read_and_print_expression(mlinkp);
                        break;

                case DISPLAYPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYPKT"+String(pak);
                        if(TRUE == m_bFirstPiece)
                        {
                                m_strGraphic = "";
                                m_bFirstPiece = FALSE;
                        }
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                m_strGraphic += pOutputString;
                                //fnOpenWMFFile(AnsiString(m_strGraphic).c_str());
                                MLDisownString(mlinkp, pOutputString);
                        }
                        break;


                case DISPLAYENDPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYENDPKT"+String(pak);
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                fnOpenWMFFile(pOutputString);
                                MLDisownString(mlinkp, pOutputString);
                        }
                        m_bFirstPiece = TRUE;
                        break;

                case SYNTAXPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" SYNTAXPKT"+String(pak);
                        MLGetInteger(mlinkp, &iSyntaxErrorPosition);
                        m_strOutput += pInputString;
                        m_strOutput += pInputString;
                        memset(pInputString, ' ', iSyntaxErrorPosition);
                        m_strOutput += pInputString;
                        break;

                case INPUTSTRPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" INPUTSTRPKT"+String(pak);
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                m_strInputPrompt = pOutputString;
                                MLDisownString(mlinkp, pOutputString);
                        }
                        m_eInputMode = StringExpected;
                        bDone = TRUE;
                        break;

                case MENUPKT:
                        MLGetInteger(mlinkp, &iInterruptMenu);
                        if(MLGetString(mlinkp, &pOutputString))
                        {
                                strcpy(pInputString, pOutputString);
                                MLDisownString(mlinkp, pOutputString);
                        }
                        m_eInputMode = StringExpected;
                        if(iInterruptMenu == 0)
                                m_bVerboseMenuComing = TRUE;
                        else
                        {
                                m_strInputPrompt = pInputString;
                                bDone = TRUE;
                        }
                        break;

                case MESSAGEPKT:
                Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" MESSAGEPKT"+String(pak);
                        MLGetSymbol(mlinkp, &pOutputString);
                        m_strMsgInfo += pOutputString;
                        MLDisownString(mlinkp, pOutputString);
                        MLGetString(mlinkp, &pOutputString);
            m_strMsgInfo += "::";
                        m_strMsgInfo += pOutputString;
                        m_strMsgInfo += "\n";
                        MLDisownString(mlinkp, pOutputString);
                        break;

                case SUSPENDPKT:
                        m_strOutput += "***SUSPENDED***";
                        m_strOutput += "\n";
                        MLNewPacket(mlinkp);
                        bDone = TRUE;
                        break;

                case RESUMEPKT:
                        m_strOutput += "***RESUMED***";
                        m_strOutput += "\n";
                        MLNewPacket(mlinkp);
                        break;

                case BEGINDLGPKT:
                        {
                                CHAR buffer[32];
                                MLGetInteger(mlinkp, &m_iDialogLevel);
                                m_strOutput += "Entering Dialog: ";
                                m_strOutput += itoa(m_iDialogLevel, buffer, 10);
                                m_strOutput += "\n";
                        }
                        break;

                case ENDDLGPKT:
                        {
                                char buffer[32];
                                MLGetInteger(mlinkp, &m_iDialogLevel);
                m_iDialogLevel--;
                                m_strOutput += "Leaving Dialog: ";
                                m_strOutput += itoa(m_iDialogLevel, buffer, 10);
                                m_strOutput += "\n";
                        }
                        break;
                }

          //        MLNewPacket(mlinkp);
                if(fnCheckError(mlinkp)) return FALSE;
        }

    return TRUE;
}

BOOL CMathLink::expEvaluate(CHAR *pInputString)
{
        const CHAR *pOutputString;
        BOOL bDone = FALSE;
        INT  iSyntaxErrorPosition = -1;
        INT  iInterruptMenu;
        INT  pak,pkt;

//         const CHAR *pOutputString;  AnsiString(Form1->Edit1->Text).c_str()
         MLPutFunction(m_mlinkp, "EvaluatePacket", 1);
           MLPutFunction(m_mlinkp, "ToExpression", 1);
                  MLPutString(m_mlinkp,pInputString);
         MLEndPacket(m_mlinkp);
  /*         while ( (pkt = MLNextPacket(m_mlinkp), pkt) && pkt != RETURNPKT) {
           MLNewPacket(m_mlinkp);
           if (MLError(m_mlinkp))
                        fnCheckError(m_mlinkp);
           };
         MLNewPacket(m_mlinkp);
         read_and_print_expression(m_mlinkp);      */


        while(!bDone)
        {
           /*        while(1)
                {
                        MLFlush(m_mlinkp);
                        if(MLReady(m_mlinkp)) break;
                }     */

                switch(pak = MLNextPacket(m_mlinkp)) {
                case ILLEGALPKT:
                        if(!MLClearError(m_mlinkp) || !MLNewPacket(m_mlinkp))
                                bDone = TRUE;
                        break;

                case INPUTNAMEPKT:

                case INPUTPKT:
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                m_strInputPrompt = pOutputString;
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        bDone = TRUE;
                        break;

                case TEXTPKT:
                Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" TEXTPKT"+String(pak);
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString);
                                m_strOutput += pOutputString;
                                m_strOutput += "\n";
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        if(m_bVerboseMenuComing)
                        {
                                m_bVerboseMenuComing = FALSE;
                                m_strOutput += pInputString;
                                bDone = TRUE;
                        }
                        break;

                case OUTPUTNAMEPKT:
                Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" OUTPUTNAMEPKT"+String(pak);
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                m_strOutputPrompt = pOutputString;
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        break;

                case RETURNTEXTPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" RETURNTEXTPKT"+String(pak);
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString);
                                m_strOutput += pOutputString;
                                m_strOutput += "\n";
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        break;

                case RETURNPKT:
                        //MLNewPacket(m_mlinkp);
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +"    RETURNTPKT"+String(pak);
                        read_and_print_expression(m_mlinkp);
                        break;

                case DISPLAYPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYPKT"+String(pak);
                        if(TRUE == m_bFirstPiece)
                        {
                                m_strGraphic = "";
                                m_bFirstPiece = FALSE;
                        }
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                m_strGraphic += pOutputString;
                                //fnOpenWMFFile(AnsiString(m_strGraphic).c_str());
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        break;


                case DISPLAYENDPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYENDPKT"+String(pak);
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                fnOpenWMFFile(pOutputString);
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        m_bFirstPiece = TRUE;
                        break;

                case SYNTAXPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" SYNTAXPKT"+String(pak);
                        MLGetInteger(m_mlinkp, &iSyntaxErrorPosition);
                        m_strOutput += pInputString;
                        m_strOutput += pInputString;
                        memset(pInputString, ' ', iSyntaxErrorPosition);
                        m_strOutput += pInputString;
                        break;

                case INPUTSTRPKT:
                        Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" INPUTSTRPKT"+String(pak);
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                m_strInputPrompt = pOutputString;
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        m_eInputMode = StringExpected;
                        bDone = TRUE;
                        break;

                case MENUPKT:
                        MLGetInteger(m_mlinkp, &iInterruptMenu);
                        if(MLGetString(m_mlinkp, &pOutputString))
                        {
                                strcpy(pInputString, pOutputString);
                                MLDisownString(m_mlinkp, pOutputString);
                        }
                        m_eInputMode = StringExpected;
                        if(iInterruptMenu == 0)
                                m_bVerboseMenuComing = TRUE;
                        else
                        {
                                m_strInputPrompt = pInputString;
                                bDone = TRUE;
                        }
                        break;

                case MESSAGEPKT:
                Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" MESSAGEPKT"+String(pak);
                        MLGetSymbol(m_mlinkp, &pOutputString);
                        m_strMsgInfo += pOutputString;
                        MLDisownString(m_mlinkp, pOutputString);
                        MLGetString(m_mlinkp, &pOutputString);
            m_strMsgInfo += "::";
                        m_strMsgInfo += pOutputString;
                        m_strMsgInfo += "\n";
                        MLDisownString(m_mlinkp, pOutputString);
                        break;

                case SUSPENDPKT:
                        m_strOutput += "***SUSPENDED***";
                        m_strOutput += "\n";
                        MLNewPacket(m_mlinkp);
                        bDone = TRUE;
                        break;

                case RESUMEPKT:
                        m_strOutput += "***RESUMED***";
                        m_strOutput += "\n";
                        MLNewPacket(m_mlinkp);
                        break;

                case BEGINDLGPKT:
                        {
                                CHAR buffer[32];
                                MLGetInteger(m_mlinkp, &m_iDialogLevel);
                                m_strOutput += "Entering Dialog: ";
                                m_strOutput += itoa(m_iDialogLevel, buffer, 10);
                                m_strOutput += "\n";
                        }
                        break;

                case ENDDLGPKT:
                        {
                                char buffer[32];
                                MLGetInteger(m_mlinkp, &m_iDialogLevel);
                m_iDialogLevel--;
                                m_strOutput += "Leaving Dialog: ";
                                m_strOutput += itoa(m_iDialogLevel, buffer, 10);
                                m_strOutput += "\n";
                        }
                        break;
                }
                if(fnCheckError(m_mlinkp)) return FALSE;
        }
        return TRUE;
}

void  CMathLink::read_and_show_expression(MLINK mlinkp)
{

        kcharp_ct  s;
        int n,n1;
        int i, len;
        double r;
  //        const char *string1;
  //        MLGetFunction(mlinkp,&string1,&n1);
  //        MLGetInteger32(mlinkp,&n1);
//        string1= AnsiString(n1).c_str() ;
   //        Form1->Edit2->Text = AnsiString(MLGetNext(mlinkp)).c_str() ;
//        Form1->Edit2->Text = string1;
        static int indent;
//        MLGetNext(mlinkp);
//        MLGetNext(mlinkp);
        switch( MLGetNext(mlinkp)) {
        case MLTKSYM:
                MLGetSymbol(mlinkp, &s);
                m_strOutputExpression = s;
                MLDisownSymbol(mlinkp, s);
                break;
        case MLTKSTR:
                MLGetString(mlinkp, &s);
                m_strOutputExpression =  s;
                MLDisownString(mlinkp, s);
                break;
        case MLTKINT:
                Form1->Edit2->Text = "gc";
                MLGetInteger( mlinkp, &n);
                m_strOutputExpression = AnsiString(n).c_str();
                break;
        case MLTKREAL:
                MLGetReal(mlinkp, &r);
                m_strOutputExpression = AnsiString(n).c_str();
                break;
        case MLTKFUNC:
                indent += 3;
                printf( "/n %*.*s", indent, indent, "");
                if( MLGetArgCount(mlinkp, &len) == 0){
                        fnCheckError(mlinkp);
                }else{
                        read_and_show_expression(mlinkp);
                        printf( "[");
                        for( i = 1; i <= len; ++i){
                                 read_and_show_expression(mlinkp);
                                if( i != len) printf( ", ");
                        }
                        printf( "]");
                }
                indent -= 3;
                break;
        case MLTKERROR:
    default:

                fnCheckError(mlinkp);

    }

}
/*
int  CMathLink::read_and_print_function(MLINK mlinkp)
{
        int  len, i;
        static int indent;

        if( ! MLGetArgCount(mlinkp, &len)) return 0;

        indent += 3;
        printf( "\n%*.*s", indent, indent, "");

        if( read_and_print_expression(mlinkp) == 0) return 0;
        printf( "[");

        for( i = 1; i <= len; ++i) {
                if( read_and_print_expression(mlinkp) == 0) return 0;
                if( i < len) printf( ", ");
        }
        printf( "]");
        indent -= 3;

        return 1;
}

void  CMathLink::read_and_print_atom(MLINK mlinkp, int tag)
{
        const char *s;//expression用
        if( tag == MLTKSTR) putchar( '"');
        if( MLGetString(mlinkp, &s)){
                //printf( "%s", s);
                Form1->Memo1->Text = AnsiString(s).c_str();
           //        Form1->Edit2->Text = AnsiString(tag).c_str();
                MLDisownString(mlinkp, s);
        }
        if( tag == MLTKSTR) putchar( '"');
        putchar( ' ');
   //        return MLError(mlinkp) == MLEOK;
}     */


INT CMathLink::fnOpenWMFFile(const CHAR *pFileString)
{
        Form1->Image1->Picture->Metafile->LoadFromFile(pFileString);
        Form1->Image1->Picture->Graphic->SetSize(180*3,172*3);
        //Form1->Image1->Stretch = True;
        Form1->cxImage1->Picture ->Metafile ->LoadFromFile(pFileString);
        Form1->cxImage1->Picture ->Graphic->SetSize(180*3,172*3);
        //Form1->cxImage1->Picture ->Graphic->Width = Form1->cxImage1->Width;

/*        HENHMETAFILE        theMetafile;
        APMHEADER                theAPMHeader;
        METAFILEPICT        theWMFHeader;
        FILE                        *theFile;
        HDC                                hdcMetafile;
        BYTE                        *metafileBits;
        LONG                        metafileSize;

        theFile = fopen(pFileString, "rb");
        if(NULL == theFile)
        {
                return 0;
        }

        fseek(theFile, 0, SEEK_END);
        metafileSize = ftell(theFile) - sizeof(theAPMHeader);
        rewind(theFile);

        fread(&theAPMHeader, 1, sizeof(theAPMHeader), theFile);
        if(theAPMHeader.dwKey != 0x9ac6cdd7l || theAPMHeader.wCheckSum != fnCalculateAPMCheckSum(&theAPMHeader))
        {
                fclose(theFile);
                return 0;
        }

        metafileBits = (BYTE *)malloc(sizeof(unsigned char) * metafileSize);
        if(NULL == metafileBits)
        {
                fclose(theFile);
        return 0;
        }
        fread(metafileBits, 1, metafileSize, theFile);
        fclose(theFile);

        theWMFHeader.mm   = MM_ANISOTROPIC;
        theWMFHeader.xExt = theAPMHeader.bbox.Right - theAPMHeader.bbox.Left;
        theWMFHeader.xExt = (theWMFHeader.xExt * 2540l)/(DWORD)theAPMHeader.wInch;
        theWMFHeader.yExt = theAPMHeader.bbox.Bottom - theAPMHeader.bbox.Top;
        theWMFHeader.yExt = (theWMFHeader.yExt * 2540l)/(DWORD)theAPMHeader.wInch;
        theWMFHeader.hMF  = NULL;

        hdcMetafile = GetDC(NULL);
        theMetafile = SetWinMetaFileBits(metafileSize, metafileBits, hdcMetafile, &theWMFHeader);
        free(metafileBits);
        ReleaseDC(NULL, hdcMetafile);

        if(NULL != m_hemfGlobal)
                DeleteEnhMetaFile(m_hemfGlobal);

        m_hemfGlobal = theMetafile;

        remove(pFileString);     */
        return 1;
}

WORD CMathLink::fnCalculateAPMCheckSum(const APMHEADER * apmfh)
{
        LPWORD        lpWord;
        WORD        wResult, i;

        wResult = *(lpWord = (LPWORD)(apmfh));        // Start with the first word
        for(i = 1; i <= 9; i++)                                        // XOR in each of the other 9 words
                wResult ^= lpWord;
        return wResult;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        CMathLink ML1("D:\\Program Files\\Mathematica\\9.0\\mathkernel");
        ML1.Connect();
        ML1.Evaluate(AnsiString(Edit1->Text).c_str());
        Memo1->Text = ML1.GetOutputExpression();
        RichEdit1->Text = ML1.GetGraphicInfo();
        //Image1->Picture->Metafile->LoadFromFile(ML1.GetOutputInfo());
        cxRichEdit1 ->SelText = ML1.GetOutputInfo();
        RzRichEdit1 ->Text = ML1.GetOutputInfo();
  //        RzExpandEdit1 ->Text = ML1.GetMsgInfo();
        ML1.Disconnect() ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        CMathLink ML2("D:\\Program Files\\Mathematica\\9.0\\mathkernel");
        ML2.Connect();
  //        ML2.Evaluate(AnsiString(Edit1->Text).c_str());
        ML2.expEvaluate(AnsiString(Form1->Edit1->Text).c_str()) ;

        ML2.Disconnect() ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
  //Edit1->Text = ListBox1->Items->GetText();
  Edit1->Text = ListBox1->Items->Strings[ListBox1->ItemIndex];
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        ListBox1->Items->Add("RegionPlot3D[x^2 + y^3 - z^2 > 0, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}]");
        ListBox1->Items->Add("Plot3D[Sin[x + Cos[y]], {x, -4, 4}, {y, -4, 4}]");
        ListBox1->Items->Add("Plot[Sin[x], {x, 0, 6 Pi}]");
        ListBox1->Items->Add("Plot[{Sin[x], Sin[2 x], Sin[3 x]}, {x, 0, 2 Pi}, PlotLegends -> \"Expressions\"]");
        ListBox1->Items->Add("Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10},Filling -> Axis]");
        ListBox1->Items->Add("ContourPlot[Cos[x] + Cos[y] == 1/2, {x, 0, 4 Pi}, {y, 0, 4 Pi}]");
        ListBox1->Items->Add("DensityPlot[Sin[x] Sin[y], {x, -4, 4}, {y, -3, 3}, Mesh -> 10]");
        ListBox1->Items->Add("Solve[x^2 + a x + 1 == 0, x]");
        ListBox1->Items->Add("NSolve[x^5 - 2 x + 3 == 0, x]");
        ListBox1->Items->Add("NSolve[{x^2 + y^2 == 1, x^3 + y^3 == 2}, {x, y}]");
        ListBox1->Items->Add("RegionPlot[x^2 + y^2 < 1, {x, -1, 1}, {y, -1, 1}, Mesh -> 10,MeshShading -> {{Automatic, None}, {None, Automatic}}, ColorFunction -> \"DarkRainbow\"]");
        ListBox1->Items->Add("data1 = RandomVariate[NormalDistribution[2, 3], 100];data2 = RandomVariate[StudentTDistribution[4, 2, 1], 200];ProbabilityPlot[{data1, data2},PlotLegends -> {\"normal\", \"Student t\"}]");
        ListBox1->Items->Add("{sol, points} = Reap@NDSolve[{x'[t] == -y[t] - x[t]^2, y'[t] == 2 x[t] - y[t]^3,p'[t] == Sqrt[Derivative[1][x][t]^2 + Derivative[1][y][t]^2],x[0] == y[0] == 1, p[0] == 0,WhenEvent[Sin[Pi*p[t]] == 0, Sow[t]]}, {x, y, p}, {t, 100}];ParametricPlot[{x[t], y[t]} /. sol, {t, 0, 100}, Mesh -> points,MeshShading -> {Green, Orange}, PlotRange -> All]");
}
//---------------------------------------------------------------------------

static int read_and_print_expression(MLINK lp)
{
        int tag;
        const char * f;
        switch (tag = MLGetType( lp)) {
        case MLTKSYM:
        case MLTKSTR:
                Form1->Edit2->Text = AnsiString(tag).c_str() ;
   //                return read_and_print_atom( lp, tag);
        case MLTKINT:
                Form1->Edit2->Text = AnsiString(tag).c_str() ;
                return read_and_print_atom( lp, tag);
        case MLTKREAL:
                return read_and_print_atom( lp, tag);
        case MLTKFUNC:
                return read_and_print_function( lp);
        case MLTKERROR:
        //case MLTKGRAF;
        default:
                return 0;
        }
        return 0;
}

static int read_and_print_function( MLINK lp)
{
        int  len, i;
        static int indent;

        if( ! MLGetArgCount( lp, &len)) return 0;

        indent += 3;
        printf( "\n%*.*s", indent, indent, "");

        if( read_and_print_expression( lp) == 0) return 0;
        printf( "[");

        for( i = 1; i <= len; ++i) {
                if( read_and_print_expression( lp) == 0) return 0;
                if( i < len) printf( ", ");
        }
        printf( "]");
        indent -= 3;

        return 1;
}

static int   read_and_print_atom( MLINK lp, int tag)
{
        const char *s;
        if( MLGetString( lp, &s)){
                Form1->Edit2->Text = Form1->Edit2->Text + String(s);
                Form1->Memo1->Text = AnsiString(s).c_str();
                MLDisownString( lp, s);
        }
        return MLError( lp) == MLEOK;
}

static void error( MLINK lp)
{
        if (MLError( lp)) {
                fprintf( stderr, "Error detected by MathLink: %s.\n",
                MLErrorMessage( lp));
        }else{
                fprintf( stderr, "Error detected by this program.\n");
        }
        exit( 1);
}
2楼2015-06-17 19:12:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 9685233 的主题更新
信息提示
请填处理意见