将命令行参数传递给WPF项目

时间:2016-07-23 00:40:31

标签: c# c++ wpf xaml mfc

所以这是设置:

  • 使用xaml进行布局的C#WPF主项目

  • 我们有一个古老的MFC activeX / COM组件,可以使用

    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    

    获取命令行参数并基于它们进行操作。 此旧项目无法更改 :(

  • 用于包装COM组件的Windows窗体类库项目。

组件被添加到xaml视图中,如下所示:

var host = new WindowsFormsHost();
var activeX = new Viewer();
host.Child = activeX;
var grid = new Grid();            
grid.Children.Add(host);
Content = grid

如何传递"命令行参数" COM组件在执行ParseCommandLine(cmdInfo);

时会接收到它

更新

我的winform使用:private AxPLUGINXLib.AxPluginX axPluginX1;

下面定义了类。仍然不确定如何将命令行参数传递给它。

    [Clsid("{9ab948c6-b1a9-11d2-ac9b-0040c72d55ed}")]
    [DesignTimeVisible(true)]
    public class AxPluginX : AxHost
    {
        public AxPluginX();

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [DispId(-525)]
        public virtual int ReadyState { get; }

        public event _DPluginXEvents_ReadyStateChangeEventHandler ReadyStateChange;

        public virtual void AboutBox();
        protected override void AttachInterfaces();
        protected override void CreateSink();
        protected override void DetachSink();
    }

1 个答案:

答案 0 :(得分:2)

只要你做一些疯狂的事情......你可以:

向您的解决方案添加新的C ++ / CLI项目:Visual C ++ - > CLR - >班级图书馆。

然后将一个函数添加到C ++ / CLI类中,如下所示:

#pragma once

#include <cstdlib>
#include <vcclr.h>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace System;
using namespace System::Runtime::InteropServices;

std::vector<wchar_t> ArgBuffer(4096);
std::vector<wchar_t*> ArgTable;

namespace ManagedCpp {

    public ref class Class1
    {
    public:
        static void PassCommandLine(array<String^>^ args)
        {
            size_t totalChars = 0;
            for (int i = 0; i < args->Length; i++)
            {
                totalChars += args[i]->Length + 1; // include null-terminator
            }

            ArgBuffer.resize(totalChars);
            ArgTable.resize(args->Length);

            auto pDst = &ArgBuffer[0];

            for (int i = 0; i < args->Length; i++)
            {
                pin_ptr<const wchar_t> pStr = PtrToStringChars(args[i]);
                size_t len = args[i]->Length + 1; // include null-terminator

                std::copy_n(
                    static_cast<const wchar_t*>(pStr),
                    len,
                    stdext::make_checked_array_iterator(pDst, ArgBuffer.size())
                    );
                ArgTable[i] = pDst;
                pDst += len;
            }

            __wargv = &ArgTable[0];
            __argc = ArgTable.size();
        }
    };
}

然后,在调用ActiveX对象上的任何方法之前,请使用以下内容从C#应用程序中调用新函数:

ManagedCpp.Class1.PassCommandLine(new[] { "myArg1", "myArg2" });

这可以通过替换命令行参数的C运行时全局导出来实现。 ParseCommandLine()引用的相同全局变量。您可以在此处详细了解它们:https://msdn.microsoft.com/en-us/library/dn727674.aspx