Integrare codice C++ in C#.NET, conversione del vecchio WinMain in una...

venerdì 17 febbraio 2012 - 12.09
Tag Elenco Tags  C#  |  .NET 3.5  |  .NET 4.0  |  Visual Studio 2010  |  Visual Studio 2008

InsettoScoppiettato Profilo | Junior Member

Ciao a tutti,
ho un problema che non riesco a risolvere da solo e ho rinunciato a trovare in rete qualcosa che possa darmi una mano.

Vorrei aprire un Form (chiamiamolo ChildForm) da una Button sulla mia Applicazione C# .NET4 (quindi dalla sua GUI).

Alcuni dettagli per capire il problema:
- il mio SW è una applicazione C#.NET4 con un form principale e alune DLL da cui traggo controlli per la GUI e funzioni di supporto.
- dispongo dei sorgenti di un secondo codice che voglio riutilizzare suddiviso in un progetto principale (che contiene la sua GUI originale che voglio riutilizzare invocandone direttamente l'istanziazione dal suo WinMain, che per me deve diventare il mio ChildForm) e una DLL (che contiene gli algoritmi di calcolo di quel sowftare).
Il suo punto di entrata è questo:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )

e io vorrei aprire la schermata che questo WinMain genera tramite:

private void button4_Click(object sender, EventArgs e) { }

Voglio poter fare quanto segue:
- dall'evento CLICK di un Button sulla mia GUI voglio lanciare il form del vecchio SW
- la mia classe Program deve poter istanziare una seconda classe Kernel (quella della libreria del codice che voglio riutilizzare), per usare i suoi algoritmi senza passare dall'immissione dati via ChildForm, ma tramite una funzione KernelDataLoad() che aggiungerò alla classe Kernel VC++.

Infine il problema che non riesco a sorpassare:
- come faccio a convertire l'EXE originale in C++ in una DLL? cosa devo esportare, il WinMain? E in tal caso come si gestiscono i parametri che si aspetta WinMain, come li passo da .NET?
- non è possibile lanciare quella schermata appartenente al vecchio SW senza modifiche sostanziali? Per esempio estrarre tutta la logica del veccio SW e wrapparlo in una classe Form da lanciare così:

void launchsecondform(object form) { Application.Run(form as Form); } private void button4_Click(object sender, EventArgs e) { ChildForm newform = new ChildForm(); Thread nuovothread2 = new Thread(launchsecondform); nuovothread2.SetApartmentState(ApartmentState.STA); nuovothread2.IsBackground = true; nuovothread2.Start(newform); }


Grazie a tutti per il tempo che avete dedicato a leggere tutto il paginone qui sopra.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5