gpt4 book ai didi

c# - 如何从 c# 返回列表并通过 com 在 vc++ 中使用它

转载 作者:行者123 更新时间:2023-11-28 04:00:27 26 4
gpt4 key购买 nike

如何从 C# 方法返回 List 以及在 C++ 中使用 List 返回值 你能指导如何做吗?
我将按照我的完整方案进行操作:

在 c# DemoLib.cs 中

usng System;using System.Collections.Generic;

public interface IDiscover
{
void GetList1();
String GetList2();
List<string> GetList3();
};

namespace DemoLibrary

{

class DemoLib
{
public void GetList1()
{

Console.WriteLine(" I am from Void GetList()");

}
public string GetList2()
{

Console.WriteLine(" I am from string GetList()");

return "Stack OverFlow";

}

public List<string> GetList3()
{

List<string> li=new List<string>();

li.Add("India");
li.Add("America");
li.Add("London");

Console.WriteLine(" I am from List<string> GetList()");

return li;
}

构建成功并创建DemoLib.dll

我将 DemoLib.dll 复制到 c:\DemoLib.dll 并使用 regasm 在 c:\中创建了 Demolib.tlb

现在在 Vc++ 中我有 main()

DemoLibMain.vc++

#include<list>

#include<stdio.h>

void main()
{

HRESULT Hr=CoInitialize(NULL);

IDiscoverPtr Iptr(__uuidof(DemoLib));

Iptr->GetList1();

std::string str=Iptr->GetList2();

printf("%s",str); //dispalys "null" insted of "stack overflow" but when i debugging it

shows the value "stack overflow" at str.

Iptr->(害怕因为它没有给出 GetList3() )

当我强制编写 Iptr->GetList3() 时,它显示错误为

GetList3 is not a member of IDiscover;

最佳答案

我是用c#的对象类型做的

C# 导出为 COM

public void GetList(ref object list)
{
String[] dummy = { "1" };
Array.Resize(ref dummy, 3);
list = dummy;
}

原生 C++

_variant_t list;
GetList(list);
const VARTYPE type (static_cast<VARTYPE>(list.vt & VT_TYPEMASK));
const bool isArray (0 != (list.vt & VT_ARRAY));
const bool isVector(0 != (list.vt & VT_VECTOR));
if(isArray) {
SAFEARRAY* buffer = src.parray;
...
}

这里的问题是 vbscript 无法访问 SAFEARRAY。但对于大多数其他语言来说,这没有问题。

关于c# - 如何从 c# 返回列表并通过 com 在 vc++ 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036720/

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