Basestation函数解析(一)
---恢复内容开始---
1._tmain _tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数。
首先,这个_tmain()是为了支持unicode所使用的main一个别名而已,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个让你困惑的<stdafx.h>里,有这么两行
#include <stdio.h>
#include <tchar.h>
我们可以在头文件<tchar.h>里找到_tmain的宏定义:#define _tmain main
所以,经过预编译以后, _tmain就变成main了。
int _tmain(int argc, TCHAR *argv[])
当你程序当前的字符集为unicode时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int wmain(int argc, wchar_t *argv[])
当你程序当前的字符集为ANSI时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int main(int argc, char *argv[])
2. CCommFunc::GetProgrammeDir 获取程序当前路径
GetModuleFileName 函数返回当前进程已加载可执行或DLL文件的完整路径名(以'\0'终止),该模块必须由当前进程地址空间加载。如果想要获取另一个已加载模块的文件路径,可以使用GetModuleFileNameEx()函数。
strPath = strPath.substr(0, strPath.rfind("\\")+1); 从右边找/符号,取/和/左边的字符。
3.CIniFile
ReadString 读取一个字符串值
ReadInt 读取一个整数值
WriteString 在指定的section,key处写入一个字符串值
WriteInt 在指定的section,key处写入一个整数值
load_ini_file 加载配置文件
GetPrivateProfileString 解析配置文件
4.assert https://www.cnblogs.com/lvchaoshun/p/7816288.html
5.CreateMutex CreateMutex是一个计算机函数,作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。
MYTRACE(LOG_LEVEL_INFO,"BaseStationService start."); 定义如下:
#define MYTRACE(ilevel, ...) g_ClientLog.WriteLog(ilevel, __FILE__, __LINE__, __VA_ARGS__)
7.WaitForSingleObject 使线程处于等待状态,如等待某一事件的触发。
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
DWORD WINAPI WaitForSingleObject( HANDLE hHandle, //等待的触发句柄 , 如前面说的Event的句柄 DWORD dwMilliseconds //等待多长时间,单位ms 如5000 则为5s 若为INFINITE表示无限等待 );
返回值:
8.// 先获取文件大小
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fclose(fp);
9.
char szBuff[1024] = {0};
va_list argptr;
va_start(argptr, pszFmt); vsnprintf(szBuff, , pszFmt, argptr); va_end(argptr);
va_start,函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程。 10.vsnprintf 是C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。头文件是#include <stdarg.h>。
- char *str [out],把生成的格式化的字符串存放在这里.
- size_t size [in], str可接受的最大字符数 (非字节数,UNICODE一个字符两个字节),防止产生数组越界.
- const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
- va_list ap [in], va_list变量. va:variable-argument:可变参数
函数功能:将可变参数格式化输出到一个字符数组。
11.GetLocalTime GetLocalTime是一个Windows API 函数,用来获取当地的当前系统日期和时间。
12.ReleaseMutex ReleaseMutex是一种线性指令,具有释放线程拥有的互斥体的控制权。
互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex))。互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。
13
HANDLE m_hEventStopThread; //心跳线程事件句柄 HANDLE m_hLiveThread; //心跳线程句柄 bool m_bLive; //和总线连接标志 // CBuffPool m_poolBuff; //全局的简单的内存池 int i_count_Msg; //记录抛包数量
14.extern "C"
msgswitch动态库没有源代码,不需要了解 Init1 初始模块
15.::RegisterNotify 注册回调处理函数,属于MFC全局的函数,所以要加::
16.HANDLE https://blog.csdn.net/baidu_18598927/article/details/60604959
在windows环境中,句柄是用来标识项目的,这些项目包括:模块,任务,实例,文件,内存块,菜单,控制,字体,资源,包括图标,光标,字符串等,GDI对象,所括位图,画刷,元文件,调色板,画笔,区域,以及设备描述表句柄是用来标识(被应用程序所建立或使用的)对象的唯一整数,windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
17.CMsgSwitchMgr::CMsgSwitchMgr( void )构造函数初始化
CMsgSwitchMgr::CMsgSwitchMgr( void ) :m_hLiveThread(NULL) ,m_hEventStopThread(NULL) ,m_bLive(false) { }
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
18.CreateEvent CreateEvent是一个Windows API函数。它用来创建或打开一个命名的或无名的事件对象。如果想为对象指定一个访问掩码,应当使用CreateEventEx函数。
_ptiddata ptd; // 指向线程数据块
_ptiddata ptd; //pointer to per-thread data 见注1 uintptr_t thdl; //thread handle 线程句柄 unsigned long err = 0L; //Return from GetLastError() unsigned dummyid; //dummy returned thread ID 线程ID号 --------------------- 作者:MoreWindows 来源:CSDN 原文:https://blog.csdn.net/morewindows/article/details/7421759 版权声明:本文为博主原创文章,转载请附上博文链接!
https://blog.csdn.net/morewindows/article/details/7421759
具体看上面这个,很详细。虽然我看得不大懂。
由上面的源代码可知,_beginthreadex()函数在创建新线程时会分配并初始化一个_tiddata块。这个_tiddata块自然是用来存放一些需要线程独享的数据。事实上新线程运行时会首先将_tiddata块与自己进一步关联起来。然后新线程调用标准C运行库函数如strtok()时就会先取得_tiddata块的地址再将需要保护的数据存入_tiddata块中。这样每个线程就只会访问和修改自己的数据而不会去篡改其它线程的数据了。因此,如果在代码中有使用标准C运行库中的函数时,尽量使用_beginthreadex()来代替CreateThread()。相信阅读到这里时,你会对这句简短的话有个非常深刻的印象,如果有面试官问起,你也可以流畅准确的回答了^_^。
---------------------
作者:MoreWindows
来源:CSDN
原文:https://blog.csdn.net/morewindows/article/details/7421759
版权声明:本文为博主原创文章,转载请附上博文链接!
21.https://blog.csdn.net/vict_wang/article/details/81288272?utm_source=blogxgwz0
private: static CBSApp* m_pInstance; //单实例对象指针
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
22. MYSQL* m_db_ptr;
23.TLock
InitializeCriticalSection https://blog.csdn.net/ccrrt/article/details/8099297
24.LiveThread函数:
WAIT_OBJECT_0 :表示你等待的对象(比如线程、互斥体)已的正常执行完成或完成释放。
25.querySQL
26.mysql_real_query
执行由query指向的SQL查询,它应该是一个length个字节的字符串。查询必须由一个单个的SQL语句组成。你不应该在语句后增加一个终止的分号(“;”)或\g。
对于包含二进制数据的查询,你必须使用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因为它对查询字符串调用strlen()。
mysql_store_result 成功调用mysql_query()后,mysql_store_result()能够返回NULL。
mysql_fetch_row() mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组。
mysql_num_rows 返回结果集中行的数量。
27.Json::Value Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array
其中的parse函数
(jReader.parse(szdata, jReadValue))
28.freopen freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
29.void CSerialDataForVRS::Serialize( string& strData,int BSID )函数
30.该进程或线程自上一个步骤以来已更改,原因是,数据一直在接收,消息判断一直在更新。
31.DecodeInterface 动态库接口。
---恢复内容结束---
Basestation函数解析(一)的更多相关文章
- Basestation函数解析(二)
---恢复内容开始--- 这部分从Basestation的RecvDataThread开始,流程为 RecvDataThread->RecvData->Decoder->PostDa ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- PHP json_decode 函数解析 json 结果为 NULL 的解决方法
在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...
- Matlab中bsxfun和unique函数解析
一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- sigaction函数解析
http://blog.chinaunix.net/uid-1877180-id-3011232.html sigaction函数解析 sigaction函数的功能是检查或修改与指定信号相关联的处理 ...
- driver_register()函数解析
driver_register()函数解析 /** * driver_register - register driver with bus * @drv: driver to register * ...
- async函数解析
转载请注明出处:async函数解析 async函数是基于Generator函数实现的,也就是说是Generator函数的语法糖.在之前的文章有介绍过Generator函数语法和异步应用,如果对其不了解 ...
- tf.train.shuffle_batch函数解析
tf.train.shuffle_batch (tensor_list, batch_size, capacity, min_after_dequeue, num_threads=1, seed=No ...
随机推荐
- C# using用法
一.using指令 使用using指令在文件顶部引入命名空间,如 using System; using System.IO; 二.using别名 用using为命名空间或类型定义别名,当引入的多个命 ...
- [HNOI 2018]转盘
Description 题库链接 在一个环上有 \(n\) 个物品,第 \(i\) 个物品的出现时间为 \(T_i\) .一开始你可以任意选择一个物品的位置作为起始位置,然后以这个位置为起点沿正方向走 ...
- 通过set赋值,与select赋值的区别
---通过set赋值,与select赋值的区别.declare @a int--set @a=(select count(*) from TblStudent)select @a=count(*) f ...
- JavaScript unshift()怎样添加数据的?
var a = new Array(); a.unshift("red", "green"); a.unshift("black"); 这个 ...
- 基于Udp的五子棋对战游戏
引言 本文主要讲述在局域网内,使用c#基于Udp协议编写一个对战的五子棋游戏.主要从Udp的使用.游戏的绘制.对战的逻辑这三个部分来讲解. 开发环境:vs2013,.Net4.0,在文章的末尾提供源代 ...
- Docker for Windows(三)Docker镜像与容器的区别&常用命令
Docker镜像(Image)是一堆只读文件(read-only layer),容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是 ...
- react组件更新swiper
如果swiper渲染出来的数据不是写死的,那么就会涉及到swiper的更新, 那么我们在new 出 swiper 实例的时候,就需要把这个实例添加到组件里面去,在更新的或卸载的时候就可以直接使用 sw ...
- Spring Boot—05页面跳转
package com.smartmap.sample.ch1.controller.view; import org.springframework.stereotype.Controller; i ...
- RNN & LSTM & GRU 的原理与区别
RNN 循环神经网络,是非线性动态系统,将序列映射到序列,主要参数有五个:[Whv,Whh,Woh,bh,bo,h0][Whv,Whh,Woh,bh,bo,h0],典型的结构图如下: 和普通神经网 ...
- 0ctf2018 pwn
前言 对 0ctf2018 的 pwn 做一个总结 正文 babystack 漏洞 非常直接的 栈溢出 ssize_t sub_804843B() { char buf; // [esp+0h] [e ...