如何从Visual FoxPro 9中使用WPF UserControls或Windows

时间:2018-03-27 19:19:10

标签: wpf visual-foxpro

我有一个非常非常大且复杂的Visual FoxPro 9应用程序。我想在WPF中重写部分应用程序,最终目标是在几年后完成切割。我花了相当多的时间在google和stackoverflow上搜索一个端到端的“hello world”类型的示例,了解如何使用COM interop实现这一点。找到了点点滴滴,但没有完整显示FoxPro端和WPF端。

我的直觉告诉我,如果我尝试通过COM Interop运行它,我可能会遇到XAML资源,第三方控件或WPF应用程序的其他常规功能的问题。

所以,两个问题。任何人都可以指向一个小的端到端样本,从FoxPro启动WPF窗口或让我删除FoxPro窗体上的WPF用户控件?或者我对可能的互操作问题的关注是对的,应该完全避免这种情况吗?如果是这样,这两个可执行文件是否建议相互通信?

1 个答案:

答案 0 :(得分:0)

我完全不知道你是否可以在visual FoxPro中运行wpf。我猜你必须把它写成activex。 我最近做了一些扩展MS Access应用程序的工作。 我的wpf应用程序完全独立,并与ms访问应用程序一起运行。 我使用MS Message Queue在两者之间进行通信 - 这是一个com组件。 也许这种方法对你有用。

当我想通过访问在wpf中显示一个屏幕时,我将一段xml添加到本地消息队列中。 wpf应用程序侦听这些消息,将它们转换为对象,告诉它显示哪个屏幕并为其提供任何参数。 MS Access在消息队列上订阅收到的消息事件,这样可以告诉wpf窗口关闭和用户完成的时间。 这是为了使用strangler模式逐步替换旧访问应用程序中的功能。

这里有一些驱动所有内容的queuelistener代码。从消息中反序列化各种pop类,并将其构建为访问中的字符串。

internal class QueueListener
{
    public const string qFromMadge = @".\private$\XXXXQ";
    public static string qToMadge = @".\private$\XXXXReturnQ";
    private MessageQueue mq;
    internal QueueListener()
    {
        try
        {
            SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
            SubscribeHandler();

            var mqSend = setUpQueue(qToMadge);
            mqSend.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.InnerException.Message);
        }
    }
    private MessageQueue setUpQueue(string qName)
    {
        MessageQueue q;
        if (MessageQueue.Exists(qName))
        {
            q = new MessageQueue(qName);
        }
        else
        {
            q = MessageQueue.Create(qName);
        }
        q.ResetPermissions();
        q.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Set);
        q.Purge();
        return q;
    }
    private void ReceiveMsgCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
    {
        MessageQueue mq = (MessageQueue)source;
        Message m = mq.EndReceive(asyncResult.AsyncResult);
        m.Formatter = new XmlMessageFormatter(new[] { "XXXX.Popaaaa, XXXX"
                                                    , "XXXX.Popbbbb, XXXXX"
                                                    , "XXXX.Popcccc, XXXX"
                                                    , "XXXX.Popdddd, XXXX"
        });

        ((BasePopView) m.Body).Pop();

        mq.BeginReceive();
    }

    public  void UnsubscribeHandler()
    {
        if (mq == null)
        {
            return;
        }
        mq.Close();
        mq.ReceiveCompleted -= new ReceiveCompletedEventHandler(ReceiveMsgCompleted);
        mq = null;
    }
    public  void SubscribeHandler()
    {
        if(mq != null)
        {
            return;
        }
        mq = setUpQueue(qFromMadge);
        mq.ReceiveCompleted += ReceiveMsgCompleted;
        mq.BeginReceive();
    }