2013-10-01 3 views
0

Nous avons commencé à utiliser MATLAB 64 bits dans notre système et certains de nos anciens codes M utilisent une version personnalisée du composant ActiveX MSFlexGrid. Nous avons donc décidé d'écrire une version .Net 64 bits de il. L'ActiveX est exposé via un hôte Windows Forms.Utilisation d'un contrôle 64 bits .Net ActiveX en 64 bits MATLAB

Le contrôle utilisateur Windows Form incorpore un contrôle utilisateur WPF via ElementHost.

private IGrid grid; 

    private void GridWinFormsHostLoad(object sender, System.EventArgs e) 
    { 
     var host = new ElementHost { Dock = DockStyle.Fill }; 
     this.grid = new GridView(); 
     host.Child = (GridView)this.grid; 
     this.Controls.Add(host); 
    } 

Le contrôle est enregistré avec succès, visible Matlab, et peut être instancié via

actxcontrol('FlexiGrid', Position, Fig, CallBack); 

Méthodes et propriétés exposées dans les GridWinForms sont visibles et peuvent être obtenir/ensemble/invoqué. Cependant, après l'instanciation de l'ActiveX, nous devons finalement appeler .Net - dans le processus MATLAB - via une DLL MEX. L'appel s'exécute avec succès dans .Net mais le processus MATLAB se bloque lorsque le contrôle revient de .Net. L'exécution du même code sans instancier le contrôle ActiveX réussit et MATLAB ne gèle pas, ce qui signifie que l'instanciation du contrôle .Net ActiveX est probablement la cause du gel de MATLAB. this MSDN thread Lors de la recherche de solutions, j'ai rencontré this MSDN thread dans lequel il est indiqué: "Ce problème se produit car la boucle de message utilisée par le Windows Form et la boucle de message fournie par l'application client COM sont différentes." L'affiche originale conclut qu'il a résolu le problème avec WPF + MFC mais ne détaille pas la solution.

J'ai également trouvé this MSDN article qui stipule que: "Pour qu'un formulaire Windows fonctionne correctement à partir d'une application client COM, vous devez exécuter le formulaire sur une boucle de message Windows Forms." Ceci est également prometteur, sauf que la solution se concentre sur la création de nouvelles fenêtres Windows Form mais j'ai besoin d'exécuter un contrôle utilisateur Windows Forms intégré dans une fenêtre MATLAB.

Le problème semble donc lié à l'hébergement d'un contrôle ActiveX géré sur une application non gérée - des idées?

Répondre

0

Pas une vraie « solution » à votre question, mais peut-être un (AMHA bonne) alternative pour les trucs activeX:

A partir de une version Matlab (je pense ~ 2009 ou alors, d'autres pourraient me corriger si non) vous pouvez utiliser des bibliothèques .NET directement depuis MATLAB, sans avoir besoin de l'interface COM: http://www.mathworks.de/de/help/matlab/getting-started.html

Syntaxe, vous pouvez utiliser des classes .NET presque aussi bien que des classes java. En particulier, cela devrait être beaucoup plus confortable que de parler. NET via MEX - je suppose.

+0

Merci pour votre suggestion. Je suis d'accord qu'il peut être mieux que MEX d'appeler .Net, je vais le transmettre à la personne responsable de cela dans notre équipe, cependant, je suppose que pour réellement intégrer n'importe quel contrôle utilisateur dans une fenêtre MATLAB j'ai encore besoin d'un Contrôle ActiveX. – Andrey

+0

Vous avez raison à ce sujet - il ne semble pas y avoir une fonction analogue à 'actxcontrol 'pour les objets .NET ... (encore) – sebastian

Questions connexes