惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

博客园 - 懒蜜蜂

身份证校验规则 [转]扩展jQuery easyui datagrid增加动态改变列编辑的类型 在IIS 5.1/6上以FastCGI方式安装 PHP 如何修复.Net和COM之间枚举名称的问题(续) 通过修改IP/TCP包头伪造IP来与网页进行交互 Compiling and Registering a Type Library Objective-C札记二-- Iphone中关于Layer的opaque属性 Xcode配置SVN作为版本控制 Emacs快捷键 Objective C中的札记--字符串连接,@selector中的冒号,时间转换,局部变量 使用GDataXML的设置 IPhone Exec_Bad_Access问题解决办法 C#版的AMF消息封装 Javascript中暂停功能的实现 - 懒蜜蜂 - 博客园 数据库基础理论--关系模式及范式 函数依赖(转) 数据库基础理论之--超键 候选键 主键 拷贝VMWare虚机(XP操作系统)之后网络不通
如何修复.Net和COM之间枚举名称的问题
懒蜜蜂 · 2010-12-24 · via 博客园 - 懒蜜蜂

由于在.Net中的枚举在通过regasm(如:Regasm PCTSEventLog.dll /t )生成tlb文件并注册的时候,会自动在枚举名称前面加上枚举的类型名称然后加上下划线,例如:

enum {
        Connect = 1,
        Amelior = 2,
        DailyLogs = 3,
        Maint = 4,
        HL7PatientMatching = 5,
        Secretary = 6,
        Misc = 7,
        SubmittedOrders = 8
    } dwEventLogCategories;

在自动生成tlb时,会变成:

enum {
        dwEventLogCategories_Connect = 1,
        dwEventLogCategories_Amelior = 2,
        dwEventLogCategories_DailyLogs = 3,
        dwEventLogCategories_Maint = 4,
        dwEventLogCategories_HL7PatientMatching = 5,
        dwEventLogCategories_Secretary = 6,
        dwEventLogCategories_Misc = 7,
        dwEventLogCategories_SubmittedOrders = 8
    } dwEventLogCategories;

如果我们是对已有的系统进行升级的时候就不得不修改我们原有的旧代码了。如果是多个小组一起开发的话,这也会存在一些问题。但是我们可以通过修改tlb的方法,来达到不修改原有代码。

方法的原理就是:从.net的dll中导出tlb文件,然后根据tlb文件导出idl文件,我们然后通过midl将idl文件编译成tlb文件,再在目标系统注册tlb就完成了。

下面我们就一步一步来完成这个过程:

1 利用以下命令导出tlb文件(tlbexp和regasm的区别就是,regasm会导出之后并注册tlb文件):

@ehco Off

set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"

%binDir%\tlbexp PCTSEventLog.dll

Pause

2 打开ole view,选择File->TypeLib view…,然后打开刚才生成的tlb文件,打开之后Save As为idl文件

3 打开idl文件,去掉tlbexp自动增加的枚举类型名(如:dwEventLogCategories_),改成下面这个样子并保存,注意红色的地方,如果不加红色的地方,那么idl会生成一个诡异的枚举名称:

enum dwEventLogCategories{
        Connect = 1,
        Amelior = 2,
        DailyLogs = 3,
        Maint = 4,
        HL7PatientMatching = 5,
        Secretary = 6,
        Misc = 7,
        SubmittedOrders = 8
    } dwEventLogCategories;

4 先运行vcvarsall.bat(%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86)来设置.net的环境变量,然后再运行下面的命令:

@echo off

set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"

%binDir%\MIDL PCTSEventLog.idl

Pause

5 注册刚刚生产的tlb文件

regtlib PCTSEventLog.tlb

好了,你大功告成了,在VB6或者其他环境中调用看看,是不是ok了。