使用#import导入COM DLL后,VC++代码无法访问其中类型如何解决
解决方案
1. 优先排查命名空间引用问题
#import 指令默认会将COM类型库的所有类型封装到类型库预设的命名空间中,你可以打开生成的.tlh文件,开头就能找到类似的命名空间定义:
namespace AgLeaderFileLib { // 所有COM类型定义都在该命名空间下 }
如果未显式指定命名空间就直接引用类型,必然会触发C2065错误,可任选一种方式解决:
- 引用类型时带命名空间前缀:
AgLeaderFileLib::IYourInterface p; - 在
#import语句后增加命名空间引用:using namespace AgLeaderFileLib; - 测试场景下可以直接在
#import时加no_namespace参数取消命名空间封装(正式项目不推荐,容易出现名称冲突):#import "AgLeaderFile.dll" no_namespace
2. 确认是.tlh文件找不到的处理方案
如果排查后确定不是命名空间问题,确实是编译器无法定位生成的.tlh文件,不建议直接把$(TargetDir)加到附加包含目录,这种方式会导致多配置编译冲突、清理构建后文件引用异常等问题,推荐以下两种规范方案:
方案A:指定#import输出路径
在#import指令中通过output_directory参数指定生成的.tlh/.tli文件的固定存储路径,比如统一存放到项目下的专用生成目录:
#import "AgLeaderFile.dll" output_directory("$(ProjectDir)ComGenerated")
之后把$(ProjectDir)ComGenerated加到「项目属性→配置属性→C/C++→常规→附加包含目录」即可,该目录属于项目代码目录,不会随清理构建被删除,也不会出现多配置混用的问题。
方案B:添加中间目录到包含路径
如果你不想修改#import参数,VS默认会将#import生成的文件放到当前配置的中间目录(对应变量$(IntDir)),你只需要把$(IntDir)加到附加包含目录即可,比加$(TargetDir)更规范——中间目录本身就是存储编译阶段临时文件的位置,不同配置(Debug/Release、x86/x64)的$(IntDir)互相独立,不会出现引用错版本的问题。
补充说明:正常情况下#import执行完成后会自动隐式包含生成的.tlh文件,不需要手动编写#include语句引入,只要路径配置正确即可直接使用文件内定义的类型。
内容的提问来源于stack exchange,提问作者adv12
相关产品推荐
相关产品推荐

