Решение проблемы с COM-библиотекой C# в Delphi после обновления Windows 11 24H2: ошибка "Float Invalid Operation" при фильтрации числовых данных.
После установки обновления Windows 11 24H2 некоторые разработчики столкнулись с проблемой при работе с COM-библиотеками, разработанными на C# и используемыми в Delphi. Ошибка проявляется в виде исключения "OS Error "$C0000090 - Float Invalid Operation"" при выполнении фильтрации данных с использованием числовых столбцов базы данных. В этой статье мы рассмотрим возможные причины этой ошибки и предложим решение, основанное на опыте одного из пользователей.
Описание проблемы
Проблема возникает при попытке выполнить LINQ-запрос к базе данных через Entity Framework из COM-объекта C#, который вызывается из Delphi. В частности, ошибка происходит при использовании метода Where для фильтрации данных по числовому полю, например, LoanAmt.
Пример кода C#:
namespace SampleApp
{
[Guid("ACCBC742-CAE9-4958-97E9-AA9CDA61DDF7"), ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class ARLoanManager
{
public void ARUpdateLoan(string LoanNo)
{
CSCommon.MyConnString = @"Password=mahavira;Persist Security Info=True;User ID=sa;Initial Catalog=SaccoMan;Data Source=.\sqlexpress;connection timeout=60;";
using (var db = new DataContext())
{
var LoanList = db.ARLoans.Where(x => x.LoanAmt == 0).ToList();
}
}
}
}
Пример кода Delphi:
procedure TForm1.estCOM1Click(Sender: TObject);
var
DBManager: _ARLoanManager;
begin
try
DBManager := CoARLoanManager.Create;
DBManager.ARUpdateLoan('');
except
ShowMessage('Error');
end;
ShowMessage('Complete!');
end;
Ошибка "Float Invalid Operation" указывает на то, что процессор столкнулся с недопустимой операцией с плавающей точкой. В контексте данной проблемы, это, вероятно, связано с несовместимостью форматов чисел с плавающей точкой между C# и Delphi, особенно после обновления Windows.
Решение проблемы
К сожалению, в предоставленном контексте нет конкретного решения проблемы. Однако, основываясь на общем понимании взаимодействия COM-объектов и обработки чисел с плавающей точкой, можно предложить несколько возможных подходов:
Проверка региональных настроек: Убедитесь, что региональные настройки Windows (формат чисел, разделитель целой и дробной части) одинаковы на компьютере, где работает Delphi, и на компьютере, где разрабатывается COM-библиотека C#. Несоответствие в этих настройках может приводить к неправильной интерпретации чисел с плавающей точкой.
Явное преобразование типов: Попробуйте явно преобразовывать типы данных в C# перед передачей их в Delphi. Например, если LoanAmt имеет тип decimal или double, попробуйте преобразовать его в Single (аналог Single в Delphi) перед использованием в фильтре.
Использование строкового представления чисел: Вместо передачи числовых значений, передавайте их строковое представление. В Delphi можно будет преобразовать строку обратно в число.
Пример кода C# (использование строкового представления):
namespace SampleApp
{
[Guid("ACCBC742-CAE9-4958-97E9-AA9CDA61DDF7"), ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class ARLoanManager
{
public string ARGetLoans(string LoanNo)
{
CSCommon.MyConnString = @"Password=mahavira;Persist Security Info=True;User ID=sa;Initial Catalog=SaccoMan;Data Source=.\sqlexpress;connection timeout=60;";
using (var db = new DataContext())
{
// Преобразуем LoanAmt в строку для передачи в Delphi
var LoanList = db.ARLoans.Where(x => x.LoanAmt.ToString() == "0").ToList();
// ... Дальнейшая обработка LoanList и преобразование в строку для возврата
return "Список кредитов в строковом формате";
}
}
}
}
Пример кода Delphi:
procedure TForm1.estCOM1Click(Sender: TObject);
var
DBManager: _ARLoanManager;
LoanListString: string;
begin
try
DBManager := CoARLoanManager.Create;
LoanListString := DBManager.ARGetLoans(''); // Получаем строку с данными
// ... Обработка строки LoanListString и преобразование в нужные типы
except
ShowMessage('Error');
end;
ShowMessage('Complete!');
end;
Отладка на уровне ассемблера: Если ни один из вышеперечисленных методов не помог, можно попробовать отладить код на уровне ассемблера, чтобы точно определить, в каком месте происходит ошибка и какие значения участвуют в недопустимой операции с плавающей точкой. Это потребует глубоких знаний архитектуры процессора и отладочных инструментов.
Альтернативное решение
Вместо использования COM-объектов, можно рассмотреть другие способы взаимодействия между C# и Delphi:
REST API: Создать REST API на C# и вызывать его из Delphi. Это более современный и гибкий подход, который позволяет избежать проблем, связанных с COM.
gRPC: Использовать gRPC для взаимодействия между C# и Delphi. gRPC обеспечивает высокую производительность и поддерживает различные языки программирования.
Заключение
Ошибка "Float Invalid Operation" при работе с COM-библиотеками C# в Delphi после обновления Windows 11 24H2 может быть вызвана несовместимостью форматов чисел с плавающей точкой. Предложенные решения, такие как проверка региональных настроек, явное преобразование типов и использование строкового представления чисел, могут помочь устранить эту проблему. В качестве альтернативы можно рассмотреть другие способы взаимодействия между C# и Delphi, такие как REST API или gRPC.
Важно отметить, что без дополнительной информации о конкретной конфигурации и данных, участвующих в операции фильтрации, сложно дать однозначное решение. Рекомендуется тщательно изучить код, отладить его и поэкспериментировать с различными подходами, чтобы найти оптимальное решение для вашей ситуации.
Контекст описывает возникшую после обновления Windows 11 24H2 проблему несовместимости COM-библиотеки C# с Delphi, проявляющуюся ошибкой "Float Invalid Operation" при фильтрации числовых данных, и предлагает возможные пути решения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS