2016-09-09 16 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#関数に渡していた文字列は、すべてのAnsiStringです。以前は2007年版のプロジェクトでは "文字列"だったので、AnsiStringに変更しました。

私は困惑しており、何時間も探していて問題を見つけることができません。

+3

C#関数シグネチャとDelphi関数シグネチャの両方が表示されていない場合、特定の問題については何も伝えられません。両方の情報を入力して、何が間違っているか教えてください。現在のところ、あなたのコードは、これらがどのような型であるかを教えてくれません。 –

+0

ChangeFileExtはANSIStringではなくStringを返します。 –

答えて

0

それは、Delphiのデバッガは、C#の例外を処理する方法を知っていないすべて...に沿って働いていたが判明しました。 C#でスローされたtry/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; 
関連する問題