2016-09-09 4 views
-2

Nach der Migration unseres Projekts von Delphi 2007 auf XE6 können wir eine exportierte Funktion in einer von uns erstellten C# -Dll nicht mehr ordnungsgemäß aufrufen. Der C# -Code scheint gut zu funktionieren und tut, was er tun soll, aber nachdem er fertig ist, löst er eine Zugriffsverletzung aus.Zugriffsverletzung beim Aufrufen der C# -Dll-Funktion von Delphi XE6

Der Code:

Result := False; 

    lib := LoadLibrary('KJPDFExport.dll'); 
    if lib = 0 then RaiseLastOSError; 
    try 
    try 
     @prc := GetProcAddress(lib, 'ExportOffice'); 
     if Assigned(prc) then 
     begin 
     Result := prc(sourceFile, 
      ChangeFileExt(destinationFile, ''), 
      pdfBackgroundHeadFile, 
      pdfBackgroundSubFile); 
     end 
     else 
     ShowMessage('ExportOffice not found in KJPDFExport.dll'); 
    except 
     on e:Exception do 
     begin 
     ShowMessage(e.Message); 
     end; 
    end; 
    finally 
    FreeLibrary(lib); 
    end; 

Die Saiten, die ich auf die C# Funktion bin vorbei sind alle Ansistrings. Sie waren in der Version 2007 des Projekts nur "String" und ich habe sie daher in AnsiString geändert.

Ich bin verwirrt, ich habe Stunden gesucht und kann das Problem nicht finden.

+3

Wir können Ihnen zu Ihrem spezifischen Problem nichts sagen, ohne die Signatur der C# -Funktion und die Signatur der Delphi-Funktion zu sehen. Bitte geben Sie beides an, damit wir Ihnen sagen können, was daran falsch ist. Momentan teilt uns Ihr Code nicht mit, um welche Typen es sich handelt. –

+0

ChangeFileExt gibt String - Nicht ANSIString zurück. –

Antwort

0

Es stellt sich heraus, es war die ganze Zeit .. Der Delphi-Debugger nicht weiß, wie C# Ausnahmen zu behandeln. Selbst wenn Sie in C# eine thry/catch-Anweisung um Ihren throw haben, wird der Delphi-Debugger dies dennoch als Zugriffsverletzung sehen. Wenn Sie einfach nur weiter drücken, funktioniert es. Der Grund für den Absturz war ein weiterer Code, der zur Verwendung von AnsiString konvertiert werden musste.

-1

Haben Sie versucht, die lokale ansiString-Variable zu verwenden? ChangeFileExt() gibt den Zeichenfolgenwert zurück.

Somthing wie folgt aus:

var sIn, sOut : ansiString; 
    Result := False; 

    sIn := ansiString(sourceFile); 
    sOut := ansistring(ChangeFileExt(destinationFile, '')); 

    lib := LoadLibrary('KJPDFExport.dll'); 
    if lib = 0 then RaiseLastOSError; 
    try 
    try 
     @prc := GetProcAddress(lib, 'ExportOffice'); 
     if Assigned(prc) then 
     begin 
     Result := prc(Sin, 
         sOut, 
      pdfBackgroundHeadFile, 
      pdfBackgroundSubFile); 
     end 
     else 
     ShowMessage('ExportOffice not found in KJPDFExport.dll'); 
    except 
     on e:Exception do 
     begin 
     ShowMessage(e.Message); 
     end; 
    end; 
    finally 
    FreeLibrary(lib); 
    end; 
Verwandte Themen