小编mit*_*llJ的帖子

为什么要避免在HRESULT处理中使用宏?

为什么在定义错误/ HRESULT处理/记录时选择或不选择使用宏?

我正在通过接口调用一个错误处理类,因此可以在需要的时间和地点使用Boost共享指针来调用该类。(说实话;我不知道这是否是最好的方法,但我主要是想看看我是否能做到以及它的外观)。即:

typedef std::shared_ptr<iErrorHandling> Error_Handler;

Error_Handler Err_Handler(new ErrHandling);

if (error)
{
    Err_Handler->vDX_ERR(ERR_D3D_INIT_SWAP);
}
Run Code Online (Sandbox Code Playgroud)

我开始将类与DirectX一起使用,因为DirectX需要大量的HRESULT处理,因此我被指向使用宏来避免所有if / else语句。我遇到了这个:

#define lengthof(rg) (sizeof(rg)/sizeof(*rg))

inline const char* StringFromError(char* szErr, long nSize, long nErr)
{
    _ASSERTE(szErr);
    *szErr = 0;
    DWORD cb = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErr, 0, szErr, nSize, 0);
    char szUnk[] = "<unknown>";
    if( !cb && nSize >= lengthof(szUnk) ) lstrcpyA(szErr, szUnk);
    return szErr;
}

inline HRESULT TraceHR(const char* pszFile, long nLine, HRESULT hr)
{
    if( FAILED(hr) )
    {
        char szErr[128];
        char sz[_MAX_PATH + lengthof(szErr) …
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
528
查看次数

没有Args的KeWaitForSingleObject

我目前正在尝试调试系统死锁,我很难理解这一点.

Child-SP          RetAddr           : Args to Child                                                           : Call Site
fffff880`035cb760 fffff800`02ecef72 : 00000000`00000002 fffffa80`066e8b50 00000000`00000000 fffffa80`066a16e0 : nt!KiSwapContext+0x7a
fffff880`035cb8a0 fffff800`02ee039f : fffffa80`0b9256b0 00000000`000007ff 00000000`00000000 00000000`00000000 : nt!KiCommitThreadWait+0x1d2
fffff880`035cb930 fffff880`0312a5e4 : 00000000`00000000 fffff800`00000000 fffffa80`079a3c00 00000000`00000000 : nt!KeWaitForSingleObject+0x19
Run Code Online (Sandbox Code Playgroud)

为什么KeWaitForSingleObject的第一个参数为null?

除非我误解不是第一个参数正在等待的对象?死锁只是说这个线程没有等待或是这种普通的行为吗?

另外,我看到另一个显示类似堆栈跟踪的进程(services.exe):

1: kd> .thread fffffa800d406b50
Implicit thread is now fffffa80`0d406b50
1: kd> kv
  *** Stack trace for last set context - .thread/.cxr resets it
Child-SP          RetAddr           : Args to Child                                                           : Call Site
fffff880`09ed4800 fffff800`02ecef72 : fffffa80`0d406b50 fffffa80`0d406b50 00000000`00000000 fffff8a0`00000000 : …
Run Code Online (Sandbox Code Playgroud)

windows windows-nt windbg

4
推荐指数
1
解决办法
711
查看次数

无法设置FillBackgroundColor

NPOI 2.0.6.0在一个C#项目中使用,我遇到了改变样式的困难.虽然我可以影响字体和单元格边框,但我无法更改背景颜色.

private void buildSheet(HSSFWorkbook wb, DataTable data, string sheetName)
{
    var cHelp = wb.GetCreationHelper();
    var sheet = wb.CreateSheet(sheetName);

    HSSFFont hFont = (HSSFFont)wb.CreateFont();

    hFont.Boldweight = (short)FontBoldWeight.Bold;
    hFont.Color = HSSFColor.White.Index;
    hFont.FontHeightInPoints = 18;

    HSSFCellStyle hStyle = (HSSFCellStyle)wb.CreateCellStyle();
    hStyle.SetFont(hFont);
    hStyle.BorderBottom = BorderStyle.Medium;
    hStyle.FillBackgroundColor = HSSFColor.Black.Index;

    IRow headerRow = sheet.CreateRow(1);


    int cellCount = 1;
    foreach (string str in colHeaders)
    {
        HSSFCell cell = (HSSFCell)headerRow.CreateCell(cellCount);
        cell.SetCellValue(cHelp.CreateRichTextString((str)));
        cell.CellStyle = hStyle;

        cellCount += 1;
    }

    int rowCount = 2;
    foreach (DataRow dr …
Run Code Online (Sandbox Code Playgroud)

c# npoi

4
推荐指数
1
解决办法
8685
查看次数

DirectX异常处理

我在遵循DirectX上的rastertek教程的同时,还研究了David Abrahams(http://www.boost.org/community/exception_safety.html)的“ 通用组件中的异常安全性” 。

为什么(据所有人所知)在rastertek教程中以这种方式设置了异常处理,并且提供了什么级别的保护?

例如:

mhresult = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &mfeatureLevel, 1,
    D3D11_SDK_VERSION, &mswapChainDesc, &mswapChain, &mdevice, NULL, &mdeviceContext);

if (FAILED(mhresult))
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果在对CreateDevice的调用中发生未处理的异常,在我们检查mhresult的结果之前程序不会崩溃吗?

是调用带有HResult返回值的方法,还是仅返回布尔值,这是否有所不同?

result = mEstablishHW();
if (!result)
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

是否有其他方法可以提供强大的异常安全性而又不影响性能?

c++ directx exception-handling

0
推荐指数
1
解决办法
1403
查看次数

为什么通过宏调用的内联错误函数不会返回main?

我正在使用头文件来定义内联函数,以便通过使用宏将HRESULTS转储到即时窗口.

来自https://www.sellsbrothers.com/writing/a_young_person.htm:

#define lengthof(rg) (sizeof(rg)/sizeof(*rg))

inline const char* StringFromError(char* szErr, long nSize, long nErr)
{
    _ASSERTE(szErr);
    *szErr = 0;
    DWORD cb = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErr, 0, szErr, nSize, 0);
    char szUnk[] = "<unknown>";
    if (!cb && nSize >= lengthof(szUnk)) lstrcpyA(szErr, szUnk);
    return szErr;
}

inline void TraceHR(const char* pszFile, long nLine, HRESULT hr)
{

        char szErr[128];
        char sz[_MAX_PATH + lengthof(szErr) + 64];
        wsprintf(sz, "%s(%d) : error 0x%x: %s\n", pszFile, nLine, hr,
            StringFromError(szErr, lengthof(szErr), hr));
        OutputDebugString(sz);
        return;
}

#ifdef …
Run Code Online (Sandbox Code Playgroud)

c++ macros

0
推荐指数
1
解决办法
56
查看次数

查找所有打开的句柄或对 USB 驱动器的引用

我正在分析事后内核转储,并试图识别可能引用 USB 存储驱动器或对其打开句柄的所有进程和过滤器驱动程序。我尝试检查所有打开的句柄,但即使将其限制为仅 File 对象,数据也无法管理。所以我浏览了 !object \ list 以找到我正在寻找的音量:

3: kd> !devobj fffffa8007169cd0
Device object (fffffa8007169cd0) is for:
 HarddiskVolume6 \Driver\volmgr DriverObject fffffa8006af2060
Current Irp 00000000 RefCount 34 Type 00000007 Flags 00001050
Vpb fffffa8007168940 Dacl fffff9a10033a3c0 DevExt fffffa8007169e20 DevObjExt fffffa8007169f88 Dope fffffa80071688d0 DevNode fffffa800716b890 

3: kd> !vpb fffffa8007168940
Vpb at 0xfffffa8007168940
Flags: 0x1 mounted 
DeviceObject: 0xfffffa8008880030
RealDevice:   0xfffffa8007169cd0
RefCount: 34
Volume Label: 
Run Code Online (Sandbox Code Playgroud)

是否有可能找到所有这 34 个参考文献?是否有一种简单的方法可以从内存转储中识别使用任何给定卷的内容?

windows debugging windbg

0
推荐指数
1
解决办法
560
查看次数

标签 统计

c++ ×3

windbg ×2

windows ×2

c# ×1

debugging ×1

directx ×1

exception-handling ×1

macros ×1

npoi ×1

windows-nt ×1