我甲肝创建了一个COM为及部件在C#中的一些显示方法返回一个字符串列表
如下所示。 以V ++我甲肝使用的std :: LST捕捉从详细显示(),但它的返回值
让编译器错误详细显示不是类的成员。 我让我的返回类型为void然后
它工作正常。 我可以修改,以便详细显示返回主(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;
}
}
编译和创建Test.dll的成功,也test.tlb。 现在在是用C ++的main函数
#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();
}
什么是错在我的代码,当我尝试编译该它显示
“详细显示”:不TESTLIB的成员:ITEST
如何解决这个plz帮助我....当我让它在类返回类型为void它工作正常。什么错误,我没有????
这恰恰是行不通的,即使你修复错别字。 COM互操作并没有从标准映射List<T>
在COM的东西,它肯定不会映射它std::list
。 泛型是不允许出现在COM接口。
UPDATE
我尝试使用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" };
}
}
所以,我有我自己的(非常简单)字符串集合接口。 请注意,我StringCollection
类没有定义Count
属性,因为它继承了一个非常好的从List<string>
。
然后,我有这个在C ++方面:
#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;
}
我必须手动复制字符串收集正确的C ++标准集装箱的内容,但它的工作原理。
有可能是一种方式来获得从标准的集合类正确类型的信息,所以你不必让自己的集合接口,但如果没有,这应该成为没关系。
或者,你有没有看过C ++ / CLI? 这将起到很好的无缝连接,但它仍然不会CLR集自动转换为STD容器。
有看起来像有几个错别字。 在C#中声明了一个名为TESTLIB类,但正在努力构建一个TestCls。 此外,无论是类不是方法都是公开的(其应该是一个编译错误至少在详细显示,由于接口必须被公开实现)。