AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VCL Form in DLL in C# aufrufen

Ein Thema von Razor03 · begonnen am 15. Mai 2014 · letzter Beitrag vom 19. Mai 2014
Antwort Antwort
Razor03

Registriert seit: 1. Jul 2005
10 Beiträge
 
#1

VCL Form in DLL in C# aufrufen

  Alt 15. Mai 2014, 14:36
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);
        }
    }
}
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)
Online

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#2

AW: VCL Form in DLL in C# aufrufen

  Alt 15. Mai 2014, 17:55
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: VCL Form in DLL in C# aufrufen

  Alt 15. Mai 2014, 18:00
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (15. Mai 2014 um 18:09 Uhr)
  Mit Zitat antworten Zitat
Razor03

Registriert seit: 1. Jul 2005
10 Beiträge
 
#4

AW: VCL Form in DLL in C# aufrufen

  Alt 19. Mai 2014, 09:50
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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz