zoukankan      html  css  js  c++  java
  • 如何修复.Net和COM之间枚举名称的问题

    由于在.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了。

  • 相关阅读:
    对html与body的一些研究与理解
    关于文字内容溢出用点点点(...)省略号表示
    CSS3中border-image属性详解
    从TCP协议的原理来谈谈rst复位攻击
    关于Oracle中sysoper这个系统权限的问题
    翻翻git之---有用的欢迎页开源库 AppIntro
    椒盐噪声
    Codeforces Beta Round #1 A. Theatre Square
    log4j:WARN Please initialize the log4j system properly解决的方法
    微信平台开发——日历服务
  • 原文地址:https://www.cnblogs.com/LazyBee/p/1916246.html
Copyright © 2011-2022 走看看