如何将字符串集合从C#返回到C++;通过COM互操作

如何将字符串集合从C#返回到C++;通过COM互操作,c#,c++,visual-c++,com,C#,C++,Visual C++,Com,我已经为C语言中的某个显示方法创建了一个com组件,它返回一个字符串列表 如下图所示。在v++中,我使用std::lst从Disp()捕获返回值,但是 给出Disp不是类成员的编译器错误。我让a类退货无效 它很好用。我可以修改什么,以便Disp返回一个列表,在main(c++)中我必须使用 这个返回值 Public interface ITest { List<string> Disp(); } class TestLib:ITest { List<strin

我已经为C语言中的某个显示方法创建了一个com组件,它返回一个字符串列表

如下图所示。在v++中,我使用std::lst从Disp()捕获返回值,但是

给出Disp不是类成员的编译器错误。我让a类退货无效

它很好用。我可以修改什么,以便Disp返回一个列表,在main(c++)中我必须使用

这个返回值

Public interface ITest
{
    List<string> Disp();
}

class TestLib:ITest
{
    List<string> Disp()
    {
        List<string> li=new List<string>();
        li.Add("stack");
        li.Add("over");
        li.Add("Flow");

        return li;
    }
}
公共接口测试
{
List Disp();
}
类TestLib:ITest
{
列表Disp()
{
List li=新列表();
li.添加(“堆栈”);
li.添加(“超过”);
li.添加(“流量”);
返回李;
}
}
已成功编译并创建Test.dll和Test.tlb。 现在在用c编写的主函数中++

#include<list>
#import "..\test.tlb"
using namespace Test;
void main()
{
    HRESULT hr=CoInitialize(null);

    ITestPtr Ip(__uuidof(TestLib));

    std::list<string> li=new std::list<string>();

    li=Ip->Disp();
}
#包括
#导入“.\test.tlb”
使用名称空间测试;
void main()
{
HRESULT hr=协同初始化(null);
ITestPtr Ip(uu uuidof(TestLib));
std::list li=新的std::list();
li=Ip->Disp();
}
当我试图编译它时,我的代码中有什么错误

“Disp”:不是TestLib:ITest的成员


如何解决这个问题请帮助我…当我让它在类中返回类型为void时,它工作正常。我犯了什么错误???

猜测:Disp()未声明为public

看起来有几个拼写错误。在C#中,您声明了一个名为TestLib的类,但试图构造一个TestCls。此外,类和方法都不是公共的(这至少在Disp上应该是一个编译错误,因为接口必须公开实现)。

即使您修复了输入错误,这也行不通。COM互操作没有从
List
到COM中某个内容的标准映射,而且它肯定不会将其映射到
std::List
。COM接口中不允许出现泛型

更新

我尝试使用
ArrayList
作为返回类型,因为这是非泛型的,我认为
tlb
可能会包含它的类型信息。这不起作用,所以我尝试了
IList
。这也不起作用(import语句生成了一个
.tlh
文件,该文件引用了
IList
,但没有它的定义。)

因此,作为一种解决方法,我尝试声明一个简单的列表接口。代码的结尾如下所示:

[Guid("7366fe1c-d84f-4241-b27d-8b1b6072af92")]
public interface IStringCollection
{
    int Count { get; }
    string Get(int index);
}

[Guid("8e8df55f-a90c-4a07-bee5-575104105e1d")]
public interface IMyThing
{
    IStringCollection GetListOfStrings();
}

public class StringCollection : List<string>, IStringCollection
{
    public string Get(int index)
    {
        return this[index];
    }
}

public class Class1 : IMyThing
{
    public IStringCollection GetListOfStrings()
    {
        return new StringCollection { "Hello", "World" };
    }
}

我必须手动复制字符串集合的内容,这是一个正确的C++标准容器,但它是有效的。 可能有一种方法可以从标准集合类中获取正确的类型信息,因此您不必创建自己的集合接口,但如果不这样做,这就可以了


或者,您看过C++/CLI吗?这将非常无缝地工作,尽管它仍然不会自动将CLR集合转换为std容器。

List Disp()中有一个输入错误,“return str”应该是“return li”@Greco-Ah,这就是我在重新格式化代码时所担心的!嗨,可爱。下次你能把你的问题标题写得更清楚一点吗?:)@可爱-你试过我在回答中给出的代码了吗?我把它放在一个应用程序中,并为您进行了测试。如果你仍然有问题,为什么不尝试一下并做出回应呢?
#include "stdafx.h"
#import "..\ClassLibrary5.tlb"

#include <vector>
#include <string>

using namespace ClassLibrary5;

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(0);

    IMyThingPtr thing(__uuidof(Class1));

    std::vector<std::string> vectorOfStrings;

    IStringCollectionPtr strings(thing->GetListOfStrings());
    for (int n = 0; n < strings->GetCount(); n++)
    {
        const char *pStr = strings->Get(n);
        vectorOfStrings.push_back(pStr);
    }

    return 0;
}