`
qiezi
  • 浏览: 498703 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

COM接口IDL转换为D接口以及__uuidof实现。

    博客分类:
  • D
阅读更多
D语言里面,可以通过version(Windows)来兼容COM接口,不过对于__uuidof却没有相应实现。

原始COM接口定义类似这样(找个简单的):

[
    local,
    
object,
    uuid(594f31d0
-7f19-11d0-b194-00a0c90dc8bf)
]
interface IRpcChannelBuffer2 : IRpcChannelBuffer
{

    HRESULT GetProtocolVersion
    (
        [
in,out] DWORD *pdwVersion
    );
}

VC++中可通过__uuidof操作符来获取COM接口中的uuid“元”信息。

转换为D接口后代码如下:

version(Windows) {

interface IRpcChannelBuffer2 : IRpcChannelBuffer
{
    HRESULT GetProtocolVersion (DWORD
* pdwVersion);
}

}

失去了uuid信息。只要稍作修改,在转换时保存uuid,即可以模板来模拟实现__uuidof操作符。

import std.c.windows.com;
import std.
string;
import std.stdio;

private:

template HexStrToUbyte(
char[] str)
{
    
const ubyte HexStrToUbyte = cast(ubyte)HexStrToUlong!(str);
}

template HexStrToUshort(
char[] str)
{
    
const ushort HexStrToUshort = cast(ushort)HexStrToUlong!(str);
}

template HexStrToUint(
char[] str)
{
    
const uint HexStrToUint = cast(uint)HexStrToUlong!(str);
}

template HexStrToUlong(
char[] str)
{
    
static if (str.length == 1)
        
const ulong HexStrToUlong = HexToUbyte!(str[0..1]);
    
else
        
const ulong HexStrToUlong 
            
= HexToUbyte!(str[length-1..length]) 
              
+ 16UL * HexStrToUlong!(str[0..length-1]);
}

private:

template HexToUbyte(
char[] c)
{
    
static if (c[0>= '0' && c[0<= '9')
        
const ubyte HexToUbyte = c[0- '0';
    
else static if (c[0== 'A' || c[0== 'a')
        
const ubyte HexToUbyte = 0xa;
    
else static if (c[0== 'B' || c[0== 'b')
        
const ubyte HexToUbyte = 0xb;
    
else static if (c[0== 'C' || c[0== 'c')
        
const ubyte HexToUbyte = 0xc;
    
else static if (c[0== 'D' || c[0== 'd')
        
const ubyte HexToUbyte = 0xd;
    
else static if (c[0== 'E' || c[0== 'e')
        
const ubyte HexToUbyte = 0xe;
    
else static if (c[0== 'F' || c[0== 'f')
        
const ubyte HexToUbyte = 0xf;
}

template HexToUbyte_bug(
char c)
{
    
static if (c >= '0' && c <= '9')
        
const ubyte HexToUbyte1 = c - '0';
    
else static if (c == 'A' || c == 'a')
        
const ubyte HexToUbyte1 = 0xa;
    
else static if (c == 'B' || c == 'b')
        
const ubyte HexToUbyte1 = 0xb;
    
else static if (c == 'C' || c == 'c')
        
const ubyte HexToUbyte1 = 0xc;
    
else static if (c == 'D' || c == 'd')
        
const ubyte HexToUbyte1 = 0xd;
    
else static if (c == 'E' || c == 'e')
        
const ubyte HexToUbyte1 = 0xe;
    
else static if (c == 'F' || c == 'f')
        
const ubyte HexToUbyte1 = 0xf;
}

template IIDFromStr(
char[] str)
{
    
const IID IIDFromStr = {
        HexStrToUint
!(str[0..8]),
        HexStrToUshort
!(str[9..13]), 
        HexStrToUshort
!(str[14..18]),
        [
          HexStrToUbyte
!(str[19..21]),
          HexStrToUbyte
!(str[21..23]), 
          HexStrToUbyte
!(str[24..26]),
          HexStrToUbyte
!(str[26..28]), 
          HexStrToUbyte
!(str[28..30]),
          HexStrToUbyte
!(str[30..32]), 
          HexStrToUbyte
!(str[32..34]),
          HexStrToUbyte
!(str[34..36])
        ]
    };
}

template __uuidof(T:IUnknown)
{
    IID __uuidof 
= IIDFromStr!("00000000-0000-0000-C000-000000000046");
}

template __uuidof(T:IClassFactory)
{
    IID __uuidof 
= IIDFromStr!("00000001-0000-0000-C000-000000000046");
}


void main()
{
    IID iu  
= __uuidof!(IUnknown);
    IID icp 
= __uuidof!(IClassFactory);

    writefln(iu.Data1);
    writefln(iu.Data2);
    writefln(iu.Data3);
    writefln(iu.Data4);
}

如上面代码,接口在转换时,把:

[
    local,
    
object,
    uuid(594f31d0
-7f19-11d0-b194-00a0c90dc8bf)
]
interface IRpcChannelBuffer2 : IRpcChannelBuffer
{

    HRESULT GetProtocolVersion
    (
        [in,out] DWORD *pdwVersion
    );
}


转换为:

template __uuidof(T:IRpcChannelBuffer2)
{
    IID __uuidof 
= IIDFromStr!("594f31d0-7f19-11d0-b194-00a0c90dc8bf");
}
version (Windows) {

interface IRpcChannelBuffer2 : IRpcChannelBuffer {
    HRESULT GetProtocolVersion (DWORD
* pdwVersion);
}

}

即可,这个可以交由自动化工具完成。

由于__uuidof模板值在编译期决议,没有实际的运行期开销。
分享到:
评论

相关推荐

    IDL编程实现图像处理.rar_IDL界面程序_IDl_grayset_编程实现

    最后,从“压缩包子文件的文件名称列表”来看,我们只有一个名为“IDL编程实现图像处理.txt”的文本文件。这个文件很可能是源代码,其中包含了上述所有功能的实现。用户可能需要使用IDL环境来编译和运行这段代码,以...

    idl3d.rar_IDL建模_idl 三维_idl3d_三维可视化

    “idl_三维”和“三维可视化”则进一步明确了idl3d在三维领域的应用。在科学数据中,三维可视化对于理解和沟通至关重要。idl3d不仅能够生成静态的三维图像,还支持动态交互,用户可以通过鼠标操作实时改变视角,探索...

    idl_function.zip_IDL数学函数_IDl_idl convol_idl function_idl中functio

    4. "envi2tif.pro":此文件可能实现了将ENVI格式的数据转换为TIFF(Tagged Image File Format)格式的功能。TIFF是一种通用的图像存储格式,广泛支持多种软件,使得数据共享和处理更加方便。 5. "gui1huatest.pro...

    maskimg_byevf.zip_IDL投影_IDL投影变换批处理_IDl_批处理 IDL

    IDL中的投影变换涉及到将具有某种投影方式的地图数据转换为另一种投影方式。这在处理遥感图像、地形数据或任何基于地理位置的数据时非常常见,因为不同来源的数据可能采用不同的投影标准。例如,一个项目可能需要将...

    IDL_GUI.zip_GUI编程_IDL gui_IDL参数设置_IDl_IDl 界面

    本篇将深入探讨如何利用IDL进行GUI编程,包括IDL GUI的基本概念、idl参数设置以及如何构建一个简单的IDL界面。 首先,我们需要理解IDL GUI编程的核心思想。IDL GUI允许开发者通过定义控件和事件处理函数来创建用户...

    ndvi.rar_IDL波段计算_IDL计算NDVI_IDl_NDVI_植被指数

    根据提供的压缩包子文件名称列表,有一个名为“新建文件夹”的目录,可能包含了IDL脚本、数据样本、说明文档或其他辅助材料。这些文件可能包括了原始遥感图像数据、已处理的数据结果,或者用于演示如何在IDL环境中...

    idl_read_txt_IDl_txt转栅格数据_

    标题"idl_read_txt_IDl_txt转栅格数据_"指的是使用IDL语言将TXT文件转换为栅格数据的过程。TXT文件通常包含二维数组的数据,可能来源于各种科学研究或遥感应用。在GIS中,这些数据经常需要被转化为栅格数据结构,以...

    Default_大气校正_IDL大气校正_IDl_IDL辐射定标_

    IDL作为一个强大的数据处理和分析工具,提供了与ENVI接口的便利,能够调用ENVI中的大气校正算法,如FLAASH(Fast Line-of-sight Atmospheric Analysis of Spectral Hypercubes)或6S模型。 在“fushedingbiao.pro”...

    IDL-IDLBridge.rar_IDL bridge_IDL-IDLBridge_idl bridge_idl 并行_ra

    本文主要介绍怎么在IDL平台上利用IDLBridge对象和SHVAR/SHMAP(共享内存)充分利用单机多核的计算资源,让平常单机单核串行IDL计算,转为高效单机多核并行计算。

    idl.zip_IDl_TVDI_TVDI代码_干旱指数TVDI的IDL实现代码

    标题中的“idl.zip_IDl_TVDI_TVDI代码_干旱指数TVDI的IDL实现代码”表明这是一个关于使用IDL(Interactive Data Language)编程语言实现干旱指数TVDI(Thornthwaite-Van Dijk Index)的代码库。TVDI是一种用于评估...

    idl界面事件处理程序.zip_IDL界面程序_IDl_idl界面事件_idl界面函数_idl程序 教学示例

    通过学习,你可以掌握如何利用IDL设计交互式的图形用户界面,包括创建界面元素、管理界面事件以及定义自定义的过程和函数。 1. IDL界面程序设计: 在IDL中,我们可以使用`WIDGET`系列的函数来创建各种用户界面组件...

    IDL与C#的数据传递方法研究COM_IDL_CONNECT

    COM_IDL_connectLib.COM_IDL_connectClass oCom = new COM_IDL_connectLib.COM_IDL_connectClass(); // 初始化 oCom.CreateObject(0, 0, 0); ``` 这里,`CreateObject`方法接收三个整型参数,分别代表不同的初始化...

    ASTER.rar_IDL aster投影_IDl_aster_idl c_反演

    IDL aster投影_IDl_aster_idl c_反演”表明这是一个关于使用IDL(Interactive Data Language)处理ASTER(Advanced Spaceborne Thermal Emission and Reflection Radiometer)遥感影像,进行特定的投影操作以及温度...

    ENVI-idl.rar_IDl_envi_envi idl开发_envi IDL

    本压缩包"ENVI-idl.rar_IDl_envi_envi idl开发_envi_idl"包含了已经调试好的ENVI-IDL程序,意味着用户可以立即使用这些代码来快速进行图像处理任务,而无需从头编写或调试。 1. **ENVI-IDL基础**:ENVI-IDL结合了...

    dem_data.zip_IDL dem_IDl_WGS 84_dem 坐标_dem的utm投影

    标题中的"dem_data.zip_IDL dem_IDl_WGS 84_dem 坐标_dem的utm投影"揭示了几个关键的IT概念,主要是与地理信息系统(GIS)和数据处理相关的。IDL(Interactive Data Language)是一种强大的编程语言,常用于科学数据...

    IDL.rar_IDL平滑处理_hants_idl变化监测_植被_谐波分析

    标题中的"IDL.rar_IDL平滑处理_hants_idl变化监测_植被_谐波分析"指出,这个压缩包包含的是使用IDL实现的关于时间序列平滑处理和植被变化监测的程序代码,特别提到了HANTS(Harmonic Analysis of Time-Series)算法...

    read_tmi_averaged_v4.rar_idl read_idl tmi_idl读取tif_read_tmi_aver

    本文将详细讨论如何使用IDL(Interactive Data Language)来读取和处理TMI(TMI, Tropical Rainfall Measuring Mission)传感器数据,并将其转换为常见的地理空间格式——TIFF(Tagged Image File Format)。...

    IDL.rar_IDl_doc_idl入门教程

    对学习IDL有很大的帮助,IDL入门教程一.doc,IDL入门教程二(上)(简单图形显示II).doc,IDL入门教程二(下)(简单图形显示I).doc,IDL入门教程三(上).doc,IDL入门教程三(下).doc,IDL入门教程四(图形显示技术).doc,IDL入门...

Global site tag (gtag.js) - Google Analytics