• 如何修复.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了。

  • 相关阅读:
    Spring Boot下的一种导入Excel文件的代码框架
    Spring Boot下的一种导出CSV文件的代码框架
    Spring Boot下的一种导出Excel文件的代码框架
    使用系统参数表,提升系统的灵活性
    折纸效果! Cocos Creator 3.0
    弹性跟随相机!3D入门教程!
    dotnet OpenXML 读取 PPT 主序列进入退出强调动画
    dotnet C# 调用委托的 GetInvocationList 的对象分配
    WPF 下拉框选项做鼠标 Hover 预览效果
    WPF 后台代码做 TranslateTransform 的动画
  • 原文地址:https://www.cnblogs.com/LazyBee/p/1916246.html
Copyright © 2020-2023  润新知