开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 8242|回复: 7
收起左侧

[易源码分享] 如何在易语言中静态创建一个有效COM对象?

[复制链接]
结帖率:33% (3/9)
发表于 2016-10-18 13:45:33 | 显示全部楼层 |阅读模式   四川省成都市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -

易语言在这方面似乎没有相关的内容 在易语言中实现这个功能并不是那么容易 不过有相类似的工程的托管至“can you refer to: https://github.com/liulilittle/E2CCOM
你可以查看它的一个底层实现 虽然是用VC写的

易语言静态创建COM从意义上并不大 它只可以解决在不注册一个COM类型库到系统ROT时 可以成功创建这个对象 但它的局限性实际上并不小 你无法通过ProgID创建一个有效的COM对象 当然这只是说在此模块的支持上 如果需要支持ProgID静态创建COM对象的话 这需要从COM/TLB类型库中着手 但显然会很麻烦即便在易语言中实现上述功能也不是那么容易的。
在附带的DEMO中 使用一个在众多易语言程序开发中所经常利用到一个COM类库“大漠插件”吧 如果需要在运行时查看COM对象的函数可以参考我的这篇帖子内的一个信息 如何在易语言中枚举COM对象的方法?
  
窗口程序集名保 留  保 留备 注
   
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
变量名类 型静态数组备 注
dm对象 
hWnd整数型 
ShellExecuteA ( #NULL, “open”, “notepad.exe”, “”, “”, #SW_NORMAL )
如果真 (CoCreateInstance (“dm.dll”, “{26037A0E-7CBD-4FFF-9C63-56F2D0770214}”, dm))
hWnd = dm.数值方法 (“FindWindow”, “”, “记事本”)
如果真 (hWnd ≠ #NULL )
dm.方法 (“SetWindowText”, hWnd, “你好,世界!”)
dm.查看 ()
返回 (0)  ' 可以根据您的需要返回任意数值


在DEMO中的代码写的非常简单易懂,使用ShellExecuteA函数打开一个“记事本”可执行程序 调用“CoCreateInstance”函数从“dm.dll”中创建一个COM对象 然后调用“大漠插件”中的函数“模糊查找记事本窗口句柄”在修改记事本窗口的标题 最后调用DEBUG下查看COM对象的函数 整个流程行云流水简单至极~~
//
  
子程序名返回值类型公开备 注
CoCreateInstance逻辑型 
参数名类 型参考可空数组备 注
__lib文本型
__clsid文本型
__ppv对象


//
那么在“CoCreateInstance”函数中有一个__clsid的参数你可以不知道它是做什么用的 它实际上是标识在COM类型库中一个具体的“COM对象实现类” 我们在调度一个对象时是通过“COM接口”在调用它的成员
无标题.png
在上图中你可以看到下面这么一系列话 这实际上是对COM对象实现类型的一个声明
[
  uuid(26037A0E-7CBD-4FFF-9C63-56F2D0770214),
  helpstring("dmsoft Class")
]
coclass dmsoft {
    [default] interface Idmsoft;
};

在coclass上部分即[]内的内容,helpstring标识在类型库中留下可以被反射读取的信息(顾名思义只做一个代码阅读帮助用途)但uuid的话就不太一样了哦 它在这里是标识此实现对象的GUID 但在COM中称CLSID 那么这些CLSID在未编译器前代码中到底是如何声明的?
[__declspec(uuid("26037A0E-7CBD-4FFF-9C63-56F2D0770214"))]
__interface IFoo : public IDispatch {
    // TD:OD
}
那么在C#中是如何声明的?
[ComVisible(true), Guid("26037A0E-7CBD-4FFF-9C63-56F2D0770214")]
public interface IFoo {
   // TD:OD
}
//
那么如何通过工具查看一个COM类库的信息呢?你可以使用OLEVIEW工具它是一个令人惊讶的COM类型库信息查看工具 但显然只讨论如何查看一个未被注册COM类库中的信息
你需要先打开OLEVIEW工具,点击“File”菜单然后选择"View TypeLib..."菜单项后会弹出“文件打开对话框”FileOpenDialog 此时你只需要找到需要被查看的COM类型库文件 如“dm.dll”。
// C.C
一个有效的示例代码: demo.rar (634.67 KB, 下载次数: 207)

评分

参与人数 3好评 +3 精币 +63 收起 理由
星辰Stranger + 1 + 1 奉上小小红包希望笑纳
兔子君 + 1 + 60 感谢发布原创作品,精易因你更精彩!
冰点 + 1 + 2 奉上小小红包希望笑纳

查看全部评分


结帖率:85% (33/39)

签到天数: 1 天

发表于 2023-6-19 01:47:27 | 显示全部楼层   江苏省苏州市
学习一下,谢谢分享
回复 支持 反对

使用道具 举报

签到天数: 24 天

发表于 2022-12-4 20:02:17 | 显示全部楼层   广东省广州市
新技能GET
回复 支持 反对

使用道具 举报

签到天数: 2 天

发表于 2020-2-18 21:14:28 | 显示全部楼层   云南省昆明市
学习一下             。
回复 支持 反对

使用道具 举报

签到天数: 7 天

发表于 2017-3-5 22:56:35 | 显示全部楼层   广东省云浮市
回复 支持 反对

使用道具 举报

发表于 2016-11-17 14:16:18 | 显示全部楼层   河南省焦作市
请问 你发的 那个 C++ 项目 无法编译 怎么破?
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
发表于 2016-10-20 23:14:59 | 显示全部楼层   海南省海口市
奉上小小红包希望笑纳
回复 支持 反对

使用道具 举报

发表于 2016-10-18 14:32:56 | 显示全部楼层   云南省玉溪市
支持一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表