`
tuja
  • 浏览: 16457 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

D语言,想说爱你不容易

    博客分类:
  • IE
阅读更多

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.iteye.com/blog/266811
  但那是好久前,已经不能通过新版DMD编译。。郁闷中
 
3 oldrev大侠发表了修改版 juno.com.base,看到一线曙光
  http://dlang.group.iteye.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及各位的指教。

 


  

 

 

 
  • vbscript_ie.zip (14.3 KB)
  • 描述: jcc7提供的,用oldrev修改版combase创建Microsoft Script Control,再用Microsoft Script Control创建IE的实例
  • 下载次数: 14
分享到:
评论
30 楼 tmp 2007-06-01  
可以搞掂C语言的,其它高级语言不在话下...

29 楼 tuja 2007-04-30  
IDispatch虽然效率不高,但是有些公开的组件好像只有通过晚期绑定调用(我的意思是,组件文档中只有晚期绑定的示例),比如ImageMagick图像处理组件,还有其他一些著名的组件,不知道是不是我知道得太少了。
28 楼 tuja 2007-04-29  
好的。还是非常感谢你,qiezi!
27 楼 qiezi 2007-04-29  
你这里&re是取地址,它是在栈上分配的,当然每次都是一样的。。

你可以依照activex.d里面的toVariant写一个反向转换的东西,或者找到有空的人帮你写,一有问题就贴出来也不是个办法呀,自己可以学习研究一下,我个人并不打算在这上面耗太多时间,而且也没这么多时间,目前还忙着整dxpcom呢。。。看一下圈子里谁对COM有兴趣,特别是对于使用蹩脚的IDispatch来调用COM有兴趣吧。
26 楼 tuja 2007-04-29  
谢谢!
比起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");
    }
}



25 楼 qiezi 2007-04-29  
加上uuid.lib和ole32.lib
24 楼 tuja 2007-04-29  
编译的奇怪问题:
用build可以成功编译:
bud embed_ie.d win32.lib

直接用dmd却不行:
dmd embed_ie.d win32.lib

Error 42: Symbol Undefined _IID_IoleObject
一共有9个未定义符号。

(我把导入文件位置加到sc.ini中去了)

23 楼 qiezi 2007-04-29  
因为runtime也被编译进去了。你用VC编译一个出来,把msvc**.dll一起算上不得有好几兆亚,
22 楼 tuja 2007-04-29  
谢谢!!

一直有个问题想请教,D编译出来的exe个头好大,ie.exe就120k,有的脚本语言编译出来exe,带上解释器也就200多k。

难道是D自带GC的原因吗?
21 楼 qiezi 2007-04-29  
原来已经加了自动改变大小,882行的:
ResizeBrowser(hwnd, LOWORD(lParam), HIWORD(lParam));
注释取消掉就行了。
20 楼 tuja 2007-04-29  
没有右键倒不影响嵌入GUI,不能自适应大小的话,容器最大化时确实很难看。
19 楼 tuja 2007-04-29  
qiezi真厉害!

成功编译出来:
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,帮助文档差不多已经看了一遍。相信只要入门以后,使用方便性不比脚本语言差。


18 楼 qiezi 2007-04-29  
噢! 说错了! 一起引入ascii和unicode会有名称冲突。
17 楼 qiezi 2007-04-29  
另外core32里面有ascii和unicode2个版本的API,想使用MessageBoxA就引入win32.ascii,使用MessageBoxW就引入win32.unicode,一起引入也没什么不妥。

BTW:怎么所有的回复又都跑到论坛上了?上次管理员说有个什么选项,可以选择是回复博客还是回复论坛呢怎么没看到?
16 楼 qiezi 2007-04-29  
圈子共享里我上传了刚刚修改编译运行成功的embed_ie程序,它嵌入IE浏览器到自己的界面上,没有处理窗口的WM_SIZE消息,所以放大缩小窗口时浏览器不会自动适应。另外没有右键菜单,我还不知道是为什么,应该也是哪个接口没实现的原因吧,l8night里面有个例子实现了右键菜单。

其实修改主要是因为D在某个版本把默认的import修改成private的了,所以以前有些不需要import的现在都需要显式的调用,当然这样更好也更合理。

我大概只用了5分钟就让这个例子编译通过并且运行了,我期待大家都能自己拥有这个入门级的能力,你不想一直处在没入门的状态是不是?这个小小的门槛只需要你尝试一下就可越过。
15 楼 tuja 2007-04-29  
谢谢qiezi!!

你以前写的那篇确实很好:
http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html

DOM操作很方便,不过我还没有编译出来。


14 楼 qiezi 2007-04-29  
这个我就不清楚了。你想嵌入浏览器,我以前写的那篇应该更合适,有空我看看那篇有什么问题吧,你也可以试试和用现在这个修改过的core32编译我那个程序行不行。
13 楼 tuja 2007-04-29  
真的非常感谢qiezi!!
我按照下面的方法,已经成功编译了你修改的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及楼上各位的指教。
12 楼 DavidL 2007-04-29  
你想用这些COM做什么呢?如果D这么不合适,干嘛用D呢,还不如用脚本。每个语言都有自己应用场合。
11 楼 oldrev 2007-04-28  
DMD 带的那几个导入库太寒酸了,GDC with mingw 就要强得多

相关推荐

    ERP想说爱你不容易.doc

    ERP想说爱你不容易.docERP想说爱你不容易.doc

    小学想说爱你不容易主题班会PPT教案.pptx

    这个名为"小学想说爱你不容易主题班会PPT教案.pptx"的文件,实际上是一个针对小学生设计的班会活动方案,旨在帮助孩子们理解和表达对父母的感激之情。活动通过不同的环节,引导学生认识到父母无私的爱,并学会感恩。...

    新媒体运营,想说爱你不容易:只愿不忘初心,方得始终 .doc

    新媒体运营,想说爱你不容易:只愿不忘初心,方得始终 .doc

    绩效管理:想说爱你不容易.doc

    【绩效管理:想说爱你不容易】 绩效管理是一个源自西方并在全球范围内广泛应用的管理工具,尤其在中国,它被视为推动企业发展和提升管理效率的关键。绩效管理强调通过设定明确的考核指标、权重,以及持续改进的机制...

    转基因:想说爱你真不容易.ppt

    转基因:想说爱你真不容易.ppt

    山东省邹平县实验九年级语文 政治,想说爱你不容易1学生作文素材 .doc

    在中学阶段,政治作为一门重要的社会科学课程,...教师的角色也至关重要,他们需要提供清晰的指导,帮助学生构建知识框架,并激发学生对政治学科的兴趣,让他们能够真正地“爱”上政治,而不仅仅是“想说爱你不容易”。

    初中语文文摘生活都市想说爱你不容易

    3. **工作环境与生活条件**:工地的工作环境艰苦,高温、高强度劳动、恶劣的伙食、无休止的加班,以及简陋的生活条件,这些都是作者在城市生活中不得不面对的现实。 4. **职业安全与健康**:文中提到作者因为误饮...

    钢琴,想说爱你不容易_叙事作文.docx

    作者感到痛苦,与父母的争执不断,甚至一度想要放弃。然而,为了考级,他不得不坚持下去。 在这个过程中,遇到了一位严厉的老师,尽管他的教学方式粗暴,但作者的技艺因此得到了显著提升。最终,作者在六年级时顺利...

    初中语文语文论文“生成”:想说爱你不容易

    - 有效的"生成"关注语文素养的培养,包括工具性和人文性的统一,重视语言的鲜活灵动和人文精神的渗透。 - "生成"需要价值引导,但价值标准不明确,需要进一步探讨如何确定有效的引导方向。 4. **“生成”与预设的...

    08329 企业培训--想说爱你不容易.doc

    然而,这样的培训模式并不全面,缺乏长远的战略眼光,无法从根本上提升企业的核心竞争力。 其次,培训应被视为一种长期投资,是培养和选拔人才的关键环节。对于有潜力的员工,企业提供有针对性的培训,可以提升他们...

    初中数学数学论文“研究性学习”想说爱你不容易

    在强调全面发展和提高整体素质的新时代,我们不能仅依赖少数精英,而应关注大多数学生的成长。 再者,“研究性学习”与“学科教学”的结合是个挑战。尽管“研究性学习”有助于提升学生的综合能力,但它无法完全取代...

    福建省大田县梅山九年级语文 政治,想说爱你不容易1作文素材.doc

    首先,面对政治教材,学生常常感到困惑,不知道哪些内容是重点,哪些应该划线记忆。这反映了对知识理解的困惑,教材中的语句可能含义模糊,使得学生无法准确把握关键点。为了改善这种情况,学生可以尝试更深入地阅读...

    Openstack想说爱你不容易

    先别着急骂我,我也没有说我真懂Openstack我其实很想弄懂Openstack,然而从哪里下手呢?作为程序员,第一个想法当然是代码,CodeTalks,什么都可以忽悠,代码是实实在在的,何况原来也深入读过Lucene,Hadoop的源代码...

    DEDE2007 做站先别用了,想说爱你不容易啊

    标题和描述中提到的"DEDE2007 做站先别用了,想说爱你不容易啊",这是对DEDE2007版本的一种批评。DEDE,全称可能是"DEDECMS",是一款基于PHP和MySQL的网站内容管理系统。这篇文章主要列举了DEDE2007正式版的一些问题...

    CDMA 1X无线上网卡驱动_爱民AM200

    深圳爱民科技公司 AM200型号CDMA无线上网卡的驱动程序 <br>内含中国联通提供的一个拨号程序 CDMA 20001X ... 所以,指望用它来上网冲浪是“想说爱你不容易”。最多只能算作一个上网的补充方案,期待3G!

    还没来得及说爱你.doc

    还没来得及说爱你.doc

    进入500强外企其实很简单--谁都可以进入外企[完整版]

    * 一般性国企 -- 想说爱你不容易 * 垄断型国企 – 别问我是谁 * 商业银行 – 为什么你背着我爱别人? * 民营企业 – 雾里看花 * 500 强外企 – 飞得更高 二、走“近”500 强外企的门 * 外企跟外企也不一样 * 外企...

    绩效管理实战(钱庆涛)

    绩效管理,想说爱你不容易! - **挑战**:绩效管理面临着诸多挑战,如目标设定不合理、考核标准模糊不清、反馈机制不健全等。 - **解决方案**:为了解决这些问题,企业需要建立一套科学合理的绩效管理体系,包括...

Global site tag (gtag.js) - Google Analytics