找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 413|回复: 12

[源码] [炫语言入门] 如何在DLL中加载炫彩窗口

[复制链接]

55

主题

75

回帖

540

积分

版主

积分
540
发表于 2024-8-21 00:09:11 | 显示全部楼层 |阅读模式
本帖最后由 hxznhf 于 2024-8-21 11:41 编辑


首先创建一个炫语言动态链接库(DLL)项目,然后在项目名称上右键 - 选择新建文件添加一个炫彩窗口布局文件(命名为“main.xml”)作为我们的主窗口





创建项目后,IDE默认已打开main.xc文件,我们可以看到这个有一个“入口函数_动态链接库”,这与我们创建的exe创建程序一样,都有一个入口函数,但是DLL项目中的入口函数又和普通程序的入口函数有些一区别。




如图所示:如果我们要让dll被加载后就显示我们DLL中的窗口,我们就在 DLL_进程附加 这个判断分支里面写上我们的炫彩窗口初始化代码

注:主窗口 是全局变量定义“  窗口类  主窗口 ”



这个加载主窗口函数包含了从炫彩初始化到窗口显示的调用流程


重点来了:理论上来说假设我们的EXE程序是有窗口的(已经有消息循环),我们可以去掉“炫彩_运行”,把炫彩_退出放到 DLL_进程分离 判断分支中,这样的话我们就不需要创建线程来载入我们的炫彩窗口(因为不创建线程,炫彩_运行内部的循环会阻塞当前代码,相当于EXE在一直处于加载我们DLL的等待中,EXE被卡死)。


因此第一种写法:不创建线程直接加载窗口




第二种写法:创建线程来加载主窗口





以上两种方法取决于具体情况,但通常很多人选择的第二种,之前我的疏忽(在和一位群友讨论多线程操作窗口时,我误解了他的写法,平时我们都说多线程不应该直接操作窗口组件,但这里为什么我却让大家通过线程来启动窗口?)实际上我们的程序窗口本身就运行在一个线程中,当程序启动后就会创建一个线程来运行程序代码(默认窗口也是在这里加载),这里的线程我们常常叫做主线程,而我们平时说的不要多线程操作窗口组件,是指不要再自己创建的其它线程来操作主线程创建的窗口组件。

而我们这里的创建线程启动窗口,这里的线程就相当于dll中窗口的主线程,他已经和调用DLL的程序的主线程没有直接关系了,所以这并不是错误的操作。



这里是完整的项目例子:(供新手学习交流,如果讲解有错误,欢迎各位大佬指教)


2024年8月21日修改:添加参数类型强制转换,避免编译器报错,添加调试DLL项目的设置说明































本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

49

主题

49

回帖

408

积分

超级版主

积分
408
发表于 2024-8-21 08:01:54 | 显示全部楼层
大佬,厉害啊,学习学习

32

主题

143

回帖

738

积分

高级会员

积分
738
发表于 2024-8-21 08:20:58 | 显示全部楼层
谢谢,分享!

32

主题

143

回帖

738

积分

高级会员

积分
738
发表于 2024-8-21 10:50:19 | 显示全部楼层
D:\Program Files\炫彩IDE-3.3.8.1-(2023-11-16)\data\XC-Module\常规\AlongsCode-易语言核心支持库\module_epltuils.h(10): fatal 错误 C1083: 无法打开包括文件: “optional”: No such file or directory
*编译失败-预编头, 错误码: 2
*编译预编译头失败


报错了!!哎.这满大街模块都不知那些是代表官方的,那些是绝对安全的!又没时间一行行C++模块代码看!!看H文件和CPP文件就如看天书一般,还不如XC源码模块来得实际!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

55

主题

75

回帖

540

积分

版主

积分
540
 楼主| 发表于 2024-8-21 11:18:19 | 显示全部楼层
呵呵仙 发表于 2024-8-21 10:50
D:\Program Files\炫彩IDE-3.3.8.1-(2023-11-16)\data\XC-Module\常规\AlongsCode-易语言核心支持库\module ...

官方的一般都是本地模块,在线模块是用户自己上传的,这个易语言核心库我看了,暂时没啥用,自带的都有

55

主题

75

回帖

540

积分

版主

积分
540
 楼主| 发表于 2024-8-21 11:19:47 | 显示全部楼层
呵呵仙 发表于 2024-8-21 10:50
D:\Program Files\炫彩IDE-3.3.8.1-(2023-11-16)\data\XC-Module\常规\AlongsCode-易语言核心支持库\module ...

为啥不加群呀,发帖的同时,也可以在群里问问,效率更高,发帖主要是方便新手避坑

点评

没QQ,N年没用QQ了.都不知是什么号了!!  发表于 2024-8-21 11:22

55

主题

75

回帖

540

积分

版主

积分
540
 楼主| 发表于 2024-8-21 11:24:28 | 显示全部楼层
hxznhf 发表于 2024-8-21 11:19
为啥不加群呀,发帖的同时,也可以在群里问问,效率更高,发帖主要是方便新手避坑 ...

2283812   进来吧

5

主题

34

回帖

186

积分

注册会员

积分
186
发表于 2024-8-21 14:50:33 来自手机 | 显示全部楼层
大佬牛逼

32

主题

143

回帖

738

积分

高级会员

积分
738
发表于 2024-8-25 10:31:28 | 显示全部楼层
版主大人好,请问,你这个DLL窗口带事件后,如何正确的在线程内利用局部变量无限的创建子窗口?
例如这贴子的效果: https://bbs.125.la/forum.php?mod ... 14808612&extra=

55

主题

75

回帖

540

积分

版主

积分
540
 楼主| 发表于 2024-8-25 16:37:51 | 显示全部楼层
呵呵仙 发表于 2024-8-25 10:31
版主大人好,请问,你这个DLL窗口带事件后,如何正确的在线程内利用局部变量无限的创建子窗口?
例如这贴子的效 ...

原帖里面炫彩作者不是回复了吗

自己定义多个窗口类变量,每个窗口都可以加载同一个布局文件,只是每次创建的时候需要加一个名称前缀参数,炫彩_加载布局文件的几个API都有这个参数,不加前缀,窗口中的元素ID会重复,就会报错。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|炫语言 | 炫彩界面库 | 用户所需, 正是我所做! ( 鄂ICP备2023014763号-1 )

GMT+8, 2024-11-24 12:13 , Processed in 0.079014 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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