2016-09-09 3 views
-2

Delphi 2007에서 XE6으로 프로젝트를 마이그레이션 한 후에 우리가 만든 C# DLL에서 더 이상 내 보낸 함수를 제대로 호출 할 수 없습니다. C# 코드는 잘 실행되는 것으로 보이며 수행해야 할 작업을 수행하지만 실행이 끝나면 액세스 위반이 발생합니다.Delphi XE6에서 C# dll 함수를 호출하는 액세스 위반

코드 :

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; 

나는 C#을 함수로 전달하고 문자열의 모든 AnsiStrings 있습니다. 그들은 2007 버전의 프로젝트에서 단지 "문자열"이었기 때문에 AnsiString으로 변경했습니다.

나는 당황 스럽다. 몇 시간 씩 찾아 봤는데 문제를 찾을 수 없다.

+3

C# 함수 서명과 Delphi 함수 서명을 모두 보지 않아도 특정 문제에 관해 알려주지는 못합니다. 우리가 무엇이 잘못되었는지 말할 수 있도록 두 가지를 모두 제공하십시오. 현재 코드는 이러한 유형이 무엇인지 알려주지 않습니다. –

+0

ChangeFileExt는 ANSIString이 아닌 String을 반환합니다. –

답변

0

그것은 델파이 디버거의 C# 예외를 처리하는 방법을 알고하지 않습니다 .. 따라서 모든 일 밝혀졌습니다. C#에서 throw/catch 문을 사용할 때도 Delphi 디버거는 액세스 위반으로 간주합니다. 단순히 계속하려면 계속 누르면됩니다. 충돌의 원인은 AnsiString을 사용하도록 변환되어야하는 또 다른 코드 조각이었습니다.

-1

로컬 ansiString 변수를 사용해 보셨습니까? ChangeFileExt()는 문자열 값을 반환합니다. 그런

뭔가를해야만이 :

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; 
관련 문제