Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с COM-библиотекой C# в Delphi после обновления Windows 11 24H2: ошибка "Float Invalid Operation" при фильтрации числовых данных.

Delphi , Технологии , COM и DCOM

Решение проблемы с 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-объектов и обработки чисел с плавающей точкой, можно предложить несколько возможных подходов:

  1. Проверка региональных настроек: Убедитесь, что региональные настройки Windows (формат чисел, разделитель целой и дробной части) одинаковы на компьютере, где работает Delphi, и на компьютере, где разрабатывается COM-библиотека C#. Несоответствие в этих настройках может приводить к неправильной интерпретации чисел с плавающей точкой.

  2. Явное преобразование типов: Попробуйте явно преобразовывать типы данных в C# перед передачей их в Delphi. Например, если LoanAmt имеет тип decimal или double, попробуйте преобразовать его в Single (аналог Single в Delphi) перед использованием в фильтре.

  3. Использование строкового представления чисел: Вместо передачи числовых значений, передавайте их строковое представление. В 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;
  1. Отладка на уровне ассемблера: Если ни один из вышеперечисленных методов не помог, можно попробовать отладить код на уровне ассемблера, чтобы точно определить, в каком месте происходит ошибка и какие значения участвуют в недопустимой операции с плавающей точкой. Это потребует глубоких знаний архитектуры процессора и отладочных инструментов.

Альтернативное решение

Вместо использования 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: COM и DCOM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-09-14 16:48:53/0.0065429210662842/0