小编Mor*_*hai的帖子

如何获得枚举的基本类型?

声明如下:

enum DrawBoldMode : unsigned
{
    DBM_NONE =              0,
    DBM_ITEM =              1<<0,   // bold just the nearest line
    DBM_SECTION =           1<<1,   // bold all lines in the same section
    DBM_LINETYPE =          1<<2,   // bold all lines of the same line type
    DBM_POINTAGE =          1<<3,   // bold all lines of the same line type
};
Run Code Online (Sandbox Code Playgroud)

如何导出DrawBoldMode的基础类型(即无符号)?

c++ templates c++11

10
推荐指数
2
解决办法
1439
查看次数

资源文件是编译为UNICODE还是ANSI代码页?

首先 - 如果已经回答了一百次,我很抱歉!D'哦!

但我的搜索显然很糟糕,因为我没有运气回答这个基本问题:

资源如何存储在EXE/DLL中?作为UNICODE(UCS-2,Windows本机内部字符格式),还是使用资源块代码页的多字节字符?

  • 如何将UNICODE字符串嵌入到一个资源(.rc)中?
  • 可以将UNICODE(UCS-2)文本插入到VS 2012中的语言字符串中吗?
  • Windows仍在使用UCS-2,还是内部使用UTF16?

我只是寻找一般答案或链接到详细信息,而不是将UNICODE字符串放入.rc字符串表的详细方法.谢谢!

c++ dll resources winapi rc

10
推荐指数
1
解决办法
5129
查看次数

一个反复出现的常数

我经常发现自己必须定义一个函数的两个版本,以便有一个是const的,一个是非const的(通常是一个getter,但并不总是).两者的不同之处仅在于一个的输入和输出是const,而另一个的输入和输出是非const.功能的胆量 - 真正的工作,是IDENTICAL.

然而,为了保持正确性,我需要它们.作为一个简单的实际示例,请采取以下措施:

inline const ITEMIDLIST * GetNextItem(const ITEMIDLIST * pidl)
{
    return pidl ? reinterpret_cast<const ITEMIDLIST *>(reinterpret_cast<const BYTE *>(pidl) + pidl->mkid.cb) : NULL;
}

inline ITEMIDLIST * GetNextItem(ITEMIDLIST * pidl)
{
    return pidl ? reinterpret_cast<ITEMIDLIST *>(reinterpret_cast<BYTE *>(pidl) + pidl->mkid.cb) : NULL;
}
Run Code Online (Sandbox Code Playgroud)

如你所见,他们做同样的事情.我可以选择用另一个使用更多的演员来定义一个,如果胆量 - 实际工作,则更为简单:

inline const ITEMIDLIST * GetNextItem(const ITEMIDLIST * pidl)
{
    return pidl ? reinterpret_cast<const ITEMIDLIST *>(reinterpret_cast<const BYTE *>(pidl) + pidl->mkid.cb) : NULL;
}

inline ITEMIDLIST * GetNextItem(ITEMIDLIST * pidl)
{
    return const_cast<ITEMIDLIST *>(GetNextItem(const_cast<const ITEMIDLIST …
Run Code Online (Sandbox Code Playgroud)

c++

9
推荐指数
2
解决办法
631
查看次数

如何在Windows shell中为文件类型添加辅助动词?

Windows shell编程的基本思想是,您可以将给定的文件类型(扩展名)与MS当前调用的编译器(例如,Company.Type.Ver)相关联:

HKCR\.txt @ = Acme.Text.1

HKCR\Acme.Text.1 @ =这是Acme文本文件关联的progid

然后Acme Corp可以将尽可能多的shell动词作为HKCR\Acme.Text.1\shell的子键,例如HKCR\Acme.Text.1\shell\open.

但如果我是XyzCorp,如何在文本文件中添加辅助动词?

我不想篡夺主文件关联 - 我很高兴它与Acme.Text.1相关联,但我想添加"导入到Xyz编辑器".

我可以:
1.向Acme的progid添加一个动词(例如HKCR\Acme.Text.1\shell\my-verb)
2.代表我们创建一个新的progid并将Acme的数据复制到那个,并将XyzCorp的动词合并到
3.将动词直接添加到文件扩展名(至少有一个曾经能够这样做)
4.???

有谁知道这个"正确"的答案?

编辑:我真的不喜欢任何涉及修改别人的PROGID的解决方案.我真的更愿意在相关的PROGID之外添加一些东西 - 一个IContextMenu或其他任何东西,以便为给定的文件类型添加额外的动词/选项.

似乎这样一个疯狂的系统有ext-> progid,其中progid由个别开发公司拥有,并且可以随意删除或更改.这让我觉得很脆弱(卸载东西和poof,你的文件扩展名停止正常工作,或安装一些东西,同样你的辅助动词消失,因为ext现在映射到一个不同的专有PROGID,我没有添加我们的动词安装(当时,不知道任何关于这个其他尚未存在的程序)),而且只是愚蠢.在所有这些时间之后,所有这些版本的Windows和Microsoft从未找到过为给定文件类型提供多层处理程序的方法?真?!?

我发现那令人惊叹!初级编程101涉及学习命令模式或其他分层/级联系统.Windows WinProcs本身是以命令模式模式组织的 - 因此从内部窗口上下文到外部,许多可能的处理程序在给定的MSG中被给予破解.

当然有一种方法可以添加一个适用于多个扩展的动词,而不会覆盖扩展的主要progid关联,它本身完全独立于主扩展 - > progid映射(这样用户可以随着时间的推移安装多个程序,并且仍然有权访问该文件类型的辅助动词).

我想我可以看看HKCR.*...我理解可以在那里添加适用于所有文件类型的动词.但是,我需要找到一些方法来过滤,这样我们的动词才真正存在于我们应该应用的实际文件类型中......

windows registry windows-shell

9
推荐指数
2
解决办法
1892
查看次数

你如何应对标准库中的signed char - > int问题?

这是我工作中一个长期存在的问题,我意识到我仍然没有一个很好的解决方案......

C天真地为int定义了它的所有字符测试函数:

int isspace(int ch);
Run Code Online (Sandbox Code Playgroud)

但是char经常被签名,并且一个完整的角色通常不适合int,或任何用于字符串******的单个存储单元.

这些函数已成为当前C++函数和方法的逻辑模板,并为当前的标准库奠定了基础.事实上,他们仍然得到了支持.

因此,如果您使用isspace(*pchar),最终可能会出现符号扩展问题.他们很难看到,因此根据我的经验他们很难防范.

类似地,因为isspace()和它的所有类型都是内联的,并且因为字符串的实际宽度通常是未知的,而不是字符串分析 - 这意味着任何现代字符库本质上都不应该在char或wchar_t周围运行但只有指针/迭代器,因为只有通过分析字符流才能知道它有多少组成一个逻辑字符,我对如何最好地处理这些问题感到有些不知所措?

我一直期待一个真正强大的库,它基于抽象出任何字符的大小因素,并且只使用字符串(提供诸如isspace之类的东西等),但要么我错过了,要么是另一个更简单的解决方案盯着我面对所有人(谁知道你在做什么)使用......


**这些问题不适用于可以完全包含完整字符的固定大小的字符编码 - UTF-32显然是唯一具有这些特征的选项(或将自己限制为ASCII或某些特殊情况的专用环境) .


所以,我的问题是:

"你如何以不受两个问题影响的方式测试空白,可打印等等:

1)符号扩展,以及
2)可变宽度字符问题

毕竟,大多数字符编码都是可变宽度:UTF-7,UTF-8,UTF-16,以及Shift-JIS等旧标准.如果编译器将char视为带符号的8位单元,即使扩展的ASCII也会出现简单的符号扩展问题.

请注意:

无论char_type的大小是多少,对于大多数字符编码方案来说都是错误的.

这个问题出现在标准C库以及C++标准库中; 仍尝试传递char和wchar_t,而不是各种isspace,isprint等实现中的字符串迭代器.

实际上,正是这些类型的函数破坏了std :: string的通用性.如果它只在存储单元中工作,并且没有试图假装将存储单元的含义理解为逻辑字符(例如isspace),那么抽象将更加诚实,并且会迫使程序员看起来其他有效的解决方案......

谢谢

参与的每个人.在这个讨论和WChars之间,编码,标准和可移植性我对这些问题有了更好的处理.虽然没有简单的答案,但每一点理解都有帮助.

c c++ character-encoding special-characters

9
推荐指数
3
解决办法
1284
查看次数

如何配置VS2008在遇到X错误时停止编译?

也许我记得Borland的编译器?但我似乎记得有能力设置"如果遇到X错误就停止编译" - 或者其他一些.

VS2008已经停止了100次错误.但是我已经修复了第一对,并且点击了save,这导致编译器警告我在编译时保存 - 它被阻止甚至创建这种情况.

要么:停止编译~10个错误,或者:当我点击保存(编译期间)时停止编译.

我发现没有允许上述任何一种情况的设置,但也许这里有人知道它们是否以及在哪里?

user-interface visual-studio-2008

8
推荐指数
0
解决办法
307
查看次数

如何为32位位图生成单色位掩码

在Win32下,通过执行以下操作,从位图生成单色位掩码以实现透明度使用是一种常见技术:

SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));
Run Code Online (Sandbox Code Playgroud)

这假定hdcSource是保存源图像的内存DC,而hdcMask是一个内存DC,它保存相同大小的单色位图(因此两者都是32x32,但源是4位颜色,而目标是1位单色).

但是,当源为32位颜色+ alpha时,这对我来说似乎失败了.我得到的是一个全黑的面具,而不是在hdcMask中获得单色位图.没有位设置为白色(1).而这适用于4位彩色光源.

我的搜索foo失败了,因为我似乎找不到任何对这个特定问题的引用.

我已经发现这确实是我的代码中的问题:即如果我使用16色(4位)的源位图,它可以工作; 如果我使用32位图像,它会产生全黑色蒙版.

在32位彩色图像的情况下,我应该使用另一种方法吗?alpha通道是否存在覆盖上述技术正常行为的问题?

感谢您提供的任何帮助!

ADDENDUM:我仍然无法找到为我的GDI +生成的源位图创建有效单色位图的技术.

根本没有生成单色位掩码,我有点缓解了我的特殊问题,而是我正在使用TransparentBlt(),这似乎是正确的(但我不知道他们在内部做了什么,这是任何不同的允许他们正确掩盖图像).

拥有一个非常好的,有效的功能可能是有用的:

HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
Run Code Online (Sandbox Code Playgroud)

无论hSource的颜色深度如何,它始终创建有效的透明蒙版.

想法?

c c++ winapi gdi bitmap

8
推荐指数
1
解决办法
3720
查看次数

如何避免按位运算的积分提升

我很惊讶 VisualStudio 2015 坚持将WORD( unsigned short) 提升为 anunsigned int当仅WORD值涉及仅位操作时。(即在执行 16bit | 16bit 时将 16 位提升到 32 位)。

例如

// where WORD is a 'unsigned short'
const WORD kFlag = 1;
WORD old = 2;
auto value = old | kFlag;  // why the blazes is value an unsigned int (32 bits)
Run Code Online (Sandbox Code Playgroud)

此外,有没有办法获得 0x86 内在函数WORD|WORD?我当然不想为 (16->32|16->)->16 买单。这段代码也不需要消耗超过几个 16 位寄存器,而不是几个 32 位寄存器。

但注册表的使用实际上只是一个旁白。欢迎优化器为所欲为,只要结果对我来说是无法区分的。(即它不应该以可见的方式改变大小)。

对我来说的主要问题是使用 flags|kFlagValue 会产生更广泛的实体,然后将其泵入模板会给我一个类型不匹配错误(模板比我想进入这里的时间要长得多,但关键是它需要两个参数,它们应该在类型上匹配,或者可以简单地转换,但不是,由于这个自动大小提升规则)。

如果我可以访问“保守位处理函数集”,那么我可以使用:

      flag non-promoting-bit-operator kFlagValue
Run Code Online (Sandbox Code Playgroud)

为了达到我的目的。

我想我必须去写那个,或者到处使用强制转换,因为这个不幸的规则。

在这种情况下,C++ …

c++ bitwise-operators integer-promotion

8
推荐指数
1
解决办法
945
查看次数

Win32:GetFileAttributes()的解决方法

我注意到这些年来已经出现过几次问题,而且在我们目前的版本中,Windows 7下似乎发生了很多问题.

当我测试文件是否存在时,使用:: GetFileAttributes(filename),我经常返回INVALID_FILE_ATTRIBUTES,而GetLastError()是ERROR_PATH_NOT_FOUND(3).

然而,该文件不存在,存在的路径,体积存在 - 它的H:\富\酒吧 - 这是我的机器上映射至H网络共享文件夹:.

如果我打开命令窗口,它可以看到它.如果我使用Windows资源管理器导航到该文件夹​​,它可以看到它.

如果我在运行我们的应用程序之前这样做,我们可以看到它.

但是,如果我首先运行我们的应用程序,重启后,在尝试查看H:\之前,我会反复得到上述错误.

在我看来,Windows正在"帮助"我立即返回ERROR_PATH_NOT_FOUND,当给定的共享映射尚未重新连接此会话时(它被设置为自动重新连接).不用说,这很烦人.是否有另一个API调用我可以"确定文件/文件夹X是否存在?"

windows winapi visual-c++

7
推荐指数
1
解决办法
4182
查看次数

_SH_SECURE和_SH_DENYWR之间有什么区别?

_SH_DENYWR拒绝任何其他尝试打开具有写权限的文件(共享冲突)_SH_SECURE设置安全模式(共享读取,独占写访问)

_SH_SECURE似乎更新,基于这样一个事实,即文档似乎掩盖它或根据你看的位置省略它.几乎没有关于我能在网上找到的网上的信息.

那些有什么不同?

c c++ windows file-io winapi

7
推荐指数
1
解决办法
2919
查看次数