当前位置: 首页 > news >正文

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 表单&#xff1a; <form action"demo_form.php" method"get">First name: <input type"text" name"fname"><br>Last name: <input type&qu…...

编译技术-词法理论

一、文法的种类 1.1 分类定义 Chomsky 文法定义&#xff1a; G(V,Vt,P,Z)G (V, V_t, P, Z)G(V,Vt​,P,Z)VVV&#xff1a;符号集合VtV_tVt​&#xff1a;终结符号集合PPP &#xff1a;有穷规则集合ZZZ&#xff1a;是被符号&#xff0c;不能是终结符 关于不同文法的区别 类型…...

【20】核心易中期刊推荐——计算机科学电子通信(EI索引)

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…...

Vue 3.0 风格指南 2

#元素 attribute 的顺序推荐 元素 (包括组件) 的 attribute 应该有统一的顺序。 这是我们为组件选项推荐的默认顺序。它们被划分为几大类&#xff0c;所以你也能知道新添加的自定义 attribute 和指令应该放到哪里。 定义 (提供组件的选项) is列表渲染 (创建多个变化的相同元素…...

ChatGPT遭多国调查,OpenAI凌晨就安全问题发文,GPT-5要暂缓?

最近&#xff0c;意大利宣布禁用 ChatGPT&#xff0c;因为 OpenAI 违反了意大利相关的隐私规则和数据保护法&#xff0c;出现了用户数据丢失情况&#xff0c;而且未向用户告知。 消息出来后&#xff0c;德国、法国、爱尔兰、西班牙等国的监管部门都表示正在密切关注 ChatGPT 的…...

网络安全书籍推荐

网络安全书籍推荐 &#xff0c;对于网络安全的初学者来说&#xff0c;能很好的选择教材&#xff0c;鉴于只有英文版&#xff0c;我尝试翻译成中文以供参考&#xff0c;初次翻译&#xff0c;翻译的不好请见谅。 标题注解技术等级The Art of Software Security Assessment软件安…...

【独家】华为OD机试 - 狼羊过河 or 羊、狼、农夫过河(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:狼羊过河 or 羊、狼、农夫过河…...

东八区的 springboot 如何配置序列化

东八区的 springboot &#x1f69e;使用SpringBoot默认配置自定义配置类自定义 ObjectMapper自定义序列化器总结我接受它的苦&#xff0c;它的灰暗&#xff0c;它的刺&#xff0c;因为总会过去&#xff0c;我的花会开&#xff0c;生活也会慢慢拥抱我 使用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,真是砂纸擦屁股,给我露了一手啊

​上周我们公司的绩效面谈全部结束了&#xff0c;每年到这个时间点就是打绩效的时候了&#xff0c;对于职场打工人来说绩效绝对是最重要的事情之一&#xff0c;原因也很简单&#xff1a;奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉&#xff1…...

真题详解(计算机总线)-软件设计(四十五)

真题详解&#xff08;二维数组&#xff09;-软件设计&#xff08;四十四&#xff09;https://blog.csdn.net/ke1ying/article/details/130023062 1、2016年下半年 解析&#xff1a; A选项&#xff0c;当B中的两个结束都到达&#xff0c;会转到C2&#xff0c;因为C2没有事件&a…...

剪格子

[蓝桥杯 2013 省 A] 剪格子 题目描述 如图 111 所示&#xff0c;333\times 333 的格子中填写了一些整数。 我们沿着图中的红色线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是 606060。 本题的要求就是请你编程判定&#xff1a;对给定的 mnm\times nmn 的格…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...