结构体参数问题(期待高手。。。)

枫桦沐阳 2011-03-03 07:46:51
MFC制作的Activex控件。
我想在里边自定义一个结构体作为传出传入的参数,应该怎么做?

我在idl里边加入了结构体的定义,编译也通过,导入到程序里边后,
导入的头文件里边,参数型变成了结构类型的名字,但是自己却不识别,导致编译也不通过。
如何解决这个问题?
...全文
221 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果是c++之间调用是可以使用自己定义的类型,如果是其他程序调用必须是标准类型,你这种情况可以将struct类型强制转为BSTR类型,然后再转回就行了,也很简单。
ysjyniiq 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ynb119 的回复:]
引用 5 楼 ysjyniiq 的回复:
只需要在IDL定义,如果你的CPP编译不过去,把IDL编译生成的头文件include进去就行了。
typedef
[
uuid(C21871A0-33EB-11D4-A13A-BE2573A1120F),
version(1.0),
]
struct __MyStruct{
BSTR Name;
long Value;
VARIANT ……
[/Quote]
你外部是什么语言?如果是VBS,JS,用在网页上的,那么sorry了,它们只认IDispatch。
如果是VC,那好说,#import进来就行了,编译器会生成一个中间的代码文件,我忘了叫什么名字,你打开那个文件,应该有这个结构体的定义。

所以如果你想让那些脚本语言能用的话,建议将结构体换成对象,COM对象,然后COM对象带有属性
在JS可以这样用
var data=myActiveX.GetFakeStruct();
data.Value=100;
。。。
枫桦沐阳 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oyljerry 的回复:]
一般用VARIANT等安全数组类型来代替结构体等..比较适合COM接口
[/Quote]

我也觉得是,但我觉得转来转去麻烦。
能不能先告诉我,怎么直接用struct
oyljerry 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ynb119 的回复:]

引用 5 楼 ysjyniiq 的回复:
只需要在IDL定义,如果你的CPP编译不过去,把IDL编译生成的头文件include进去就行了。
typedef
[
uuid(C21871A0-33EB-11D4-A13A-BE2573A1120F),
version(1.0),
]
struct __MyStruct{
BSTR Name;
long Value;
VARIANT……
[/Quote]
一般用VARIANT等安全数组类型来代替结构体等..比较适合COM接口
枫桦沐阳 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ysjyniiq 的回复:]
只需要在IDL定义,如果你的CPP编译不过去,把IDL编译生成的头文件include进去就行了。
typedef
[
uuid(C21871A0-33EB-11D4-A13A-BE2573A1120F),
version(1.0),
]
struct __MyStruct{
BSTR Name;
long Value;
VARIANT Special;
}MyStruct……
[/Quote]

我也是这么做的。都这么做么?那wizard也太不智能了。大家都这么做么。。。

那结构体怎么导出呢,结构体在activex内部算是识别了,

但怎么也让外边认识它呢? 因为我想用用这个结构体类型作为参数。
枫桦沐阳 2011-03-04
  • 打赏
  • 举报
回复
嗯,对啊。不符合COM规范,但想想也符合逻辑。
我估计只能在支持指针的语言里使用了。还得是组件内COM。

java之类的,得想其他办法了。

ysjyniiq 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ynb119 的回复:]
我用的是VC。

现在我直接在应用程序里定义相同的构造体,直接把指针转化成VARIANT*传过去用了。

还真好用。看来默认MFC做的这个不需要序列化了。。。
[/Quote]
“直接把指针转化成VARIANT*传过去用了”,直接把指针强制类型转换??
这个做法,好像不符合COM规范吧,估计也只就只能在VC能用,C#,delphi估计是用不了。
枫桦沐阳 2011-03-04
  • 打赏
  • 举报
回复
我用的是VC。

现在我直接在应用程序里定义相同的构造体,直接把指针转化成VARIANT*传过去用了。

还真好用。看来默认MFC做的这个不需要序列化了。。。

ysjyniiq 2011-03-03
  • 打赏
  • 举报
回复
只需要在IDL定义,如果你的CPP编译不过去,把IDL编译生成的头文件include进去就行了。
typedef
[
uuid(C21871A0-33EB-11D4-A13A-BE2573A1120F),
version(1.0),
]
struct __MyStruct{
BSTR Name;
long Value;
VARIANT Special;
}MyStruct;
枫桦沐阳 2011-03-03
  • 打赏
  • 举报
回复
正好问一个问题。我在idl里边定一个enum,编译却不识别,我只好把idl.h头文件也包含进来。

难道这个问题也不是这么解决么?
枫桦沐阳 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
你定义的结构,必须让调用的地方能够识别.只在idl中定义行吗?
[/Quote]

难道要idl里边定义一遍,工程里的头文件再定义一遍相同的?
快乐鹦鹉 2011-03-03
  • 打赏
  • 举报
回复
你定义的结构,必须让调用的地方能够识别.只在idl中定义行吗?
zzz_zou 2011-03-03
  • 打赏
  • 举报
回复
导出的结构体必须写在头文件里啊

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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