【问题标题】:Access violation calling C# dll function from Delphi XE6从 Delphi XE6 调用 C# dll 函数的访问冲突
【发布时间】:2016-09-09 13:52:06
【问题描述】:

将我们的项目从 Delphi 2007 迁移到 XE6 后,我们不再能够正确调用我们构建的 C# dll 中的导出函数。 C# 代码似乎执行得很好,并且做了它应该做的事情,但是在它完成之后,它会引发访问冲突。

代码:

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。

我很困惑,我找了好几个小时都找不到问题所在。

【问题讨论】:

  • 如果没有看到 C# 函数签名和 Delphi 函数签名,我们无法告诉您任何有关您的具体问题的信息。请同时提供两者,以便我们告诉您其中有什么问题。目前,您的代码没有告诉我们这些是什么类型。
  • ChangeFileExt 返回字符串 - 不是 ANSIString。

标签: c# delphi dll


【解决方案1】:

事实证明它一直都在工作。Delphi 调试器不知道如何处理 C# 异常。即使您在 C# 中的 throw 周围有 try/catch 语句,Delphi 调试器仍会将其视为访问冲突。当您只需按继续时,它就可以工作。崩溃的原因是另一段代码必须转换为使用 AnsiString。

【讨论】:

    【解决方案2】:

    您是否尝试使用本地 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多