传递命令行参数传递给在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();
}
答
只要你正在做的事情是疯了...你可以:
一个新的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
你在问你的COM组件的接口是什么。这是恕我直言,愚蠢。你是那个坐在那个信息上的人。 –
这是无益的。我知道我想传递给COM组件的字符串。我不知道如何通过它。就像我说的那样,它会在独立的情况下从命令行参数中读取它。 我需要填充COM组件中的CCommandLineInfo.m_strFileName字段才能使其工作。 –
这是一个COM .exe或COM .dll吗?如果是.exe,也许你可以通过自己的进程(你可以指定你想要的任何命令行)来启动COM对象,然后使用GetObject(而不是CreateObject)来获取实例。 –