COM导入时的麻烦问题。在#import的时候出现一大堆的俄error,望各位COM高手指教

wkoji 2004-01-16 09:44:21
有谁知道在COM导入的时候,加上参数raw_interfaces_only到底是什么意思?
它会带来那些后果?
我在这么使用时很正常#import "c:\program files\common files\system\ado\msado15.dll" rename_namespace("ADOCT") rename("EOF", "adoEOF")

而加上raw_interfaces_only就一大堆的错误。
#import "c:\program files\common files\system\ado\msado15.dll" rename_namespace("ADOCT") rename("EOF", "adoEOF") raw_interfaces_only

我考虑了很久也找不到具体原因,望各位高手指教。
...全文
56 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
taianmonkey 2004-01-17
  • 打赏
  • 举报
回复
就是抑制在自己写的包装类中或使用__declspec(property) 声明时出现错误异常处理的作用!
taianmonkey 2004-01-17
  • 打赏
  • 举报
回复
dongfa(阿东) 已经说了raw_interfaces_only的用处!
wkoji 2004-01-17
  • 打赏
  • 举报
回复
up
wkoji 2004-01-17
  • 打赏
  • 举报
回复
前面这个问题我已经解决了,现在又跑出一个新的问题,这个好像更怪了:(
D:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\comip.h(732) : error C2227: '->QueryInterface' : 左側がクラス、構造体、共用体へのポインタではありません。
D:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\comip.h(364) : コンパイルされたクラスのテンプレートのインスタンス化 'int __thiscall _com_ptr_t<class _com_IIID<struct ADOCT::_Connection,&struct __s_GUID _GUID_00000550_0000_0010_8000_00aa006d2ea4> >::_Co
mpareUnknown(enum ADOCT::ObjectStateEnum)' の参照を確認してください
wkoji 2004-01-17
  • 打赏
  • 举报
回复
UP
wkoji 2004-01-17
  • 打赏
  • 举报
回复
我已经修正了大部分的函数调用,现在出现这个错误
d:\program files\microsoft visual studio\vc98\include\comip.h(74) : error C2451: 条件式の型 'const struct ADOCT::_Recordset' が間違っています。この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 d:\cybertrace\src\ctserver\ctado.cpp(1073) : されたのの化 '__thiscall _com_ptr_t<class _com_IIID<struct ADOCT::_Recordset,&struct __s_GUID _GUID_00000556_0000_0010_8000_00aa006d2ea4> >::_com_ptr_t<class _com_IIID<struc
t ADOCT::_Recordset,&struct __s_GUID _GUID_00000556_0000_0010_8000_00aa006d2ea4> >(const struct ADOCT::_Recordset &)' の参照を確認してください
还望各位指点,我实在不清楚怎么这个错误是怎么回事?
蒋晟 2004-01-16
  • 打赏
  • 举报
回复
去看导入产生的.tlh和.tli
wkoji 2004-01-16
  • 打赏
  • 举报
回复
请问dongfa(阿东),是不是所有的低级方法和属性都是带下划线的?如put_ConnectionTimeout,而所有的非低级属性和方法都是不带下划线的?如PutConnectionTimeout.
或者说,我怎么才能区分哪些是低级属性方法的我可以去调用,哪些不是的我不能去调用?
dongfa 2004-01-16
  • 打赏
  • 举报
回复
加上raw_interfaces_only之后,只能调用一些比较低级的方法和属性了。
例如只能调用 put_ConnectionTimeout,而不能调用PutConnectionTimeout了.

具体见msdn:
The raw_interfaces_only attribute
The raw_interfaces_only attribute suppresses the generation of error-handling wrapper functions and __declspec(property) declarations that use those wrapper functions.

The raw_interfaces_only attribute also causes the default prefix used in naming the non-property functions to be removed. Normally, the prefix is raw_. If this attribute is specified, the function names are directly from the type library.

This attribute allows you to expose only the low-level contents of the type library.
wkoji 2004-01-16
  • 打赏
  • 举报
回复
其实我的问题就是以下的:
我原来的用法是
#import "c:\program files\common files\system\ado\msado15.dll" rename_namespace("ADOCT") rename("EOF", "adoEOF")
应客户的要求改为
#import "c:\program files\common files\system\ado\msado15.dll" rename_namespace("ADOCT") rename("EOF", "adoEOF") raw_interfaces_only
后出了一大堆的错误。我首先是想解决问题,怎么让它不出错,想确定raw_interfaces_only的用法我是否正确了。其次,我想知道为什么要加上raw_interfaces_only参数,它能给我的程序带来什么好处?以及引入这个参数会对ADO的操作产生什么影响?比如说效率上还是稳定性上能有提高?为什么提高的?
葛俊在新泽西 2004-01-16
  • 打赏
  • 举报
回复
不加raw_interfaces_only的话,com就会为每个method加一层包装代码以处理异常。
除此以外不会有什么区别的。

还有你究竟是什么问题啊?把代码贴出来吧。

wkoji 2004-01-16
  • 打赏
  • 举报
回复
我想知道的是为什么要raw_interfaces_only,加上它有什么好处?调用更底层的接口是不是使COM的效率更高?
蒋晟 2004-01-16
  • 打赏
  • 举报
回复
raw_interfaces_only的影响上面不是有么
wkoji 2004-01-16
  • 打赏
  • 举报
回复
导入的.tlh和.tli太大啊,我没办法每一行查找下来。我只希望各位再次多给些关于raw_interfaces_only的信息,把它所产生的影响彻底搞清楚,免得头痛医头脚痛医脚。

3,245

社区成员

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

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