FB使用入口点函数例子
一、DLL的入口点
1.1 VFB的自带DLL模式入口
FB是把代码转成C(GCC编译)或者汇编(GAS编译)后编译的,本身就有一个main函数,所以在程序里其实不需要入口点,直接写就可以顺序执行,而有的小伙伴编译DLL时,想使用DLL入口点函数的参数。而VFB只提供了DLL加载和DLL卸载两种(使用的是Constructor和Destructor来实现加载和卸载功能的),其实现方式如下(可以直接使用VFB的DLL模式,IDE已经实现,不需要写代码):
'===================================================================================================================
'该方法没有线程启动和终止的参数
'使用Constructor和Destructor来判断加载和卸载调用,以此设置fdwReason参数,具体如下:
'获取当前模块句柄
Function GetCurrentModuleHandle() As HMODULEdim info As MEMORY_BASIC_INFORMATIONVirtualQuery(cast(LPCVOID,@GetCurrModuleHandle),@info,SizeOf(info))Return cast(HMODULE,info.AllocationBase)
End Function'DLL入口函数
Function DllMain(ByVal hModule As HANDLE, ByVal fdwReason As Dword, ByVal lpReserved As LPVOID) As BOOL Export Select Case fdwReasonCase DLL_PROCESS_ATTACH 'DLL被加载MessageBox(0,"DLL_PROCESS_ATTACH","hModule=" & Hex(hModule),0)Case DLL_PROCESS_DETACH 'DLL被卸载MessageBox(0,"DLL_PROCESS_DETACH","hModule=" & Hex(hModule),0)End Select Function = TRUE
End Function'DLL启动时调用
Sub LoadDllMain() ConstructorDllMain(GetCurrentModuleHandle(),DLL_PROCESS_ATTACH,NULL)
End Sub'DLL卸载时调用
Sub UnloadDllMain() DestructorDllMain(GetCurrentModuleHandle(),DLL_PROCESS_DETACH,NULL)
End Sub
1.2 Windows的标准入口
如果有需要线程启动和终止消息的,则需要使用这种模式的入口,需要自己复制代码实现,主要原理是通过参数命令-Wl -e增加一个入口点函数_DLLENTRY (在VFB附加编译选项中输入命令:-Wl -e_DLLENTRY,如果使用1.09.0的编译器,也可以使用 #cmdline来设置编译参数)。这里需要注意,32位和64位编译产生的函数名有区别(64位前面有下划线,而32位没有),代码如下:
'===================================================================================================================
'线程测试
Dim Shared pThread As HANDLEFunction TestThread(ByVal dat As Any Ptr) As DWORD Print "hModule=";*Cast(HANDLE Ptr,dat)Print "in thread"Return 0
End Function
'线程测试
'==================================================================================================================='===================================================================================================================
'该方法使用-Wl编译命令来设置入口点
'编译命令如下:fbc -s gui -dll -export -Wl -e_DLLENTRY
#cmdline "-Wl -e_DLLENTRY" '添加入口命令(fbc编译器支持的情况下)
#Ifdef __FB_64BIT__
Function DllMain Alias "_DLLENTRY" (ByVal hModule As HANDLE, ByVal fdwReason As DWORD, ByVal lpReserved As LPVOID) As BOOL Export
#Else
Function DllMain Alias "DLLENTRY" (ByVal hModule As HANDLE, ByVal fdwReason As DWORD, ByVal lpReserved As LPVOID) As BOOL Export
#EndIf Select Case fdwReasonCase DLL_PROCESS_ATTACH 'DLL被加载MessageBox(0,"DLL被加载","hModule=" & Hex(hModule),0)
'===================================================================================================================
'线程测试Dim dwID As DWORD pThread = CreateThread(NULL,0,Cast(LPTHREAD_START_ROUTINE,@TestThread),@hModule,0,@dwID) '开启线程
'线程测试
'===================================================================================================================Case DLL_PROCESS_DETACH 'DLL被卸载MessageBox(0,"DLL被卸载","hModule=" & Hex(hModule),0)
'===================================================================================================================
'线程测试CloseHandle(pThread) '关闭线程pThread = NULL
'线程测试
'===================================================================================================================Case DLL_THREAD_ATTACH '单个线程启动MessageBox(0,"单个线程启动","hModule=" & Hex(hModule),0)Case DLL_THREAD_DETACH '单个线程终止MessageBox(0,"单个线程终止","hModule=" & Hex(hModule),0)Case ElseEnd Select Function = TRUE
End Function
FBEdit测试工程如下:https://github.com/rainheart311/FBEdit-FullProject/tree/main/Enter%20Point%20%20FreeBASIC/DllMain
二、WinMain入口点
Function WinMain(ByVal hInst As HINSTANCE,ByVal hPrevInst As HINSTANCE,ByVal CmdLine As LPCTSTR,ByVal CmdShow As Integer) As LRESULT'这里创建窗体
End Function'{ Program startWinMain(GetModuleHandle(NULL),NULL,GetCommandLine,SW_SHOWDEFAULT) '这里调用入口点函数End
'}
'Program End
FBEdit测试工程如下:
https://github.com/rainheart311/FBEdit-FullProject/tree/main/Enter%20Point%20%20FreeBASIC/WinMain
三、Main入口点
Function Main(ByVal argc As Integer,ByVal argv As ZString Ptr Ptr ) As Integer print "param";argc,**argv '显示参数值print "end" Sleep Return True
End FunctionEnd Main(__FB_ARGC__,__FB_ARGV__) '调用入口函数,__FB_ARGC__,__FB_ARGV__是控制台传入的参数
FBEdit测试工程如下:
FBEdit-FullProject/Enter Point FreeBASIC/Main at main · rainheart311/FBEdit-FullProject · GitHub
相关文章:
FB使用入口点函数例子
一、DLL的入口点 1.1 VFB的自带DLL模式入口 FB是把代码转成C(GCC编译)或者汇编(GAS编译)后编译的,本身就有一个main函数,所以在程序里其实不需要入口点,直接写就可以顺序执行,而有的…...
学习周报4/9
文章目录前言文献阅读摘要简介方法结论时间序列预测总结前言 本周阅读文献《Improving LSTM hydrological modeling with spatiotemporal deep learning and multi-task learning: A case study of three mountainous areas on the Tibetan Plateau》,文章主要基于…...
49天精通Java,第14天,Java泛型方法的定义和使用
目录一、基本介绍1、Java泛型的基本语法格式为:2、在使用泛型时,还需要注意以下几点:二、泛型的优点1、类型安全2、消除强制类型转换3、更高的效率4、潜在的性能收益三、常见泛型字母含义四、使用泛型时的注意事项五、泛型的使用1、泛型类2、…...
20230402英语学习
reasonable adj.合理的;通情达理的;明智的,理智的 abstract adj.抽象的,理论的 reflection n.反射; 映像, 倒影; 反映; 表达, 抒发; (长相等)酷似的人; 惟妙惟肖的事物; 深思; 考虑 instruction n.教授; 教导, 指导; 指示, 命令…...
Java知识复习(十七)SpringCloud
1、什么是微服务架构 微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务…...
MySQL 数据库操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、关系模型二、数据库的操作 创建数据库查看数据库选择数据库删除数据库三、MySQL 数据库命名规范总结一、关系模型 关系数据库是建立在关系模型上的。而关系模…...
Cesium更换地球背景
设置背景图片 #cesiumContainer {width: 100%;height: 100%;background-image: url("/assets/image/背景.png"); }设置渲染, 用来去掉地球表面的大气效果的黑圈问题 this.viewer new Cesium.Viewer("cesiumContainer", {......// 设置渲染orderIndepe…...
测试人员的瓶颈期
测试人员的瓶颈期 做测试久了,会在所难免地碰到职业瓶颈期,这很正常,从事任何职业的工作人员都会遇到,关键是要看你如何去克服它。对优秀的软件测试人员来讲,除了要具备全面的技能、丰富的经验、良好的心理素质&#x…...
HTML5 <form> 标签
HTML5 <form> 标签 实例 带有两个输入字段和一个提交按钮的 HTML 表单: <form action"demo_form.php" method"get">First name: <input type"text" name"fname"><br>Last name: <input type&qu…...
编译技术-词法理论
一、文法的种类 1.1 分类定义 Chomsky 文法定义: G(V,Vt,P,Z)G (V, V_t, P, Z)G(V,Vt,P,Z)VVV:符号集合VtV_tVt:终结符号集合PPP :有穷规则集合ZZZ:是被符号,不能是终结符 关于不同文法的区别 类型…...
【20】核心易中期刊推荐——计算机科学电子通信(EI索引)
🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…...
Vue 3.0 风格指南 2
#元素 attribute 的顺序推荐 元素 (包括组件) 的 attribute 应该有统一的顺序。 这是我们为组件选项推荐的默认顺序。它们被划分为几大类,所以你也能知道新添加的自定义 attribute 和指令应该放到哪里。 定义 (提供组件的选项) is列表渲染 (创建多个变化的相同元素…...
ChatGPT遭多国调查,OpenAI凌晨就安全问题发文,GPT-5要暂缓?
最近,意大利宣布禁用 ChatGPT,因为 OpenAI 违反了意大利相关的隐私规则和数据保护法,出现了用户数据丢失情况,而且未向用户告知。 消息出来后,德国、法国、爱尔兰、西班牙等国的监管部门都表示正在密切关注 ChatGPT 的…...
网络安全书籍推荐
网络安全书籍推荐 ,对于网络安全的初学者来说,能很好的选择教材,鉴于只有英文版,我尝试翻译成中文以供参考,初次翻译,翻译的不好请见谅。 标题注解技术等级The Art of Software Security Assessment软件安…...
【独家】华为OD机试 - 狼羊过河 or 羊、狼、农夫过河(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:狼羊过河 or 羊、狼、农夫过河…...
东八区的 springboot 如何配置序列化
东八区的 springboot 🚞使用SpringBoot默认配置自定义配置类自定义 ObjectMapper自定义序列化器总结我接受它的苦,它的灰暗,它的刺,因为总会过去,我的花会开,生活也会慢慢拥抱我 使用SpringBoot默认配置 S…...
论文阅读_LLaMA
论文信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: LLaMA: Open and Efficient Foundation Language Models name_ch: LLaMA: 开放高效的基础语言模型 paper_addr: https://arxiv.org/abs/2302.13971 doi: https://doi.org/10.48550/arXiv.2302.13971 da…...
腾讯空降测试工程师,绩效次次拿S,真是砂纸擦屁股,给我露了一手啊
上周我们公司的绩效面谈全部结束了,每年到这个时间点就是打绩效的时候了,对于职场打工人来说绩效绝对是最重要的事情之一,原因也很简单:奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉࿱…...
真题详解(计算机总线)-软件设计(四十五)
真题详解(二维数组)-软件设计(四十四)https://blog.csdn.net/ke1ying/article/details/130023062 1、2016年下半年 解析: A选项,当B中的两个结束都到达,会转到C2,因为C2没有事件&a…...
剪格子
[蓝桥杯 2013 省 A] 剪格子 题目描述 如图 111 所示,333\times 333 的格子中填写了一些整数。 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是 606060。 本题的要求就是请你编程判定:对给定的 mnm\times nmn 的格…...
当LLM学会“思考”算法逻辑:拆解EoH如何用“思想+代码”协同进化,碾压传统自动设计
当LLM成为算法设计师:揭秘EoH如何用“思维代码”双螺旋进化重塑自动算法设计 想象一下,你正在指挥一支由建筑师和施工队组成的特殊团队。建筑师负责绘制蓝图,施工队负责将蓝图变为现实。但与传统团队不同,你的建筑师能根据施工反…...
深入解析:set_clock_groups中-physically_exclusive与-asynchronous的约束协同与必要性
1. 从Spyglass报错看时钟约束的必要性 最近在跑Spyglass做SDC检查时,遇到了一个让我困惑的报错:"当两个时钟设置成物理互斥或逻辑互斥时,需要另外加上这两个时钟是异步设置的约束"。这让我很纳闷,明明已经设置了物理互…...
多无人机协同打击任务分配方法
随着无人机技术的不断成熟和完善,其军事应用的优势日益显现,近年来其在军事冲突中 所发挥的作用更使人们认识到,无人机在未来战争中将成为重要的军事装备。随着无人机在军 事中的大量应用,无人机集群协同执行任务将成为典型的应用…...
通义千问3-VL-Reranker-8B新手教程:零基础学会混合检索排序
通义千问3-VL-Reranker-8B新手教程:零基础学会混合检索排序 1. 认识这个强大的多模态排序工具 想象一下,你正在管理一个包含文字、图片和视频的庞大数据库。当用户搜索"户外运动装备"时,系统返回了100个结果——有些是产品描述文…...
别再折腾CUDA了!用Anaconda在Windows上一键搞定TensorFlow 2.5 GPU环境(附清华源配置)
告别CUDA版本地狱:Anaconda三分钟部署TensorFlow GPU全攻略 刚接触深度学习的开发者们,往往在第一步就被GPU环境配置劝退。CUDA与cuDNN的版本匹配问题像一道高墙,让无数Windows用户在TensorFlow门前徘徊。我曾见过同事花三天时间反复卸载重装…...
【调优】OpenClaw从零开始群聊安全配置
未来已来,只需一句指令,养龙虾专栏导航,持续更新ing… 想象一下,你正在指挥一场精密的交响乐,每一个乐器(群组)都需要在正确的时间发出声音,既不能杂乱无章,也不能产生噪音。 对群组最核心的思考是:如何在“智能”与“安全”之间找到完美的平衡点? 答案就是“分层治…...
03-CAPL 常用函数大全
专栏:《CAPL 脚本编写实战指南》第 3 篇 作者:一线汽车电子测试工程师 适合人群:已掌握 CAPL 基础的测试人员、想系统学习 CAPL 函数的工程师开篇:为什么要学 CAPL 函数? 这是我刚学 CAPL 时的真实经历。 当时的情况&a…...
告别散斑噪声困扰:用PyTorch手把手实现DenoDet的频域去噪模块(附完整代码)
频域魔法:用PyTorch实现SAR图像去噪的工程实践 当你在处理SAR图像时,是否曾被那些恼人的散斑噪声困扰?这些像胡椒粒一样随机分布的噪声点不仅影响视觉效果,更会严重干扰目标检测的准确性。传统方法试图在空间域直接对抗噪声&#…...
Wan2.2-I2V-A14B GPU算力优化:显存碎片整理与缓存复用机制解析
Wan2.2-I2V-A14B GPU算力优化:显存碎片整理与缓存复用机制解析 1. 引言 在视频生成领域,Wan2.2-I2V-A14B模型凭借其出色的生成质量和稳定性,已成为众多企业和开发者的首选。然而,随着视频分辨率和时长的提升,显存资源…...
Java线程池中如何用TransmittableThreadLocal避免变量丢失?附完整Demo
Java线程池中TransmittableThreadLocal的实战应用与避坑指南 在Java高并发编程中,线程池是提升性能的利器,但线程复用机制却给上下文传递带来了挑战。当我们在父线程设置变量,子线程却无法获取时,这种"断链"现象常让开发…...
