如何从Delphi调用C#dll方法时解决错误外部异常E0434352

Toine Gva

我需要解压缩较大的gzip文件(大于4.5 Go)。我在使用TDecompressionStream的Delphi Seattle时遇到了一些麻烦(结果文件被截断了)。

为避免此问题,我选择在C#dll中执行此任务,然后从Delphi调用它。

我的C#代码正在运行,我可以通过控制台应用程序对其进行测试。我添加了块包UnmanagedExports并以32位编译dll。

当我从Delphi调用dll方法时,出现此错误:“外部异常E0434352”

我遵循以下链接的建议:如何在Delphi中使用C#创建的DLL

但我已经有这个问题

我的C#代码

    static public class UnZip
    {
        [DllExport("UngzipFile", CallingConvention.StdCall)]
        public static int UngzipFile(string aFile)
        {
            int result = 0;
            FileInfo fileInfo = new FileInfo(aFile);
            using (FileStream fileToDecompress = fileInfo.OpenRead())
            {
                string decompressedFileName = Path.Combine(Path.GetDirectoryName(aFile), "temp.sql");
                using (FileStream decompressedStream = File.Create(decompressedFileName))
                {
                    using (GZipStream decompressionStream = new GZipStream(fileToDecompress, CompressionMode.Decompress))
                    {
                        try
                        {
                            decompressionStream.CopyTo(decompressedStream);
                        }
                        catch
                        {
                            result = 1;                            
                        }
                    }
                }
            }
            return result;
        }
    }

我的Delphi代码

function UngzipFile(aFile : string) : Integer; stdcall; external 'UnCompress.dll';

procedure TForm1.UnzipFile(aFileName: String);
var
  UnZipFileName : string;
  Return : integer;
  DllZipFile : PWideChar;
begin
  UnZipFileName := ExtractFilePath(aFileName)+'Temp.sql';

  if FileExists(UnZipFileName) then
    DeleteFile(UnZipFileName);

  DllZipFile := PWideChar(aFileName);
  Return := UngzipFile(DllZipFile);
  if Return > 0 then
    raise Exception.Create('Error while uncompressing file');
end;

目前,当我从Delphi调用UngzipFile时,_I收到了外部异常E0434352。

我希望结果= 0,并且我的文件将被解压缩。

谢谢你的帮助。

Toine Gva

感谢Rudy,我找到了解决方案。

由于字符串参数,我的DLL中出现异常。我在dll中添加了日志,发现该dll仅是我的参数的第一个字符。

这篇文章在Delphi中使用C#DLL仅使用第一个函数参数来帮助我更正我的代码。

新的C#代码

    static public class UnZip
    {
        [DllExport("UngzipFile", CallingConvention.StdCall)]
        public static int UngzipFile([MarshalAs(UnmanagedType.LPWStr)] string aFile)
        {
            if (!File.Exists(aFile))
                return 3;

            FileInfo fileInfo;

            string logFile = @"D:\Temp\logDll.log";            
            try
            {
                File.AppendAllText(logFile, aFile);
                fileInfo = new FileInfo(aFile);
            }
            catch(Exception ex)
            {
                File.AppendAllText(logFile, String.Format("File : {0} || Exception : {1}",aFile,ex.Message));
                return 2;
            }

            int result = 0;
            using (FileStream fileToDecompress = fileInfo.OpenRead())
            {
                string decompressedFileName = Path.Combine(Path.GetDirectoryName(aFile), "temp.sql");
                using (FileStream decompressedStream = File.Create(decompressedFileName))
                {
                    using (GZipStream decompressionStream = new GZipStream(fileToDecompress, CompressionMode.Decompress))
                    {
                        try
                        {
                            decompressionStream.CopyTo(decompressedStream);
                        }
                        catch
                        {
                            result = 1;                            
                        }
                    }
                }
            }
            return result;
        }
    }

通过在我的参数声明中添加“ [MarshalAs(UnmanagedType.LPWStr)]”,可以解决此问题。

Thaks Rudy会为您提供帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章