2010-04-14 4 views
0

J'ai un programme delphi héritage et que vous souhaitez ajouter un peu de contenu mis en œuvre avec WPF. Donc, je encapsule le contrôle WPF avec une technologie d'interopérabilité .NET/ActiveX. Cela signifie quelque chose comme: [ComRegisterFunction()] public static void RegisterClass(string key); [ComUnregisterFunction()] public static void UnregisterClass(string key);Le composant ActiveX .NET avec le contenu WPF ne peut pas être chargé par l'application non MFC

Le composant activeX est un contrôle utilisateur WinForms et les matériaux WPF sont attachés à un ElemenHost dans ce contrôle utilisateur.

Cela fonctionne très bien si l'application hôte de cet ActiveX est un programme MFC même sans commutateur/clr. Mais mon application héritée est un programme Delphi, et elle lance toujours une exception stackoverflow à la première ligne du constructeur de mon contrôle utilisateur WPF au démarrage du programme.

le message montre par exception est: An unhandled exception of type 'System.StackOverflowException' occurred in PresentationFramework.dll

Je n'ai pas la moindre idée, Google est d'aucune aide. et cela m'a intrigué pendant des jours.

Répondre

0

Wow! Delphi -> ActiveX -> WinForms -> WPF. Je serais étonné si cela fonctionnait réellement.

Ma suggestion serait d'obtenir WinForms et ActiveX de l'image entièrement:

Du côté WPF juste:

  • Utilisez un HwndSource comme PresentationSource
  • Créer une classe qui expose une "CreateWindow" fonction qui prend un IntPtr à la fenêtre parente
  • Appliquer [ComVisible] à la classe

Du côté Delphi juste:

  • Construct la fenêtre parent
  • Créer la classe WPF utilisant COM
  • Appel "CreateWindow" pour créer le contenu WPF
  • Définissez les autres propriétés que nécessaire pour contrôler et communiquer avec le contenu WPF

Si vous voulez vraiment essayer de faire le travail d'imbrication Delphi -> ActiveX -> WinForms -> WPF, je commencerais par obtenir une trace de pile à l'heure du débordement de la pile. Cela devrait vous aider à comprendre ce qui ne va pas et à le réparer.

+0

Merci pour votre réponse, je vais essayer de cette façon. A propos de la trace de la pile, il s'agit d'un appel infini imbriqué dans 'ntdll.dll', sans nom de fonction. – Hugo

Questions connexes