D语言,想说爱你不容易
D语言,想说爱你不容易
D语言设计思想本身很先进,我不否认。但是...
我想在一个GUI中嵌入IE,用来显示HTML,CSS,进行DOM操作。这在脚本语言中,只要类似下面一行代码就能创建一个IE实例:
CreateObject("InternetExplorer.Application")
但在D里却这么难。
1 首先我看到juno这个项目好像可以创建COM,可惜很长时间不更新了,已经不能通过新版DMD编译。。。
http://www.dsource.org/projects/juno
2 qiezi大侠写过一篇文章 D语言调用ActiveX(在窗口中嵌入ActiveX)
http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html
http://qiezi.javaeye.com/blog/266811
但那是好久前,已经不能通过新版DMD编译。。郁闷中
3 oldrev大侠发表了修改版 juno.com.base,看到一线曙光
http://dlang.group.javaeye.com/group/blog/72602
刚接触D,要用oldrev大侠的成果来创建IE实例,不知何从着手。。。
4 网上找com的文章,都是C++,C的实例,要是会C++多好,可是,如果我会C++,还用问这个问题吗
犹豫,是否先学C++,再学D,狂闷。。。
5 圈子里高人很多,可是。。。
6 上D官方新闻组,官方论坛去问。。。
好不容易,core32的作者jcc7给了个用oldrev修改版combase创建Microsoft Script Control,再用script脚本创建IE实例
如何嵌入GUI,如何得到IE句柄,如何控制页面元素。。。
用DMD1.013可以成功编译。离成功好像近了一步,路漫漫。。。
jcc7给的代码见本文附件
7 现在初浅的了解:
要实现把IE嵌入GUI,有两种思路:
早期绑定,这个在D里实现很麻烦
晚期绑定,就象脚本语言里用的那样
qiezie说用IDispatch接口的方法效率比较低
效率低点没有关系,谁能给个例子,用IDispatch接口实现创建IE实例?
真的很希望得到你的帮助,没有C++基础学D这么难,创建嵌入GUI的IE竟然这么难以实现。
D语言出现已经多年了,我知道不是D语言本身的问题,那么...
第一次用D写程序就被卡住了。。。
D,想说爱你不容易!
20070429tuja补充:
真的非常感谢qiezi,在百忙之中,抽出宝贵个人时间,修改了core32,使之能够通过dmd1.013的编译!!
我按照下面的方法,已经成功编译了你修改的core32
http://dsource.org/projects/core32
1 Unzip ZIP in \dmd\src\core32
2 Open command prompt (cmd.exe=DOX Box).
3 Type PATH \dmd\bin;%PATH%
4 CD to the core32\win32 directory.
5 Exeute makelib.bat
6 Copy make32.lib to \dmd\lib directory. This directory is alread in compilers search path.
7 CD to \dmd\bin
8 Open sc.ini
Add "%@P%\..\src\core32" to compiler include search path
然后用qiezi提供的编译参数:
dmd ie.d -I..\core32 activex.d ..\core32\win32\win32.lib
编译了ie.d,可以成功启动IE。
我的目的是,把IE嵌入GUI,进行DOM操作。
不知道 AXO ie = new AXO("InternetExplorer.Application");得到的ie,怎么得到它的句柄,然后在DFL创建的窗体中,就可以SetParent() 到 Form.handle从而实现嵌入GUI了。
非常感谢qiezi及各位的指教。
评论
你可以依照activex.d里面的toVariant写一个反向转换的东西,或者找到有空的人帮你写,一有问题就贴出来也不是个办法呀,自己可以学习研究一下,我个人并不打算在这上面耗太多时间,而且也没这么多时间,目前还忙着整dxpcom呢。。。看一下圈子里谁对COM有兴趣,特别是对于使用蹩脚的IDispatch来调用COM有兴趣吧。
比起vc带上几个dll,那是D的程序小多了。
在ie.d里,我用下面代码取不到属性,不知是怎么回事?
auto re=ie.get("ToolBar");
writefln(&re);
得到的只是12FEFC,不管参数是什么
ie.d全部代码:
module ie;
import std.c.windows.windows; /* for MessageBoxA */
import std.stdio;
import activex; /* for AXO */
void main()
{
AXO ie = new AXO("InternetExplorer.Application");
try
{
ie.call("Navigate", toVariant(), toVariant(), toVariant(), toVariant(), toVariant("intranet"));
//http://www.altavista.com/"));
ie.set("Width", toVariant(850));
ie.set("Height", toVariant(710));
ie.set("Top", toVariant(10));
ie.set("Left", toVariant(10));
ie.set("ToolBar", toVariant(false));
ie.set("MenuBar", toVariant(false));
ie.set("StatusBar",toVariant(false));
ie.set("Visible",toVariant(true));
auto re=ie.get("ToolBar");
writefln(&re);
}
finally
{
int ret = MessageBoxA(null, "Message\0", "Title\0", 0);
ie.call("Quit");
}
}
用build可以成功编译:
bud embed_ie.d win32.lib
直接用dmd却不行:
dmd embed_ie.d win32.lib
Error 42: Symbol Undefined _IID_IoleObject
一共有9个未定义符号。
(我把导入文件位置加到sc.ini中去了)
一直有个问题想请教,D编译出来的exe个头好大,ie.exe就120k,有的脚本语言编译出来exe,带上解释器也就200多k。
难道是D自带GC的原因吗?
ResizeBrowser(hwnd, LOWORD(lParam), HIWORD(lParam));
注释取消掉就行了。
成功编译出来:
bud embed_ie.d win32.lib -I..\core32 -LIBPATH=..\core32\win32 -cleanup
pause
embed_ie.exe
pause
l8night的例子在这里:
http://svn.dsource.org/projects/l8night/trunk/l8night/dfc/examples/browser/main.d
在你的鼓励下,现在努力学习D,帮助文档差不多已经看了一遍。相信只要入门以后,使用方便性不比脚本语言差。
BTW:怎么所有的回复又都跑到论坛上了?上次管理员说有个什么选项,可以选择是回复博客还是回复论坛呢怎么没看到?
其实修改主要是因为D在某个版本把默认的import修改成private的了,所以以前有些不需要import的现在都需要显式的调用,当然这样更好也更合理。
我大概只用了5分钟就让这个例子编译通过并且运行了,我期待大家都能自己拥有这个入门级的能力,你不想一直处在没入门的状态是不是?这个小小的门槛只需要你尝试一下就可越过。
你以前写的那篇确实很好:
http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html
DOM操作很方便,不过我还没有编译出来。
我按照下面的方法,已经成功编译了你修改的core32
http://dsource.org/projects/core32
1 Unzip ZIP in \dmd\src\core32
2 Open command prompt (cmd.exe=DOX Box).
3 Type PATH \dmd\bin;%PATH%
4 CD to the core32\win32 directory.
5 Exeute makelib.bat
6 Copy make32.lib to \dmd\lib directory. This directory is alread in compilers search path.
7 CD to \dmd\bin
8 Open sc.ini
Add "%@P%\..\src\core32" to compiler include search path
然后用你提供的编译参数:
dmd ie.d -I..\core32 activex.d ..\core32\win32\win32.lib
编译了ie.d,可以成功启动IE。
我的目的是,嵌入GUI,进行DOM操作。不知道 AXO ie = new AXO("InternetExplorer.Application");得到的ie,怎么得到它的句柄,然后在DFL创建的窗体中,就可以SetParent() 到 Form.handle从而实现嵌入GUI了。
非常感谢qiezi及楼上各位的指教。
- 浏览: 12025 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
D语言,想说爱你不容易
可以搞掂C语言的,其它高级语言不在话下...
-- by tmp -
D里如何使用标准库未声明 ...
奇怪教主怎么把core32里的一些东东纳入到std.c.windows,各种东西 ...
-- by tuja -
D里如何使用标准库未声明 ...
慢慢补充,windows.d会越来越完整
-- by yayv -
D语言,想说爱你不容易
IDispatch虽然效率不高,但是有些公开的组件好像只有通过晚期绑定调用(我的 ...
-- by tuja -
D语言,想说爱你不容易
好的。还是非常感谢你,qiezi!
-- by tuja






评论排行榜