所以这是设置:
使用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();
}
答案 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