gpt4 book ai didi

c# - 将命令行参数传递给 WPF 项目中的 COM 组件

转载 作者:行者123 更新时间:2023-11-28 02:03:14 26 4
gpt4 key购买 nike

所以这里是设置:

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

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

    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);

    获取命令行参数并根据它们进行操作。 不能更改这个旧项目 :(

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

组件像这样添加到 xaml View 中:

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

关于c# - 将命令行参数传递给 WPF 项目中的 COM 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38537033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com