#import的rename使用

本文介绍了解决VC++调用VB组件时遇到的成员函数重名问题的方法,通过使用#import指令的rename属性,成功实现了对特定成员函数的重命名,从而避免了编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import的rename使用

Author:zfive5(zidong)

Email :zfive5@yahoo.com.cn

由于工作的原因,需要编写一个vc的程序去调用vb编写的组件,本以为简单的很,但由于对方提供的组件里出现了类似下面的代码:

Public Function GetA() As String
   GetA = "hello wordl GetA"
End Function

Public Property Get A() As String
   A = "hello world A"
End Property

这让我冥思苦想半个多小时,因为在vc里如果用API方式调用组件的话,写上一大堆代码才能完成,而vb代码就如下:

Dim o1 as Object
set o1=CreateObject("ZFive5.ZClass")
o1.GetA()

所以决定用#import生成一个导出类,这样以来好多东西都不需要写了,但又出现如下的编译错误:

--------------------Configuration: test - Win32 Debug--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
test.cpp
testDlg.cpp
c:/program files/microsoft visual studio/myprojects/test/debug/zfive5.tlh(48) : error C2535: 'class _bstr_t __thiscall ZFive5::_ZClass::GetA(void)' : member function already defined or declared
        c:/program files/microsoft visual studio/myprojects/test/debug/zfive5.tlh(47) : see declaration of 'GetA'
c:/program files/microsoft visual studio/myprojects/test/debug/zfive5.tli(21) : error C2084: function 'class _bstr_t __thiscall ZFive5::_ZClass::GetA(void)' already has a body
Generating Code...
Error executing cl.exe.

test.exe - 2 error(s), 0 warning(s)

原因就是A属性的Get方法与GetA方法重名了,本来想看看是否能删掉用不到的调用声明,这样一来就可以规避重名的问题,但每次编译的时间又再一次的出现,看来这种方法不是最好的方法,此时想起了rename属性 (当然这也是ADO在#import时rename给我留有的印象) ,在vc的代码上加上如下代码:

#import "c:/zfive5.dll" rename("A","B")

最终相应的调用代码:

void CTestDlg::OnOK()
{
    // TODO: Add extra validation here
    //CDialog::OnOK();

    ::CoInitialize(NULL);
    {
        _ZClassPtr ptr;
        ptr.CreateInstance(L"ZFive5.ZClass");
        _bstr_t strH=ptr->GetA();//GetA方法 ,而得到属性为:_bstr_t strH=ptr->GetB();
        AfxMessageBox(strH);
    }
    ::CoUninitialize();
}

就这个rename使我开始了#import 的所有属性的研究:

The #import attributes are listed below:

auto_rename 
auto_search
embedded_idl  
exclude
high_method_prefix    
high_property_prefixes
implementation_only    
include() 
inject_statement   
named_guids
no_auto_exclude    
no_dual_interfaces
no_implementation    
no_namespace
no_search_namespace    
no_smart_pointers
raw_dispinterfaces    
raw_interfaces_only
raw_method_prefix    
raw_native_types
raw_property_prefixes    
rename
rename_namespace    
rename_search_namespace
tlbid

关于这些属性,详细的可以参见

http://msdn2.microsoft.com/en-us/library/8etzzkb6(VS.71).aspx#_predir_the_23import_directive_import_attributes
<think>好的,用户遇到了在C++项目中使用#import指令导入msado15.dll和msadox.dll时,出现error C2813: #import 不支持 /MP 的错误。需要解决这个问题。 首先,我需要理解这个错误的根本原因。根据引用[1],这个错误是因为在启用了/MP(多进程编译)选项的情况下,使用#import指令导致的兼容性问题。微软的编译器在处理#import时可能无法正确支持并行编译,因此需要调整编译设置。 接下来,解决方案可能涉及禁用特定文件的/MP选项。通常,Visual Studio允许对单个文件设置编译选项。因此,用户可以在项目属性中,找到MeasureControl.cpp文件,右键进入属性,在C/C++ -> 命令行中添加/MP-来禁用该文件的多进程编译。这样,整个项目其他文件仍然可以使用/MP加速编译,只有这个文件被排除。 此外,用户可能需要检查其他相关设置,比如确保头文件路径正确,或者是否有其他依赖项的问题。不过根据错误信息,主要问题在于/MP和#import的冲突,所以重点应放在禁用该文件的并行编译上。 最后,验证解决方案是否有效。用户修改后重新编译项目,如果错误消失,则说明方法正确。如果还有其他问题,可能需要进一步检查代码或项目配置。</think>### 解决 `error C2813: #import 不支持 /MP` 的步骤 #### 问题分析 在C++项目中,使用 `#import` 导入COM组件(如 `msado15.dll` 或 `msadox.dll`)时,若启用了 `/MP`(多进程编译)选项,编译器会报错 `error C2813`。这是因为 `#import` 生成的类型库代码在多线程编译时可能产生冲突[^1]。 #### 解决方法 1. **禁用特定文件的 `/MP` 选项** - 在Visual Studio中,右键点击报错的文件(如 `MeasureControl.cpp`),选择 **属性**。 - 进入 **C/C++ → 命令行**,在 **附加选项** 中添加 `/MP-`,强制禁用该文件的多进程编译。 - 此操作仅针对单个文件,不影响项目中其他文件的并行编译加速[^1]。 2. **全局禁用 `/MP`(不推荐)** - 若项目允许整体关闭并行编译,可在项目属性中: **C/C++ → 常规 → 多处理器编译** → 选择 **否**。 - 这会降低编译速度,仅建议临时调试使用。 #### 代码示例 若使用 `msado15.dll`,确保 `#import` 语句正确: ```cpp #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") ``` #### 验证 重新编译项目,若错误消失,则配置成功。若仍有问题,检查: - 类型库路径是否正确。 - 项目中是否存在其他依赖冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值