windows 使用qt mingw730_64 编译ffmpeg

2022-4-10 C++

下载ffmpeg源码:https://www.ffmpeg.org/download.html

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

1. 安装MSYS2

    到https://www.msys2.org/下载最新的MSYS2安装包,一路next

2. 安装完成后启动MSYS2 MinGW x64

3. 安装make yasm diffutils pkg-config工具

pacman -S make yasm diffutils pkg-config

如因网络问题安装不上则修改c:\msys64\etc\pacman.d\mirrorlist.mingw64把tsinghua的源移到第一行

如Server=https://mirrors.tuna.stsinghua.edu.cn/msys2/mingw/x86_64

之后输入pacman -Sy重新加载下

4. 添加qtmingw730bin进PATH

如export PATH=/d/Qt/Qt5.14.2/Tools/mingw730_64/bin:$PATH

5. 配置ffmpeg如

./configure --enable-shared --arch=x86_64 --prefix=/d/ffmpeg/install

6. 之后就是make;make install等待编译完成

标签: ffmpeg qt mingw

评论(0) 浏览(12081)

T3 配置 lvds 点屏

2021-9-26 C++

T3通过配置操作可以实现lvds 配置的修改,实现点屏。

主要问题是:vesa模式与jeida模式

;lcd_lvds_mode:        0:NS mode; 1:JEIDA mode
;lcd_lvds_ab_reverse:  0: not reverse; 1:reverse

vesa 屏调试后点屏啥都OK,换乘jeida屏后,出现了重影,通过调整ab线解决该问题。

看网上其他的芯片都可以通过配置更改ab线极性,通过查看芯片数据手册,全志没做特别说明(有点坑)。

通过咨询代理,更改tcon0_lvds_even_odd_dir可以实现极性反转。

因此增加lcd_lvds_ab_reverse配置,之后就可以通过更改屏参解决ab线反转。

;----------------------------------------------------------------------------------
;lcd0 configuration

;lcd_if:               0:hv(sync+de); 1:8080; 2:ttl; 3:lvds; 4:dsi; 5:edp; 6:extend dsi
;lcd_x:                lcd horizontal resolution
;lcd_y:                lcd vertical resolution
;lcd_width:            width of lcd in mm
;lcd_height:           height of lcd in mm
;lcd_dclk_freq:        in MHZ unit
;lcd_pwm_freq:         in HZ unit
;lcd_pwm_pol:          lcd backlight PWM polarity
;lcd_pwm_max_limit     lcd backlight PWM max limit(<=255)
;lcd_hbp:              hsync back porch
;lcd_ht:               hsync total cycle
;lcd_vbp:              vsync back porch
;lcd_vt:               vysnc total cycle
;lcd_hspw:             hsync plus width
;lcd_vspw:             vysnc plus width
;lcd_lvds_if:          0:single link;  1:dual link
;lcd_lvds_colordepth:  0:8bit; 1:6bit
;lcd_lvds_mode:        0:NS mode; 1:JEIDA mode
;lcd_lvds_ab_reverse:  0: not reverse; 1:reverse
;lcd_frm:              0:disable; 1:enable rgb666 dither; 2:enable rgb656 dither
;lcd_io_phase:         0:noraml; 1:intert phase(0~3bit: vsync phase; 4~7bit:hsync phase;
;                      8~11bit:dclk phase; 12~15bit:de phase)
;lcd_gamma_en          lcd gamma correction enable
;lcd_bright_curve_en   lcd bright curve correction enable
;lcd_cmap_en           lcd color map function enable
;deu_mode              0:smoll lcd screen; 1:large lcd screen(larger than 10inch)
;lcdgamma4iep:         Smart Backlight parameter, lcd gamma vale * 10;
;                      decrease it while lcd is not bright enough; increase while lcd is too bright
;smart_color           90:normal lcd screen 65:retina lcd screen(9.7inch)
;----------------------------------------------------------------------------------
[lcd0]
lcd_used            = 1
lcd_driver_name     = "default_lcd"
lcd_backlight       = 128 
lcd_if              = 3
lcd_x               = 1920
lcd_y               = 1080 
lcd_width           =
lcd_height          =
lcd_dclk_freq       = 148
lcd_pwm_used        = 1
lcd_pwm_ch          = 0 
lcd_pwm_freq        = 300
lcd_pwm_pol         = 0
lcd_pwm_max_limit   = 255

lcd_ht              = 2200 
lcd_hbp             = 140
lcd_hspw            = 45 

lcd_vt              = 1125 
lcd_vbp             = 25 
lcd_vspw            = 5 

lcd_lvds_if         = 1
lcd_lvds_ch         = 1
lcd_lvds_colordepth = 0
lcd_lvds_mode       = 0
lcd_lvds_ab_reverse = 0
lcd_frm             = 0
lcd_hv_clk_phase    = 0
lcd_hv_sync_polarity= 0
lcd_gamma_en        = 0
lcd_bright_curve_en = 0
lcd_cmap_en         = 0

deu_mode            = 1
lcdgamma4iep        = 22
smart_color         = 90


标签: 全志 T3 ab线

评论(0) 浏览(2447)

设计模式总结

2020-5-20 C++

一、创造型

1. 抽象工厂模式(Abstract Factory)

    a) 分离了具体的类

    b) 有利于产品的一致性

    c) 使得易于交换产品系列

    d) 难于支持新种类的产品(需要扩展接口就涉及到对所有子类的修改)

2. 生成器(Builder)

    a) 可以改变一个产品的内部表示(定义一个新的生成器)

    b) 将构建代码与表示代码分开

    c) 可对构建过程进行更精细的控制

3. 工厂方法(Factory Method)

    a) 为子类提供挂钩

    b) 连接平行的类层次


未完。。待续。。

标签: 设计模式

评论(0) 浏览(5275)

windows 与 USB设备进行数据交换实现

2019-12-5 C++

需求:上位机通过USB与下位机进行数据交互

实现:

打开设备:


static LONG HidOpen(DWORD HidUsbMian, DWORD HidUsbSub)
{
//hid设备GUID
CString strHidPath(_T(""));
HDEVINFO deviceInfoSet = INVALID_HANDLE_VALUE;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = NULL;
SP_DEVINFO_DATA devinfoData;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
ZeroMemory(&deviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
ZeroMemory(&devinfoData, sizeof(SP_DEVINFO_DATA));
devinfoData.cbSize = sizeof(SP_DEVINFO_DATA);
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
GUID interfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} };
deviceInfoSet = SetupDiGetClassDevsA(&interfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
int deviceIndex = 0;
BOOL bExit = FALSE;
for ( ; bExit == FALSE; )
{
do
{
HANDLE writeHandle = INVALID_HANDLE_VALUE;
DWORD dwRequiredSize = 0;
BOOL res = SetupDiEnumDeviceInterfaces(deviceInfoSet,
NULL,
&interfaceClassGuid,
deviceIndex,
&deviceInterfaceData);
if (res == FALSE)
{
bExit = TRUE;
break;
}

BOOL bFind = FALSE;
for (int i = 0; ; ++i)
{
TCHAR szDriverName[MAX_PATH] = { 0 };
res = SetupDiEnumDeviceInfo(deviceInfoSet, i, &devinfoData);
if (res == FALSE)
{
break;
}
res = SetupDiGetDeviceRegistryProperty(deviceInfoSet, &devinfoData,
   SPDRP_CLASS, NULL, reinterpret_cast<PBYTE>(szDriverName), sizeof(szDriverName), NULL);
if (res == FALSE)
{
break;
}
if (_tcscmp(szDriverName, _T("HIDClass")) == 0) 
{
res = SetupDiGetDeviceRegistryProperty(deviceInfoSet, &devinfoData,
   SPDRP_DRIVER, NULL, reinterpret_cast<PBYTE>(szDriverName), sizeof(szDriverName), NULL);
if (res == TRUE)
{
bFind = TRUE;
break;
}
}
}
//不是有效的设备的继续
if (FALSE == bFind)
{
break;
}
res = SetupDiGetDeviceInterfaceDetail(deviceInfoSet,
&deviceInterfaceData,
NULL,
0,
&dwRequiredSize,
NULL);
pDeviceInterfaceDetailData = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(malloc(dwRequiredSize));
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
res = SetupDiGetDeviceInterfaceDetail(deviceInfoSet,
&deviceInterfaceData,
pDeviceInterfaceDetailData,
dwRequiredSize,
NULL,
NULL);

writeHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
/*FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/
if (writeHandle == INVALID_HANDLE_VALUE) 
{
break;
}
HIDD_ATTRIBUTES attrib;
attrib.Size = sizeof(HIDD_ATTRIBUTES);
HidD_GetAttributes(writeHandle, &attrib);
/*
if ((HidUsbMian == 0x0 || attrib.VendorID == HidUsbMian)
&& (HidUsbSub == 0x0 || attrib.ProductID == HidUsbSub))
*/
if (attrib.VendorID == HidUsbMian && attrib.ProductID == HidUsbSub)
{
strHidPath = pDeviceInterfaceDetailData->DevicePath;
}
CloseHandle(writeHandle);
} while (0);
if (pDeviceInterfaceDetailData != NULL)
{
free(pDeviceInterfaceDetailData);
pDeviceInterfaceDetailData = NULL;
}
if (strHidPath != _T(""))
{
break;
}
++deviceIndex;
}
if (strHidPath == _T(""))
{
return 0;
}

HANDLE openHandle = CreateFile(strHidPath, 
GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
FILE_FLAG_OVERLAPPED, 0);
HANDLE readHandle = CreateFile(strHidPath, 
GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
0, 0);
/*FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/
if (openHandle == INVALID_HANDLE_VALUE)
{
return NULL;
}
do
{
PHIDP_PREPARSED_DATA ppData = NULL;
HIDP_CAPS caps;
if (0)//0 == HidD_SetNumInputBuffers(openHandle, 512))
{
::OutputDebugString(_T("-------------HidD_SetNumInputBuffers Failed-------\r\n"));
break;
}
if (0 == HidD_GetPreparsedData(openHandle, &ppData))
{
::OutputDebugString(_T("-------------HidD_GetPreparsedData Failed-------\r\n"));
break;
}

NTSTATUS ntStatus = HidP_GetCaps(ppData, &caps);
if (ntStatus != HIDP_STATUS_SUCCESS)
{
::OutputDebugString(_T("-------------HidP_GetCaps Failed-------\r\n"));
break;
}
{
CString strMsg(_T(""));
strMsg.Format(_T("--Input Length[%d]---Output Length[%d]----\r\n"), caps.InputReportByteLength, caps.OutputReportByteLength);
::OutputDebugString(strMsg);
}
HidD_FreePreparsedData(ppData);
PHidDevice dev = NewHidDevice();
if (dev != NULL)
{
dev->deviceHandle = openHandle;
dev->deviceReadHandle = readHandle;
int nBufLen = (strHidPath.GetLength() + 1);
dev->devicePath = new TCHAR[nBufLen];
if (dev->devicePath != NULL)
{
memset(dev->devicePath, 0, nBufLen * sizeof(TCHAR));
_tcscpy_s(dev->devicePath, nBufLen, strHidPath.GetString());
}
}
return reinterpret_cast<long>(dev);
} while (0);

if (openHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(openHandle);
openHandle = INVALID_HANDLE_VALUE;
}
if (readHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(readHandle);
readHandle = INVALID_HANDLE_VALUE;
}
return 0;
}
读数据:

ReadFile(handle, buf, 18, &dwReaded, NULL) ;

写数据:

OVERLAPPED ol;
memset(&ol, 0, sizeof(OVERLAPPED));
ol.hEvent = ::CreateEventA(NULL, TRUE, FALSE, NULL);
do
{
int nCurLen = nBufSize >= 8 ? 8 : nBufSize;
memset(buf, 0, 11);
buf[0] = 0x00;
buf[1] = LOBYTE(nCurLen);
buf[2] = 0x00;
memcpy(buf + 3, pTmp, nCurLen);
ResetEvent(ol.hEvent);
BOOL bRet = WriteFile(dev->deviceHandle, reinterpret_cast<LPVOID>(buf), 11, &dwWrited, &ol);
if (bRet == FALSE)
{
DWORD dwTmp = 0;
GetOverlappedResult(dev->deviceHandle, &ol, &dwTmp, TRUE);
}

pTmp += nCurLen;
nBufSize -= nCurLen;
} while (nBufSize > 0);

if (ol.hEvent != NULL)
{
CloseHandle(ol.hEvent);
}
坑1:

传输大数据时,在有的电脑,会出现卡死情况

解决方式:

读跟写句柄分开创建,具体原因不明  

标签: c++ USB 设备读写

评论(0) 浏览(4219)

MFC 函数注入

2019-11-22 C++

问题:

USB 通信DLL代码找不到,无法知道通信协议

解决思路:

注入windows相关接口,查看通信过程中发送的协议

实现代码:比如注入CreateFile

typedef HANDLE(WINAPI * Real_CreateFile) (
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);

1. 保存函数调用地址

BYTE g_oldJmp[6] = { 0 };
BYTE g_jmp[6] = { 0 };

2. 实现注入函数 执行函数前先恢复原接口函数地址,执行完再设置为更改后的地址

HANDLE WINAPI Routed_CreateFile(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
CStringW strTmp(lpFileName);
HANDLE handle = NULL;
VirtualProtect((LPVOID)g_pOrigCreateFile, 6, g_myProtect, NULL); //ReadWrite again
memcpy(g_pOrigCreateFile, g_oldJmp, 6); //Unhook API
handle = CreateFileW(strTmp.GetString(), dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
memcpy(g_pOrigCreateFile, g_jmp, 6); //Rehook API
VirtualProtect((LPVOID)g_pOrigCreateFile, 6, g_oldProtect, NULL); //Normal setts
CStringW strMsg(_T(""));
strMsg.Format(L"%s %x %x %x %x %x\r\n", strTmp.GetString(), dwDesiredAccess, dwShareMode, handle, dwCreationDisposition, dwFlagsAndAttributes);
::OutputDebugStringW(strMsg);
return handle;
}


//注入接口
void BeginRedirect(LPVOID newFunction, LPVOID oldFunction, BYTE *jmp, BYTE *oldJmp)
{
BYTE tempJMP[6] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; 
memcpy(jmp, tempJMP, 6);
DWORD dwJMPSize = (reinterpret_cast<DWORD>(newFunction) - reinterpret_cast<DWORD>(oldFunction) - 5);
VirtualProtect(oldFunction, 6, PAGE_EXECUTE_READWRITE, &g_oldProtect);
//Change memory settings to make sure we can write the JMP in
memcpy(oldJmp, oldFunction, 6); //Copy old bytes before writing JMP
memcpy(&jmp[1], &dwJMPSize, 4); //Write the address to JMP to
memcpy(oldFunction, jmp, 6); //Write it in process memory
VirtualProtect((LPVOID)oldFunction, 6, g_oldProtect, NULL); //Change 
}

//初始化

g_pOrigCreateFile = reinterpret_cast<Real_CreateFile>(GetProcAddress(GetModuleHandle("Kernel32.dll"), "CreateFileW")); 
if (g_pOrigCreateFile != NULL)
{
BeginRedirect(Routed_CreateFile, g_pOrigCreateFile, g_jmp, g_oldJmp);
}

标签: c++ 函数hook

评论(0) 浏览(3056)

wireshark抓包数据获取rtsp请求的视频流

2019-1-17 C++

lua脚本下载:https://github.com/volvet/h264extractor 

1. 安装wireshark软件

2. 编辑wireshark安装目录底下的init.lua,设置disable_lua = false;

3. 在init.lua的最后加上dofile(DATA_DIR.."rtp_h264_extractor.lua")

4. 把rtp_h264_extractor.lua放在wireshark同一路径下

5. 打开wireshark抓取的网络数据流

6.设置过滤条件分析:如rtsp.method == "PLAY" && ip.src == 1.1.1.1

获取ip地址为1.1.1.1请求的所有rtsp视频流

7.通过tcp端口获取要分析的视频流的所有交互数据:如tcp.port == 57109

获取通过57109该端口交互的rtsp视频流数据

8.导出该视频流数据:文件->导出特定分组 All packets Displayed

9.查看导出的数据视频流编码格式:

查找抓包数据服务端对客户端DESCRIBE请求的回复数据包,找到Media Attribute节点

查看编码是否H264,及type值 如96,如是H264则继续往下

10.设置H264的编码载体类型

编辑->首选项->Protocols->H264设置H264 dynamic payload types为96

11.导出H264数据裸流:工具->Extract h264 stream from RTP

12.在数据流的同一目录底下生成dump.264

13.打开vlc,设置分流器为H264

工具->偏好设置->全部(出来高级偏好设置)->输入/编解码器->分流器->分流模块->H264

14.编号生成的dump.264文件


标签: wireshark H264 rtsp

评论(0) 浏览(6605)

CStdioFile Unicode ReadString 读取汉字乱码

2018-10-21 C++

     1. Unicode 模式下ReadString 需要使用typebinary读取文本,中文才不会乱码

        CStdioFile file;

        if (file.Open(filePath, CFile::modeRead | CFile::typeBinary) == TRUE)
        {
            CString strLine(_T(""));
            WORD sign;
            file.Read(&sign, 2);
            while (file.ReadString(strLine))
            {
                 m_listInfo.InsertString(m_listInfo.GetCount(), strLine);
            }
            file.Close();
        }

标签: MFC StdioFile ReadString

评论(0) 浏览(3566)

利用dll生成lib

2018-4-29 C++

业务场景:

使用libvlc3.02 SDK提供的lib及dll编译运行程序,提示找不到XXX于动态链接库libvlc.dll上

解决办法:

直接利用libvlc.dll生成libvlc.lib

步骤:

dumpbin.exe:dll导出函数

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin>dumpbin libvlc.dll /EXPORTS /OUT:libvlc.def

编辑libvlc.def只留下函数所在的行

          1    0 00002B30 libvlc_add_intf
          2    1 0000BB60 libvlc_audio_equalizer_get_amp_at_index
          3    2 0000B980 libvlc_audio_equalizer_get_band_count

python:格式化def

file = open(r"D:\Beihai\python\libvlco.def")
files = open(r"D:\Beihai\python\libvlc.def", "w")
fc = 1
while 1 :
    line = file.readline()
    if not line :
        break
    sl = line.split()
    #print sl[-1]
    nl = sl[-1] + " @ " + str(fc) + "\n"
    fc = fc + 1
    files.write(nl)
file.close()
files.close()

lib:利用def生成lib

lib /def:libvlc.def /MACHINE:IX86 /out:libvlc.lib



标签: python c++ def dll

评论(0) 浏览(2677)

百度地图坐标与GPS坐标的转换

2018-3-25 C++

参考各种坐标的转换:https://blog.csdn.net/doulejian/article/details/70155080

GPS坐标在百度地图上显示位置:http://developer.baidu.com/map/jsdemo.htm#a5_2

获取百度地图坐标点:http://api.map.baidu.com/lbsapi/getpoint/index.html

#pragma once

static const double PI = 3.1415926535897932384626;
static const double A = 6378245.0;
static const double EE = 0.00669342162296594323;
class Gps
{
public:
Gps(void){}
~Gps(void){}
Gps(double wgLat, double wgLon)
{
SetWgLat(wgLat);
SetWgLon(wgLon);
}

double GetWgLat()
{
return m_wgLat;
}

void SetWgLat(double wgLat)
{
m_wgLat = wgLat;
}

double GetWgLon()
{
return m_wgLon;
}

void SetWgLon(double wgLon)
{
m_wgLon = wgLon;
}

Gps Transform(double lat, double lon)
{
if (TRUE == OutOfChina(lat, lon))
{
return Gps(lat, lon);
}

double dLat = TransformLat(lon - 105.0, lat - 35.0);
double dLon = TransformLon(lon - 105.0, lat - 35.0);
double radLat = lat / 180.0 * PI;
double magic = sin(radLat);
magic = 1 - EE * magic * magic;
double sqrtMagic = sqrt(magic);
dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
dLon = (dLon * 180.0) / (A / sqrtMagic * cos(radLat) * PI);
double mgLat = lat + dLat;
double mgLon = lon + dLon;
return Gps(mgLat, mgLon);
}

double TransformLat(double x, double y)
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
+ 0.2 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0;
ret += (20.0 * sin(y * PI) + 40.0 * sin(y / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * sin(y / 12.0 * PI) + 320 * sin(y * PI / 30.0)) * 2.0 / 3.0;
return ret;
}

double TransformLon(double x, double y)
{
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y
+ 0.1 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0;
ret += (20.0 * sin(x * PI) + 40.0 * sin(x / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * sin(x / 12.0 * PI) + 300.0 * sin(x / 30.0 * PI)) 
* 2.0 / 3.0;
return ret;
}

BOOL OutOfChina(double lat, double lon) 
{
if (lon < 72.004 || lon > 137.8347)
{
return TRUE;
}
if (lat < 0.8293 || lat > 55.8271)
{
return TRUE;
}
return FALSE;
}

Gps Bd09ToGcj02(double bdLat, double bdLon)
{
double x = bdLon - 0.0065;
double y = bdLat - 0.006;
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * PI);
double theta = atan2(y, x) - 0.000003 * cos(x * PI);
double ggLon = z * cos(theta);
double ggLat = z * sin(theta);
return Gps(ggLat, ggLon);

}

Gps Gcj02ToGps84(double bdLat, double bdLon)
{
Gps gps = Transform(bdLat, bdLon);
double lon = bdLon * 2 - gps.GetWgLon();
double lat = bdLat * 2 - gps.GetWgLat();
return Gps(lat, lon);
}

Gps Bd09ToGps84()
{
Gps gcj02 = Bd09ToGcj02(m_wgLat, m_wgLon);
Gps map84 = Gcj02ToGps84(gcj02.GetWgLat(), gcj02.GetWgLon());
return map84;
}

private:
double m_wgLat;
double m_wgLon;
};


标签: 百度坐标 GPS

评论(0) 浏览(4658)

windows程序崩溃时产生dmp

2017-12-30 C++

需求:windows程序崩溃时产生dmp

解决方案:

stdafx.h增加如下内容:

#include <Dbghelp.h>

//异常dmp捕获
void SetMyUnhandledExceptionFilter();

stdafx.cpp增加如下内容:

//生产DUMP文件
int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PTCHAR pwAppName)
{
BOOL bOwnDumpFile = FALSE;
HANDLE hDumpFile = hFile;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;

typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);

MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll"));
if(NULL == hDbgHelp)
{
return EXCEPTION_EXECUTE_HANDLER;
}

pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
if(NULL == pfnMiniDumpWriteDump)
{
return EXCEPTION_EXECUTE_HANDLER;
}

if(hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
{
TCHAR szFileName[MAX_PATH] = { 0 };
TCHAR* szVersion = _T("v1.0");
int dwBufferSize = MAX_PATH;
SYSTEMTIME stLocalTime = { 0 };

GetLocalTime(&stLocalTime);

//wsprintf(szFileName, L"%s%s", szPath, szAppName);
//CreateDirectory(szFileName, NULL);
_stprintf_s(szFileName, MAX_PATH, _T("%s-%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp"),
pAppName,
szVersion,
stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
GetCurrentProcessId(), GetCurrentThreadId());
hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
}

if(hDumpFile != INVALID_HANDLE_VALUE)
{
ExpParam.ThreadId = GetCurrentThreadId();
ExpParam.ExceptionPointers = pExceptionPointers;
ExpParam.ClientPointers = FALSE;

pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);

CloseHandle(hDumpFile);
}

if(hDbgHelp != NULL)
{
FreeLibrary(hDbgHelp);
}
return EXCEPTION_EXECUTE_HANDLER;
}

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
if (IsDebuggerPresent())
{
return EXCEPTION_CONTINUE_SEARCH;
}

return GenerateMiniDump(NULL, lpExceptionInfo, _T("XXXXX"));
}



void DisableSetUnhandledExceptionFilter()
{
 void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")) ,"SetUnhandledExceptionFilter");
if(addr)
{
unsigned char code[16] = { 0 };
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
code[size++] = 0xC2;
code[size++] = 0x04;
code[size++] = 0x00;

DWORD dwOldFlag,dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag ,&dwTempFlag);
}
}


void SetMyUnhandledExceptionFilter()
{
SetUnhandledExceptionFilter(NULL);
SetUnhandledExceptionFilter(&ExceptionFilter);
DisableSetUnhandledExceptionFilter();
}

程序入口添加如下内容:

SetMyUnhandledExceptionFilter();

程序所在目录添加:DbgHelp.dll文件



标签: MFC dmp windows

评论(0) 浏览(18757)

Powered by EMLOG Copyright @ 深圳市炽旗科技 版权所有. 闽ICP备14012694号-2