2016-07-23 25 views
0

因此,這裏的設置:傳遞命令行參數傳遞給在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)來獲取實例。 –

回答

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