传递命令行参数传递给在WPF项目COM组件

问题描述:

因此,这里的设置:传递命令行参数传递给在WPF项目COM组件

  • C#WPF主要项目使用XAML的布局

  • 我们有一个古老的MFC ActiveX/COM组件需要使用

    CCommandLineInfo cmdInfo; 
    ParseCommandLine(cmdInfo); 
    

    获取命令行参数并基于它们进行操作。 这老项目不能改变 :(

  • Windows窗体类库项目来包装COM组件

该组件被添加到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(); 
    } 
+0

你在问你的COM组件的接口是什么。这是恕我直言,愚蠢。你是那个坐在那个信息上的人。 –

+0

这是无益的。我知道我想传递给COM组件的字符串。我不知道如何通过它。就像我说的那样,它会在独立的情况下从命令行参数中读取它。 我需要填充COM组件中的CCommandLineInfo.m_strFileName字段才能使其工作。 –

+3

这是一个COM .exe或COM .dll吗?如果是.exe,也许你可以通过自己的进程(你可以指定你想要的任何命令行)来启动COM对象,然后使用GetObject(而不是CreateObject)来获取实例。 –

只要你正在做的事情是疯了...你可以:

一个新的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