作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何从 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/
我是一名优秀的程序员,十分优秀!