.NET与COM交互问题

d12ai 2004-02-15 08:11:16
我用VC(ATL)做了一个组件,接口方法需要传入一个自定义结构NJReportData的数组,方法内部要修改传入的参数,
数组通过安全数组传递,安全数组封装在VARIANT指针参数中,在c++builder中调用没问题,但在C#中参数可正
常传入,但传出时报指定的记录无法映射到托管值类的错,IDL文件如下:
// GoldFormula.idl : IDL source for GoldFormula.dll
//

// This file will be processed by the MIDL tool to
// produce the type library (GoldFormula.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(4A90BA68-C7A9-48C1-A9FE-AAD219743EFB),
dual,
helpstring("ICFormula Interface"),
pointer_default(unique)
]
interface ICFormula : IDispatch
{
[id(1), helpstring("方法GetNJReportData用来取得报表数据")] HRESULT GetNJReportData(VARIANT * pNJReportData);
};

[
uuid(B430864B-EC7E-420A-9F7A-0F958968CE69),
version(1.0),
helpstring("GoldFormula 1.0 Type Library")
]
library GOLDFORMULALib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(EFCCCC4A-71AC-40A3-B694-72CA2E3DA241),
helpstring("CFormula Class")
]
coclass CFormula
{
[default] interface ICFormula;
};
[ uuid(6E286022-8B31-428f-88C6-09DABBA2F722)]
struct NJReportData
{
ULONG FormulaRowNo; //公式所在行号
ULONG FormulaColumnNo; //公式所在列号
BSTR Formula; //公式串
ULONG DataRowNo; //数据所在行号
ULONG DataColumnNo; //数据所在列号
USHORT ValueType; //数据值类型
BSTR StringValue; //串类型数据值
DOUBLE NumericValue; //数值类型数据值
};
};
C#调用代码如下:
using GOLDFORMULALib;
CFormula cf = new CFormula();
string sFormula0 = "N R: C 0 T 1 I cskm1 A 320500 O 01001 F field1 D 0 200402";
string sFormula1 = "N R: C 0 T 1 I cskm2 A 320500 O 01001 F field1 D 0 200402";
string sFormula2 = "N R: C 0 T 1 I cskm3 A 320500 O 01001 F field1 D 0 200402";
NJReportData[] arrNJRD = new NJReportData[3];
arrNJRD[0].FormulaRowNo = 1;
arrNJRD[0].FormulaColumnNo = 4;
arrNJRD[0].Formula = sFormula0;
arrNJRD[1].FormulaRowNo = 12;
arrNJRD[1].FormulaColumnNo = 45;
arrNJRD[1].Formula = sFormula1;
arrNJRD[2].FormulaRowNo = 123;
arrNJRD[2].FormulaColumnNo = 456;
arrNJRD[2].Formula = sFormula2;
object arrObject = arrNJRD;
cf.GetNJReportData(ref arrObject);
求高手们指点如何处理(不改变接口),我也修改过.il文件中的类型映射,但都无效,我想主要
原因是自定义结构在.net中是值类型,因为我也试过在C#中自定义一个类,将该类的数组转换成object
传入接口,不报错。
...全文
35 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧