Bonjour,
Je cherche à partager des variables via une DLL par 2 applications distinctes (une application Windows Form et MetaTrader 4).
Pour cela j'ai développé une petite DLL C# contenant une variable static de type int et 2 fonctions "AddInteger" et "GetInteger" (fichier de sortie : MyDLL.dll).
Dans un projet Windows Form en C#, dans lequel j'ai ajouté la référence à cette DLL, j'ai mis un bouton qui permet d'ajouter 500 à la variable static à chaque clic dessus et un TextBox qui affiche la valeur de la variable static toute les secondes via un Timer (fichier de sortie : MyWindowsFormTestDLL.exe).
Ces 2 fichiers de sorties sont mis dans le dossier LIBRARIES de MetaTrader 4 pour que la DLL puisse être utilisée dans MetaTrader 4.
Dans MetaTrader 4, j'ai programmé les fonctions de la DLL de manières à ce qu'un Expert Advisor ajoute 1 à chaque Tick dans la variable static et affiche ensuite la valeur dans le journal de MetaTrader.
Je lance MetaTrader 4 : tout fonctionne correctement ; je vois l'affichage de la variable qui se voit ajouter 1 à chaque click
Parallèlement je lance mon Windows Form et je clic sur le bouton : cela ajoute bien 500 à chaque fois.
Mais les valeurs ajoutées par MetaTrader 4 n'arrive pas dans mon Windows Form et inversement !
Tout se passe comme si il y avait 2 variables static l'une gérée par MetaTrader et l'autre gérée par mon Windows Form !
Que faut-il que je fasse pour que les 2 programmes MetaTrader et mon Windows Form partage la même variable static ?
A noter que c'est un domaine que je ne maitrise pas !
J'ai cherché sur les forums pour tenter de trouver un problème similaire mais en vain.
Y a t-il des exemples de code quelque part sur lequel je pourrais me baser pour avancer dans la résolution de mon problème ?
Existe t-il des livres traitant de ces interactions entre programmes managés et non managés (DLLImport, DLLExport) en français ?
Ci-dessous le code utilisé généré dans Visual Studio 2013 ainsi que les projets correspondant en pièces jointes :
MyDLL.zipMyWindowsFormTestDLL.zip
MyDLL.dll :
MyWindowsFormTestDLL.exe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using RGiesecke.DllExport; namespace MyDLL { public class MesFonctionsDLL { public static int MaVariableInt; [DllExport("AddInteger", CallingConvention = CallingConvention.StdCall)] public static int AddInteger(int value) { //Ajout de value à la variable static MaVariableInt += value; return (MaVariableInt); } [DllExport("GetInteger", CallingConvention = CallingConvention.StdCall)] public static int GetInteger() { return (MaVariableInt); } } }
Merci d'avance pour vos réponses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using MyDLL; namespace MyWindowsFormTestDLL { public partial class MyForm : Form { public MyForm() { InitializeComponent(); } private void MyForm_Load(object sender, EventArgs e) { //Démarre le timer this.MyTimer.Start(); } private void MyTimer_Tick(object sender, EventArgs e) { //Affiche la valeur de la variable static de la dll dans la TextBox this.MyTextBox.Text = MesFonctionsDLL.MaVariableInt.ToString(); } private void MyButton_Click(object sender, EventArgs e) { //Ajoute 500 à la variable static de la dll MesFonctionsDLL.MaVariableInt += 500; } } }
Partager