При работе с большими GZIP файлами в среде Delphi Seattle с использованием TDecompressionStream может возникать проблема, когда результирующий файл оказывается обрезанным. Для решения этой проблемы было принято решение разархивации файлов в C# DLL, к которой затем можно обратиться из Delphi.
Проблема
При вызове метода DLL из Delphi возникает внешнее исключение E0434352. Это происходит несмотря на то, что C# код работает корректно в консольном приложении и DLL была скомпилирована в 32-битном режиме.
Исходный C# код для разархивации
static public class UnZip
{
[DllExport("UngzipFile", CallingConvention.StdCall)]
public static int UngzipFile(string aFile)
{
// Код для разархивации файла
}
}
Исходный код Delphi для вызова C# метода
function UngzipFile(aFile : string) : Integer; stdcall; external 'UnCompress.dll';
procedure TForm1.UnzipFile(aFileName: String);
begin
// Код для вызова метода разархивации
end;
Решение проблемы
После анализа возникло предположение, что проблема связана с передачей строкового параметра в C# метод. Добавление логирования в C# DLL выявило, что передавалась только первая буква параметра. Исправление кода C# с использованием атрибута MarshalAs позволило корректно передать строку в метод.
Исправленный C# код
static public class UnZip
{
[DllExport("UngzipFile", CallingConvention.StdCall)]
public static int UngzipFile([MarshalAs(UnmanagedType.LPWStr)] string aFile)
{
// Код для разархивации файла с исправленной передачей параметра
}
}
Важные замечания
Необходимо убедиться, что в коде Delphi используется корректная типизация для строковых параметров. В частности, функция разархивации должна быть объявлена так:
function UngzipFile(aFile : PWideChar) : Integer; stdcall; external 'UnCompress.dll';
И вызов должен осуществляться с использованием PChar:
Return := UngzipFile(PChar(DllZipFile));
Заключение
При вызове C# DLL для разархивации GZIP файлов в Delphi важно тщательно следить за корректностью передачи строковых параметров. Использование атрибута MarshalAs в C# и правильная типизация в Delphi позволяют устранить ошибку E0434352 и обеспечить успешное выполнение операции разархивации.
Устранение ошибки E0434352 при взаимодействии между C# DLL для разархивации GZIP файлов и Delphi, связанное с неправильной передачей строковых параметров.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS