MathType в C # (OLE) - PullRequest
       90

MathType в C # (OLE)

1 голос
/ 29 августа 2009

Я пытаюсь запустить MathType в приложении 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 не обработано. Message = "Недопустимая структура FORMATETC (Исключение из HRESULT: 0x80040064 (DV_E_FORMATETC)))" Source = "System" ErrorCode = -2147221404 StackTrace: at System.Runtime.IDomOject.IDOjectSject.IDOjectSject.IjectTjectSject.IjectOjectSject.IjectTjectSjectSjectSjectSID .GetData (FORMATETC & формат, STGMEDIUM & средний)

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

1 Ответ

2 голосов
/ 25 ноября 2011

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

...