网站建设计入什么科目,郑州seo排名工具,郴州市北湖区,网站首页策划一、DLL的入口点 1.1 VFB的自带DLL模式入口 FB是把代码转成C#xff08;GCC编译#xff09;或者汇编#xff08;GAS编译#xff09;后编译的#xff0c;本身就有一个main函数#xff0c;所以在程序里其实不需要入口点#xff0c;直接写就可以顺序执行#xff0c;而有的…一、DLL的入口点 1.1 VFB的自带DLL模式入口 FB是把代码转成CGCC编译或者汇编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 FunctionDLL入口函数
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 FunctionDLL启动时调用
Sub LoadDllMain() ConstructorDllMain(GetCurrentModuleHandle(),DLL_PROCESS_ATTACH,NULL)
End SubDLL卸载时调用
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 threadReturn 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