2009-08-29 45 views
1

Я пытаюсь запустить MathType в приложении C# ... используя OLE в формах для обозначения уравнений/изображений.MathType in C# (OLE)

Вот как я начал с кода. Я получил объект CLSID для уравнения математического типа. Я создаю новый экземпляр и запускаю глагол для запуска Math Type. Это работает хорошо, пока я не попытаюсь установить или получить данные из атрибута IDataItem, который у меня есть.

Код:

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); 

приложение теперь падает с этим исключением:

System.Runtime.InteropServices.COMException было необработанное сообщение = "Недопустимая структура FORMATETC (Исключение из HRESULT: 0x80040064 (DV_E_FORMATETC))»Источник = "система" ErrorCode = -2147221404 StackTrace: в (FORMATETC & формате System.Runtime.InteropServices.ComTypes.IDataObject.GetData, STGMEDIUM & среда)

Я не уверен, что это значит, но я думаю, что это, возможно, придется делать с formatEtc.cfFormat = (Int16)dataFormatMathMLPres.Id; , потому что идентификатор 50000 и не укладывается в короткий (cfFormat короткий), так что перетекает что-то вроде - 15000.

ответ

2

Я решил подобную проблему, переведя ее из знака без знака. это означает, что если значение (dataFormatMathMLPres.Id) больше, чем 32767. Вместо этого используйте (dataFormatMathMLPres.Id - 65536). Он будет соответствовать подписанным коротким.