- 浏览: 234302 次
- 性别:
- 来自: 昆明
文章分类
最新评论
-
beiyangshuishi:
确实挺幽默的,太能恶搞了。不过这也让我想起日本的一则广告宣纸的 ...
一对活宝—— MySQL & PostgreSQL -
ShiningRay:
稍微看了vcf的api,比wxwidgets要干净得多
VCF 库的搞笑提示 -
Colorful:
Wow, this is amazing.
D语言 struct constrcutor 的 bug -
oldrev:
楼下,当时的 TRAC 确实说是要 py 2.4 的
出色的开源项目管理软件——Redmine -
jusdao:
...Trac可以用python2.5啊,没有说必须用2.4的 ...
出色的开源项目管理软件——Redmine
一个类似 C# 的 DllImport 实现,用于“半”动态加载 DLL。用起来比我以前写的 DLLWrapper 要麻烦一些,但是 DLLWrapper 由于使用一个 Tuple 来存储函数声明,会造成超长的标识符导致编译错误,这个 DllImport 避免了这个问题。
这个实现有一个缺陷是每次调用API函数的时候都会执行一次 GetProcAddress,效率比较低.... 谁能告诉我怎么避免该死的 CTFE?
改成这种呢?我不大喜欢HMODULE [char[]] m_modules这种用字符串作key的,相对路径和绝对路径都无法统一处理。
另外DLL里面没有指定必须是stdcall调用吧?如果是cdecl怎么办?还得加一个调用约定参数吧?
这个实现有一个缺陷是每次调用API函数的时候都会执行一次 GetProcAddress,效率比较低.... 谁能告诉我怎么避免该死的 CTFE?
代码
- // DllImport - A C#-like DLL Wrapper
- // written by oldrev (wstring#gmail.com)
- // License: BSD
- import std.stdio;
- import std.typetuple;
- import std.utf;
- import std.c.windows.windows;
- import std.traits;
- import std.string;
- import singleton;
- extern(Windows)
- {
- HMODULE LoadLibraryW(LPCWSTR libPath);
- }
- private static class ModuleManager
- {
- private static HMODULE [char[]] m_modules;
- private this()
- {
- }
- static public ~this()
- {
- foreach(h; m_modules)
- {
- FreeLibrary(h);
- }
- }
- private static HMODULE registerModule(char[] name)
- {
- char[] lname = tolower(name);
- HMODULE h = LoadLibraryW(toUTF16z(lname));
- if(h is null)
- throw new Exception("Failed to load DLL: " ~ name);
- m_modules[lname] = h;
- return h;
- }
- public static HMODULE getHandle(char[] name)
- {
- return m_modules[name];
- }
- public static ProcType getSymbol(ProcType)(char[] moduleName, char[] procName)
- {
- HMODULE handle = null;
- if(moduleName in m_modules)
- handle = m_modules[moduleName];
- else
- handle = registerModule(moduleName);
- assert(handle !is null);
- return cast(ProcType)GetProcAddress(handle, toStringz(procName));
- }
- }
- struct DllImport(char[] ModuleName, char[] ProcName, FT)
- {
- extern(Windows) alias ReturnType!(FT)
- function(ParameterTypeTuple!(FT)) FunctionType;
- // 非要这样重新绑定 extern(Windows),是不是编译器的 bug?
- // extern(Windows) alias FT FunctionType; // 这样就不行
- //怎么避免 CTFE?
- //FIXME:
- //FunctionType m_funcPtr = ModuleManager.getSymbol!(FunctionType)(ModuleName, ProcName);
- public ReturnType!(FunctionType) opCall(ParameterTypeTuple!(FunctionType) args)
- {
- FunctionType m_funcPtr = ModuleManager.getSymbol!(FunctionType)(ModuleName, ProcName);
- return m_funcPtr(args);
- }
- }
- void main()
- {
- DllImport!("user32.dll", "MessageBoxA",
- int function(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)) MessageBox;
- MessageBox(null, "Text", "Title", MB_OK);
- }
评论
9 楼
DavidL
2007-04-20
可以直接用bindings里的win32/winuser.d来调用这些dll吧
8 楼
qiezi
2007-04-17
方法名字只能用其它方式得到,比如stringof
7 楼
oldrev
2007-04-17
我查了 ClassInfo 类,没有方法名字,只有类的名字
6 楼
qiezi
2007-04-17
class有classinfo,它包括名字,struct我就不清楚了,应该也有。不过这些好像是运行时的,编译时可以用模板的alias参数去取,前面我提到过几次了,pyd里面用了这种方法取的参数名字。
5 楼
oldrev
2007-04-17
有没有办法可以反射出一个struct或class的方法的名字
4 楼
qiezi
2007-04-17
Dll!("user32.dll") user32; user32.DllImport!("MessageBoxA", int function(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType))MessageBox; 或者: DllImport!(user32, "MessageBoxA", int function(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType))MessageBox;
改成这种呢?我不大喜欢HMODULE [char[]] m_modules这种用字符串作key的,相对路径和绝对路径都无法统一处理。
另外DLL里面没有指定必须是stdcall调用吧?如果是cdecl怎么办?还得加一个调用约定参数吧?
3 楼
oldrev
2007-04-17
问题是 DMD 限制标识符为 4k 个字符,上一版只要稍微多定义几个函数就出错了
2 楼
qiezi
2007-04-17
我觉得上一版使用更方便呢,效率应该也会高一些吧。
1 楼
oldrev
2007-04-17
为了杜绝零回复.....
0.0.0.0.0.2 版,要稍微高效一点:
0.0.0.0.0.2 版,要稍微高效一点:
import std.typetuple; import std.c.windows.windows; import std.traits; import std.string; import std.utf; extern(Windows) { HMODULE LoadLibraryW(LPCWSTR libPath); } private static class ModuleManager { private static HMODULE [char[]] m_modules; private this() { } static public ~this() { foreach(h; m_modules) { FreeLibrary(h); } } private static HMODULE registerModule(char[] name) { char[] lname = tolower(name); HMODULE h = LoadLibraryW(toUTF16z(lname)); if(h is null) throw new Exception("Failed to load DLL: " ~ name); m_modules[lname] = h; return h; } public static HMODULE getHandle(char[] name) { return m_modules[name]; } public static ProcType getSymbol(ProcType)(char[] moduleName, char[] procName) { HMODULE handle = null; if(moduleName in m_modules) handle = m_modules[moduleName]; else handle = registerModule(moduleName); assert(handle !is null); ProcType proc = cast(ProcType)GetProcAddress(handle, toStringz(procName)); if(proc is null) throw new Exception("Cannot to get the address of " ~ procName); return proc; } } struct DllImport(char[] ModuleName, char[] ProcName, FT) { extern(Windows) alias ReturnType!(FT) function(ParameterTypeTuple!(FT)) FunctionType; alias DllImport!(ModuleName, ProcName, FT) SelfType; //FIXME: avoid the CTFE? private FunctionType m_funcPtr = null; public ReturnType!(FunctionType) opCall(ParameterTypeTuple!(FunctionType) args) { if(m_funcPtr is null) m_funcPtr = ModuleManager.getSymbol!(FunctionType)(ModuleName, ProcName); return m_funcPtr(args); } } void main() { DllImport!("user32.dll", "MessageBoxA", int function(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)) MessageBox; MessageBox(null, "Text", "Title", MB_OK); }
发表评论
-
Tango 0.99.7 Dominik 今天放出
2008-07-25 12:16 1426详细的发布公告: http://www.dsource.org ... -
D新闻组里的天才代码
2008-03-30 21:26 3314超猛的代码,刚才逛新闻组刚看到的,随便记录一下。 出自: ... -
Ubuntu & D
2008-03-23 12:33 2440前几天 Ubuntu Linux 8.04 (Hardy) 刚 ... -
Dotmars.test 单元测试框架简介
2007-11-19 22:43 94D语言内置的 unittest关键字+assert 组成的单元 ... -
mixin 模拟多继承
2007-11-10 17:40 3719D1.0 代码 /** TupleMixin ... -
简单的 C to D 转换 Ruby 脚本
2007-10-24 22:06 4667今天晚上费了点脑筋写了一个简单的 C2D 转换脚本,大致实现了 ... -
D1.0代码模拟 __traits(hasMember, ...)
2007-10-08 23:12 5152通过1.0的代码完全模拟了 D 2.0 __traits(ha ... -
更好的C++——给C++使用者的D语言简介
2007-09-14 01:30 12337作为 C++ 狂热的粉丝, ... -
让D代码自己编译自己
2007-09-12 22:55 4805刚在 D语言的新闻组里看到了D模板&元编程顶尖高人 ... -
Dotmars 实例之:容器、迭代器与算法框架
2007-08-03 23:49 5722Dotmars 实例之:容器、迭代器与算法框架 这几天 Mr. ... -
基于 D 2.0 编译时反射的单元测试框架
2007-07-27 21:25 2844一个模仿 Ruby Test::Unit 的 Quick &a ... -
D 2.0 Const/Final/Invariant 概念简介
2007-07-24 22:55 5472D 2.0 Const/Final/Invariant 概 ... -
DotMars 版 Hello World
2007-06-05 02:17 8239DotMars 已经具有初步的样子了,特别发帖庆祝。 Dot ... -
关联数组字面值+函数字面值=支持任意类型的 switch
2007-05-19 23:29 4562刚才写字符串格式化的由于要处理所有内置类型,而且只有 Type ... -
.Net/Java 风格格式化字符串
2007-05-18 22:51 3629基础类库的东西看起来容易做起来难,今天花时间实现了一点点 . ... -
修改版 juno.com.base
2007-04-20 00:28 4326dsource 上的 juno 是一个很不错的 Windows ... -
简单的D语言 VIM 缩写插件
2007-04-13 15:45 3512昨晚我写了一个非常简单的 VIM 的D语言缩写插件,希望能让用 ... -
双向链表模板类
2007-04-07 02:03 3073参考 STL 实现的 Quick & Dirty 双向 ... -
用Rant自动化D语言程序构建
2007-03-31 13:54 3271上回说到 Rank 这个 Ruby 世界最广泛使用的构建工具在 ... -
D语言通用 Rakefile
2007-03-31 00:21 2950在一个日文网站上发现的通用 Rakefile for GDCr ...
相关推荐
DLL(Dynamic Link Library)是Windows操作系统中的一个重要组成部分,它封装了特定的功能或服务,可供多个程序同时调用,减少了内存占用和提高了代码复用性。在C#开发中,使用DevExpress的DLL可以轻松地添加高级UI...
这通常涉及资源文件的使用,以及通过样式表(CSS-like)来定义控件的样式。 7. **性能优化**:在设计自定义控件时,要考虑性能因素,避免不必要的重绘和计算。合理使用双缓冲技术可以减少闪烁,而优化重绘逻辑则...
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_SoundDevice WHERE DeviceID LIKE '%wave%in%'"); ManagementObjectCollection devices = searcher.Get(); foreach ...
**面向对象编程(OOP)**是C#的一大特色,它强调将数据和操作数据的方法封装在一起,形成对象。培训中,重点学习了类与对象的定义、继承、多态、接口、抽象类等OOP关键概念,掌握了如何利用C#构建复杂的数据结构和逻辑...
**WPF Color Picker Like Office 2007** 在Windows Presentation Foundation(WPF)中创建一个类似Office 2007的颜色选择器是一项常见的任务,它涉及到用户界面设计和交互体验的优化。Office 2007的色彩选择器以其...
1. **Kmadxlib.cpp**:这可能是一个包含C++封装libmad的源代码文件,可能用于简化在C++项目中使用libmad的工作。 2. **test.cpp**:这是一个测试文件,通常用于验证库的功能和正确性。开发者可能在这里编写代码来...
3. **namelike‘张%’and namelike‘%奇%’**:SQL查询语句,用于搜索名字中既包含“张”又包含“奇”的记录。 4. **Insert、Update、Delete**:这些是SQL语言中的关键字,分别用于插入、更新和删除数据。 5. **...
你无需对自己的数据库文件做任何更改,就可以为数据库文件创建可供编程语言调用的ActiveX DLL全文检索接口,可用于任何与数据库检索有关的查询,例如全文搜索、垂直搜索、海量数据库LIKE式快速查询等。软件主要特点...
在ASP.NET中,开发者可以使用多种编程语言,如C#、VB.NET等,来编写代码。该框架支持事件驱动编程模型,使得网页交互更加直观和高效。 【个人门户系统】 个人门户系统是一种集成了多种信息资源和服务的平台,允许...
3. 搜索与分类:用户可以根据关键词、作者、类别等条件进行搜索,实现这一功能通常需要用到SQL查询和Like操作。 4. 购物车:用户可以添加书籍到购物车,购物车数据通常保存在Session或Cookie中,以保持用户会话状态...