![]() |
VCL Form in DLL in C# aufrufen
Ich möchte eine existierende Delphi Form in eine Delphi DLL packen und diese Form in C# aufrufen.
Eigentlich habe ich sowas schon früher mit einer anderen Programmiersprache problemlos gemacht..allerdings habe ich den alten Quellcode nicht mehr und die Ziel-Programmiersprache ist eine andere. Die c# Applikation soll dann später über ICS (welche Form dann auch immer) mit der Delphi DLL kommunizieren. Ich weiß dass es Möglichkeiten wie Hydra oder Crosstalk gibt. Allerdings möchte ich es erstmal ohne diese kostenpflichtigen Tools probieren. Ich kann in C# Funktionen aus der Delphi DLL aufrufen und bekomme auch Rückgabewerte, aber sobald ich eine Form in der DLL erstelle bekomme ich eine Exception in C#. Der Fehler passiert schon beim Create der Form (hab ich soweit debuggt). Ich habe schon versucht die Form mit Create(nil) zu erstellen, allerdings mit selbigem Ergebnis. Ich hoffe ihr könnt mir weiterhelfen
Delphi-Quellcode:
c# Code
library Project8;
uses SysUtils, Classes, Windows, Forms, Unit9 in 'Unit9.pas' {Form9}; {$R *.res} procedure TestWindowAnzeigen(aHandle: HWND); stdcall; begin Form9 := TForm9.CreateParented(aHandle); Form9.ShowModal; end; exports TestWindowAnzeigen; begin end.
Code:
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { [DllImport("Project8.dll", CallingConvention = CallingConvention.StdCall)] public static extern void TestWindowAnzeigen(IntPtr aHandle); //public static extern void TestWindowAnzeigen(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { TestWindowAnzeigen(Form1.ActiveForm.Handle); } } } |
AW: VCL Form in DLL in C# aufrufen
Zitat:
Zeit, die mit einem normalen Stundensatz verrechnet deutlich mehr kosten wird als Hydra. |
AW: VCL Form in DLL in C# aufrufen
Die VCL ist nunmal nicht darauf ausgelegt von einer fremden Messagebehandlung behandelt zu werden.
In der Messagebehandlung vom Delphi sind noch paar Dinge drin, welche die Messages sozusagen vorverarbeiten und die Fehlen dann schonmal. uvm. Und dann noch die Sache mit dem .Net und Native .... so ganz vertragen die sich nunmal nicht. Vielleicht ist es einfacher das als eigenständiges Delphi-Programm zu machen, die Teile via IPC miteinander reden zu lassen und nur das externe VCL-Fenster einzubinden (vielleicht auch über den Parent in ein anderes Fenster reinhängen) |
AW: VCL Form in DLL in C# aufrufen
Danke für die Antworten.
Ich konnte mittlerweile das Problem eingrenzen. Sobald ich ein cxGrid von DevExpress auf die Delphi Form packe und die Form in der DLL kapsle kommt es zu der Exception in der C# Anwendung. Egal ob Winforms oder WPF Form. Mit anderen Komponenten scheint es zu laufen. Habe es mal probiert sharemem einzubinden..ging allerdings auch nicht. Ich bin derzeit am ausloten der Möglichkeiten, um die beste Lösung zu finden. Dass es mit dem Messagehandling Probleme geben wird und dass ich per IPC Daten austauschen muss, damit habe ich bereits gerechnet. Die Idee die Fenster aus der Delphi Anwendung in die C# Anwendung zu "übernehmen" hatte ich auch schon..muss ich mal testen wie sich das so verhält. COM Interop: In .Net kann ich ja einfach einen Haken im Projekt setzen "Register for COM interop". Gibt es in Delphi etwas vergleichbares? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz