社区
ATL
帖子详情
结构体参数问题(期待高手。。。)
枫桦沐阳
2011-03-03 07:46:51
MFC制作的Activex控件。
我想在里边自定义一个结构体作为传出传入的参数,应该怎么做?
我在idl里边加入了结构体的定义,编译也通过,导入到程序里边后,
导入的头文件里边,参数型变成了结构类型的名字,但是自己却不识别,导致编译也不通过。
如何解决这个问题?
...全文
221
13
打赏
收藏
结构体参数问题(期待高手。。。)
MFC制作的Activex控件。 我想在里边自定义一个结构体作为传出传入的参数,应该怎么做? 我在idl里边加入了结构体的定义,编译也通过,导入到程序里边后, 导入的头文件里边,参数型变成了结构类型的名字,但是自己却不识别,导致编译也不通过。 如何解决这个问题?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
云博士的AI课堂
2011-03-05
打赏
举报
回复
如果是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
打赏
举报
回复
导出的结构体必须写在头文件里啊
开始学习Scheme
其实这里也隐含了一个计算环境的
问题
,那就是函数定义的计算环境。 Closure的示例如下: (define closure-demo (let ((y 5)) (lambda (x) (set! y (+ y x)) y) ) ) 这里使用了set!,因此其封装了一个状态,即...
C/C++、OS、网络面经
结构体
的sizeof涉及到字节对齐
问题
为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。 字节对齐的细节和编译器的实现相关,但一般而言,满足三个准则: 1) ...
卓越的教练是如何训练
高手
的
卓越的教练是如何训练
高手
的? 编者按:我们知道,优秀的运动员除了自身的天赋和努力之外,出色的教练必不可少。一个成功的企业除了拥有出类拔萃的员工之外,同样需要一位出色的教练,那就是企业的CEO。...
SpringBoot 如何统一后端返回格式?
高手
都是这样玩的
“ SpringBoot集成
参数
校验请参考这篇文章SpringBoot开发秘籍 - 集成
参数
校验及高阶技巧 ” 如何实现全局异常处理器 @Slf4j @RestControllerAdvice public class RestExceptionHandler { /** * 默认全局异常处理。...
【C语言内功篇】深度剖析数据在内存中的储存
本篇文章介绍了整型和浮点型的存储,
结构体
类型,指针类型等,将在后面持续更新内功篇,内功的修炼,任重而道远,只要大家坚持学习,厚积薄发,必定成为“武林
高手
”,
期待
与君顶峰相见。
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章