J'ai deux applications mdi, qui récupèrent toutes deux leurs données de la même base de données. Les deux applications doivent pouvoir envoyer des messages les unes aux autres pour rester synchronisées. Les messages transmis ne contiennent qu'une chaîne indiquant à l'application destinataire la partie de la base de données à consulter (un numéro de travail et d'autres informations connexes). Les deux applications ont un gestionnaire de message, instancié lorsque chaque programme démarre. Lorsqu'un message est envoyé de l'application VB6 à l'application C#, il voit le message et agit de manière appropriée, mais lorsque j'envoie le même type de message de l'application C# à l'application VB6, il semble voir le message événement, mais lors du déballage, ne voit qu'une partie des données, puis ignore le message.Messagerie interopérabilité entre applications C# et VB6 mdi
Je pense que je peux être en train de formater quelque chose de faux sur la fin de C#. Voici la méthode qui envoie le message suivant:
namespace InterProcessMessaging
{
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;//a pointer to a number use this to identify your message
public IntPtr lpData;//a pointer to the address of the data
public IntPtr cbData;//a pointer to the number of bytes to be transferred
}
public class clsMessaging : System.Windows.Forms.NativeWindow, IDisposable
{
//API function to send async. message to target application
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr SendMessageA(IntPtr hwnd, Int32 wMsg, Int32 wParam, COPYDATASTRUCT lParam);
public void SendMessageToVB6(string sendMsg, string WindowsAppTitle)
{
try
{
IntPtr hwndTarget = FindWindow(null, WindowsAppTitle);
IntPtr pDWData = Marshal.AllocHGlobal(sizeof(Int32));//a pointer to a number used this to identify your message
Marshal.StructureToPtr(3, pDWData, true);//place the value 3 at this location
IntPtr pLPData = Marshal.StringToHGlobalAnsi(sendMsg.Trim());//a pointer to the address of the data
IntPtr pCBData = Marshal.AllocHGlobal(sizeof(Int32));//a pointer to the number of bytes to be transferred
Marshal.StructureToPtr(sendMsg.Trim().Length+1, pCBData, true);//place the size of the string at this location
COPYDATASTRUCT cds;//a structure containing the three pointers above
cds.dwData = pDWData;//a pointer to a number used this to identify your message (3)
cds.lpData = pLPData;//a pointer to the address of the data
cds.cbData = pCBData;//a pointer to the number of bytes to be transferred
if (!System.IntPtr.Zero.Equals(hwndTarget))
{
SendMessageA(hwndTarget, 74, 0, cds);
}
}
catch (Exception ex)
{
Debug.Print(ex.InnerException.ToString());
}
}
}
}
Je suis d'accord, et ont eu des suggestions similaires au niveau local. La plupart de ceci est hérité. –
Je me demande si vous pourriez expliquer un peu plus, sur les limitations de la messagerie Windows sur Windows 7. Toute cette situation est survenue, lorsqu'une application héritée a été déplacée vers un environnement Windows 7 - 64 bits. Ce que j'essaie de faire à ce stade, c'est simplement de le faire fonctionner de sorte que je puisse prendre le temps de le remplacer, probablement en tant qu'application Web. –
Il s'agit de limitations de sécurité. J'ai fait face aux problèmes de la messagerie Windows entre les applications sur Vista quand il est sorti. Sur Vista (et Win7 je pense), il semble qu'il n'y ait aucun moyen d'envoyer un message à partir d'une application plus basse. Mais pour les tuyaux nommés, vous pouvez le faire. – DReJ