tags:

views:

448

answers:

1

I'm trying to run a MathType in a C# app... using OLE in forms to signify the equations/images.

This is how I started with the code. I got the CLSID object for math type equation. I create a new instance and run a verb to start Math Type. This works good until I try to set or get data of the IDataItem attribute I have.

Code:

string progID = "Equation.DSMT4";
comRetVal= CLSIDFromProgID(progID, out eqContainerGUID);
Type t = Type.GetTypeFromProgID(progID); //ok-> MT6 Equation
Object instance = Activator.CreateInstance(t);

IDataObject oleDataObject = instance as IDataObject;
MTSDKDN.MathTypeSDK.IOleObject oleObject = instance as IDataObject;

//run verb Run For Conversion - I'm not sure what this verb does
oleObject.DoVerb(2, (IntPtr)0, activeSite, 0, (IntPtr)this.Handle, new MathTypeSDK.COMRECT());

//up to here everything is find

//Now say I want to put a MathML string into the IDataObject
//set format 
formatEtc.cfFormat = (Int16)dataFormatMathMLPres.Id; //<-this overflows. I verified that the only format that works is Presentation MAthML
formatEtc.dwAspect = System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT;
formatEtc.lindex = -1;
formatEtc.ptd = (IntPtr)0;
formatEtc.tymed = TYMED.TYMED_HGLOBAL;

//set medium
ConnectSTGMEDIUM stgMedium = new ConnectSTGMEDIUM();
string mathEqn = "<math><mi>x</mi></math>";
stgMedium.unionmember = Marshal.StringToHGlobalAuto(mathEqn);
stgMedium.pUnkForRelease = 0;

//if now i write the equation to console from STGMEDIUM i see that after each char there is a null. Is this normal?

//now I try to set data in IDataObject and the OLE object
//I thought this set the data of the ole object to the MathML string I put in STGMEDIUM
oleDataObject.SetData(ref formatEtc, ref stgMedium, false);

The app now crashes with this exception:

System.Runtime.InteropServices.COMException was unhandled Message="Invalid FORMATETC structure (Exception from HRESULT: 0x80040064 (DV_E_FORMATETC))" Source="System" ErrorCode=-2147221404 StackTrace: at System.Runtime.InteropServices.ComTypes.IDataObject.GetData(FORMATETC& format, STGMEDIUM& medium)

I'm not sure what this means, but I think it might have to do with formatEtc.cfFormat = (Int16)dataFormatMathMLPres.Id; because that ID is 50000 and does not fit in a short (cfFormat is a short) so it overflows to something like -15000.

A: 

Hi, I was wondering if you were finally able to solve the problem. I have been working for several days now trying to using MathType OLE object from my C# application but I have not been able to do it. What I really need is to open the MathType editor and get what the user inputs there after the user is done. I would appreciate if could give me some tips. For instance, in the sample code you posted above can you add the declaration for "activeSite"?

Thanks

Barby