Cut*_*ute 4 c# c++ com visual-c++
我在C#中为一些Display方法创建了一个com组件,它返回一个String List
如下所示.在v ++中,我使用std :: lst来捕获Disp()的返回值但是它
给出编译器错误,Disp不是类的成员.我将返回类型设为void
它工作正常.什么我可以修改,以便Disp返回一个List和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;
}
}
Run Code Online (Sandbox Code Playgroud)
编译并创建了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();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我的代码出了什么问题
'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" };
}
}
Run Code Online (Sandbox Code Playgroud)
所以我有自己的(非常简单的)字符串集合接口.请注意,我的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;
}
Run Code Online (Sandbox Code Playgroud)
我必须手动复制字符串集合的内容一个适当的C++标准容器,但它的工作原理.
有可能是一种方式来获得从标准的集合类正确类型的信息,所以你不必让自己的集合接口,但如果没有,这应该成为没关系.
或者,你看过C++/CLI吗?虽然它仍然不会自动将CLR集合转换为std容器,但它可以非常无缝地工作.