Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   VCL Form in DLL in C# aufrufen (https://www.delphipraxis.net/180369-vcl-form-dll-c-aufrufen.html)

Razor03 15. Mai 2014 13:36

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:
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.
c# Code

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);
        }
    }
}

Phoenix 15. Mai 2014 16:55

AW: VCL Form in DLL in C# aufrufen
 
Zitat:

Zitat von Razor03 (Beitrag 1258993)
Ich weiß dass es Möglichkeiten wie Hydra oder Crosstalk gibt. Allerdings möchte ich es erstmal ohne diese kostenpflichtigen Tools probieren.

Du brauchst COM-Interop bzw. P/Invoke. Und Zeit. Viel Zeit, bis Du das sauber hast.
Zeit, die mit einem normalen Stundensatz verrechnet deutlich mehr kosten wird als Hydra.

himitsu 15. Mai 2014 17:00

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)

Razor03 19. Mai 2014 08:50

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