- 浏览: 491108 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hypercube:
markin'
配置D语言编程环境 -
qiezi:
qiezi 写道yangyang_08 写道1 ...
我的编程语言学习经历 -
qiezi:
yangyang_08 写道1、现在如果做并发服务器,楼主选用 ...
我的编程语言学习经历 -
yangyang_08:
1、现在如果做并发服务器,楼主选用什么样的语言架构?2、lua ...
我的编程语言学习经历 -
dearplain:
我也是语言爱好者,不过我一直坚持使用c。
我的编程语言学习经历
D语言里面,可以通过version(Windows)来兼容COM接口,不过对于__uuidof却没有相应实现。
原始COM接口定义类似这样(找个简单的):
VC++中可通过__uuidof操作符来获取COM接口中的uuid“元”信息。
转换为D接口后代码如下:
失去了uuid信息。只要稍作修改,在转换时保存uuid,即可以模板来模拟实现__uuidof操作符。
如上面代码,接口在转换时,把:
转换为:
即可,这个可以交由自动化工具完成。
由于__uuidof模板值在编译期决议,没有实际的运行期开销。
原始COM接口定义类似这样(找个简单的):
[
local,
object,
uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
]
interface IRpcChannelBuffer2 : IRpcChannelBuffer
{
HRESULT GetProtocolVersion
(
[in,out] DWORD *pdwVersion
);
}
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);
}
}
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);
}
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);
}
}
{
IID __uuidof = IIDFromStr!("594f31d0-7f19-11d0-b194-00a0c90dc8bf");
}
version (Windows) {
interface IRpcChannelBuffer2 : IRpcChannelBuffer {
HRESULT GetProtocolVersion (DWORD* pdwVersion);
}
}
即可,这个可以交由自动化工具完成。
由于__uuidof模板值在编译期决议,没有实际的运行期开销。
发表评论
-
D语言模板和编译期执行
2012-07-29 00:15 0D语言模板继承了C++模板的基本用法,在其上做了相当多扩充,近 ... -
Generator
2008-04-09 13:46 1972几种并发编程模型开销(从大到小): Process > ... -
lambda之路...
2007-11-09 22:57 2836DMD最近的版本号加入了闭包,感觉非常有用,虽然有些背后动作, ... -
像Erlang一样写D程序
2007-09-15 10:23 6695琢磨了好久,一直没时间来做它。在讨论这个问题的时候就已经有这想 ... -
[D语言] qsort的尴尬
2007-05-06 21:31 5038phobos里面在stc.c.stdlib里提供了qsort, ... -
强类型数值计算
2007-04-10 21:45 4669以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇 ... -
简单的单元测试框架
2007-04-10 21:20 3111做了个简单的单元测试框架,只算个毛坯,遇到一些问题。 1、由 ... -
仿STL的vector,写了一组array操作方法。
2007-04-05 23:55 11938文档从MSDN抄过来的,稍稍改了一下。 module ar ... -
编译期执行的效率
2007-03-15 15:58 4178写了一个编译期执行的fibonacci模板: templ ... -
D语言编译期生成和编译期执行技术
2007-02-24 14:35 4089借助D语言新的mixin表达式,可以完成一些代码生成功能,比如 ... -
如何获得一个方法的名字?
2007-01-15 19:24 3454在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不 ... -
D语言的函数编程
2007-01-07 11:17 3813前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这 ... -
D语言和python的差异
2007-01-07 10:12 6509这2个语言的比较怪怪的,我最近转换了一些twisted的源文件 ... -
从简单测试看D数组内存分配策略
2007-01-07 09:43 3192D语言动态数组可以在运行期改变大小,这和C++的vector相 ... -
DMD 0.178发布
2006-12-24 15:32 4555What's New for D 0.178 ... -
GDC 0.20发布
2006-12-17 14:35 2757引用 * Updated to DMD 0.177 * Fix ... -
DMD 0.177发布
2006-12-09 18:47 2237没什么亮点,BUG修复得也不多,BUG数量始终保持在250-2 ... -
DMD 0.176发布
2006-12-03 14:22 3026引用 What's New for D 0.176 Dec ... -
D语言的成员函数模板
2006-12-02 20:29 3037DMD 0.166 特性列表中有一条: * ncorp ... -
D语言 在栈上分配对象 以及 无需GC拖管对象
2006-11-28 13:18 2759一、栈上分配对象 C++可以轻易实现在栈上和堆上分配对象,例 ...
相关推荐
利用IDL实现对图像处理的界面,包括对灰度值和RGB进行设置的按键程序的源代码,比较简单
idl实现的几个小函数,很有用,推荐一下
将hdf格式转换为tif格式、重投影、重采样
K-means算法实现IDL源码可直接分类遥感影像_;IDL_K._遥感_k-means.zip
利用遥感影像两个波段反射率值,计算植被指数值
对学习IDL有很大的帮助,IDL入门教程一.doc,IDL入门教程二(上)(简单图形显示II).doc,IDL入门教程二(下)(简单图形显示I).doc,IDL入门教程三(上).doc,IDL入门教程三(下).doc,IDL入门教程四(图形显示技术).doc,IDL入门...
fushejiaozheng_idl调用6s_IDL实现6s模拟_IDl_源码.rar
利用IDL进行界面的编程,包括影像读写,参数输入,界面位置设置等常用功能的编写,适合刚接触IDL语言并想编写简单界面的人士学习参考
本文主要介绍怎么在IDL平台上利用IDLBridge对象和SHVAR/SHMAP(共享内存)充分利用单机多核的计算资源,让平常单机单核串行IDL计算,转为高效单机多核并行计算。
实用小工具:IDL语言实现文件批量重命名以及批量移动
IDL投影变换批处理,学习批处理的途径。
干旱指数TVDI的IDL实现代码,希望大家多多学习
手工方式: idl55\examples\GUIbuilder\simple.prc,viewer.prc 直接图形法与对象图形法:direct_graphic.pro objsurfex.pro 对象图形法:simpleobject.pro firstobject.pro tireview.pro 高级对象应用: mesh对象...
IDL 经典算法集合,源代码程序,方便开发者学习
IDL 调用ENVI,高级图像镶嵌批处理。包括:镶嵌线、羽化等。
运用IDL设计独立界面,实现自主程序,简单大方美观
IDL与C#的数据传递方法研究COM_IDL_CONNECT
IDL程序-利用shap文件实现遥感影像批量裁剪
实现三维可视化、三维建模、空间功能很强,是一个三维软件