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