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

Отладка вызова метода WPF из Delphi: решение проблемы с внешним исключением

Delphi , Файловая система , DLL и PlugIns

Вопрос пользователя связан с вызовом метода из .NET сборки, написанной на C#, в приложении на Delphi 2006 для отображения окна WPF. При вызове метода OpenMyWindow происходит внешнее исключение E0434352. Пользователь предполагает, что проблема может быть связана с инициализацией на стороне WPF.

Контекст проблемы

Пользователь использует библиотеку Unmanaged Exports от Роберта Гизеке для вызова C#-библиотеки из Delphi 2006. Вызов простых процедур и функций с входными и выходными параметрами работает корректно. Однако при попытке показать окно WPF через вызов метода OpenMyWindow возникает ошибка.

Код на Delphi:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

  procedure OpenMyWindow(); stdcall; external 'ClassLibraryToDelphi.dll';

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  OpenMyWindow();
end;

end.

И код на C#:

using System.Linq;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;

namespace ClassLibraryToDelphi
{
    public static class Test
    {
        private static UserControl1 myWindow;

        [DllExport]
        public static void OpenMyWindow()
        {
            myWindow = new UserControl1();
            myWindow.ShowDialog();
        }
    }
}

XAML-разметка и код-задней части окна WPF представлены в вопросе пользователя.

Подтвержденное решение

Пользователь предполагает, что проблема может быть связана с инициализацией WPF-компонентов. Однако в комментариях указывается, что проблема, скорее всего, связана с несовместимостью между WPF и Delphi, и что простое подключение сборки через UnmanagedExports не решит проблему.

Подтвержденное решение заключается в создании сборки C++/CLI, которая экспортирует неуправляемую функцию для показа диалога WPF. Для Delphi необходимо добавить в проект файл типов (.tlb), сгенерированный для сборки, и в файле проекта (dpr) добавить вызов Set8087CW($133F) перед Application.Initialize для отключения исключений с плавающей точкой.

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

На основе ответа пользователя user3016412 было предложено добавить вызов процедуры Set8087CW($133F), что оказалось достаточным для решения проблемы. Это изменение касается управления состоянием копроцессора x87, что может быть важно при работе с плавающей точкой в коде Delphi.

Примеры кода

Для демонстрации, как может выглядеть процедура Set8087CW, приведем пример кода на Object Pascal:

uses
  Math;

procedure Set8087CW(const Value: Word);
var
  FPUCW: Word;
begin
  // Получаем текущее значение контрольного слова FPU
  FPUCW := Get8087CW;
  // Устанавливаем новое значение контрольного слова FPU
  FPUCW := Value;
  // Сохраняем новое значение контрольного слова FPU
  Set8087CW(FPUCW);
end;

Этот код можно использовать в проекте Delphi для управления режимом работы с плавающей точкой.

Заключение

При вызове WPF-окон из Delphi могут возникать сложности, связанные с несовместимостью между фреймворками. Важно тщательно настроить среду выполнения и управление состоянием копроцессора x87. В зависимости от контекста использования, может потребоваться дополнительная настройка проекта и его сборки.

Создано по материалам из источника по ссылке.

Пользователь сталкивается с проблемой вызова метода для отображения окна WPF из приложения на Delphi 2006, где возникает внешнее исключение, и ищет решение, связанное с инициализацией и управлением копроцессором x87 в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: DLL и PlugIns ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 13:18:50/0.0021200180053711/0