Einzelnen Beitrag anzeigen

mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#1

MathType einbinden

  Alt 4. Jun 2007, 14:45
Hallo, alle miteinander,


ich versuche seit einiger Zeit, die MathType-DLL und -WLL einzubinden, um programmautomatisch auf Formeln in Word-Dokumenten zuzugreifen, sie zu konvertieren etc. Und wie dem immer so ist: es klappt natürlich nicht...

Ich habe mir eine Klasse geschrieben, um gewisse Dinge zu erledigen. Wenn ich ein Objekt dieser Klasse erzeuge, erfolgt ein InitAPI von Mathtype, das auch fehlerfrei funktioniert:

Delphi-Quellcode:
type

  TMTInitAPI = function (
    options: SmallInt;
    timeout: SmallInt ): Integer; stdcall;

  TMTAPIVersion = function ( api: SmallInt ): LongInt; stdcall;

[...]

function TMathType.DLLVersionIsCorrect: Boolean;
var
  APIVersion: TMTAPIVersion;
begin
  Result := False;
  if self.MTInstalled then begin
    @APIVersion := GetProcAddress ( FHandleWLL, 'MTAPIVersion' );
    if @APIVersion <> nil then
      Result := APIVersion ( 5 ) >= 1280;
  end;
end;

constructor TMathType.Create ( UserHandle: THandle );
var
  InitAPI: TMTInitAPI;
begin

  FUserHandle := UserHandle;
  FHandleWLL := LoadLibrary ( 'C:\Programme\MathType\MathPage\MathPage.wll' );
  FHandleDLL := LoadLibrary ( 'C:\Programme\MathType\System\MT5.dll' );

  if FHandleWLL = 0 then SendMessage ( FUserHandle, MSG_MT_WLLNOTINSTALLED, 0, 0 );
  if FHandleDLL = 0 then SendMessage ( FUserHandle, MSG_MT_DLLNOTINSTALLED, 0, 0 );

  FMathTypeInstalled := ( ( FHandleWLL <> 0 ) and ( FHandleDLL <> 0 ) );

  if FMathTypeInstalled then begin

    if self.DLLVersionIsCorrect then begin

      @InitAPI := GetProcAddress ( FHandleWLL, 'MTInitAPI' );
      if @InitAPI <> nil then ShowMessage ( 'InitApi: ' + IntToStr ( InitAPI ( mtinitLAUNCH_NOW, -1 ) ) )
      else ShowMessage ( 'InitApi ist nil' );

    end
    else ShowMessage ( 'Noch API-Version' );

  end;

end;
Wenn ich später allerdings eine Funktion aus der DLL aufrufe (und mich - meines Erachtens - genau an die Dokumentation des MathType-SDK halte) bekomme ich als Ergebnis immer -9999 gemeldet. Und das ist laut MathType-Dokumentation IRGENDEIN Fehler.

Beispiel für einen solchen Aufruf in meiner Klasse (die Parameter sind fest verdrahtet, da es sich hier wirklich nur um Tests handelt):

Delphi-Quellcode:
type

  TMPProcessHTML = function (
    inPath: String;
    outPath: String ): LongInt; stdcall;

[...]

procedure TMathType.ProcessHTML;
var
  ProcHTML: TMPProcessHTML;
begin
  if FHandleWLL <> 0 then begin
    if self.DLLVersionIsCorrect then begin
      @ProcHTML := GetProcAddress ( FHandleWLL, 'MPProcessHTML' );
      if @ProcHTML <> nil then begin
        try
          ShowMessage ( IntToStr ( ProcHTML ( 'Testdokument.htm', 'Testdokument_mt.htm' ) ) );
        except
          ShowMessage ( 'Absturz' );
        end;
      end;
    end;
  end;
end;
Zu beachten ist, dass das Terminieren der API auch wieder fehlerfrei vonstatten geht. Aber die Zugriffe auf Konvertierungsmethoden schlagen fehl (-9999).

Kennt sich jemand mit dieser Problematik aus? Ist schonmal jemand auf ähnliches gestoßen und hat es vielleicht gelöst? Wäre super, wenn Ihr mir helfen könntet.


Matthias
Matthias Jenke
  Mit Zitat antworten Zitat