我知道CreateFile返回的无效值是INVALID_HANDLE_VALUE.但是因为我也喜欢使用RAII,所以很容易将HANDLE放在shared_ptr(如下:)中
shared_ptr<void> handle (CreateFile(args),&CloseHandle)以确保句柄关闭.我唯一担心这种快速简便的RAII方法是CreateFile可以返回NULL作为HANDLE值.
我想用原型实现一个功能
/* Locates the menu item of the application which caused the given menu 'mnu' to
* show up.
* @return true if the given menu 'mnu' was opened by another menu item, false
* if not.
*/
bool getParentMenuItem( HMENU mnu, HMENU *parentMenu, int *parentMenuIdx );
Run Code Online (Sandbox Code Playgroud)
给定一个HMENU句柄,我希望能够找出应用程序中打开了哪个菜单项(如果有)。这基本上是与GetSubMenu函数相反的。
我当前的方法是查看应用程序顶级窗口中的每个HMENU,并检查是否可以找到一个菜单项,该菜单项在激活时会打开给定的子菜单。我使用GetMenuItemCount / GetSubMenu递归执行此操作。
但是,这效率很低,并且对于由上下文菜单项打开的菜单而言,它会失败。因此,我想知道:
有谁知道如何找到激活菜单后打开给定HMENU的菜单项(如果有)?
更新:我刚刚想到一个主意;应该有可能(使用SetWindowsHookEx函数)安装一个钩子,该钩子会通知菜单中发生的所有输入事件。每当检测到菜单项激活时,请记住该菜单项(由(HMENU,int)对标识)和将通过全局菜单中的菜单项打开的HMENU。然后,getParentMenuItem上面的函数可以简单地对地图进行查找。
更新的更新:上面的更新中描述的挂钩想法照旧是行不通的,因为它当然只会识别菜单项->菜单关联,这些菜单项已在某个时候被激活。
但是,这感觉有点难看,因为它要求我保持很多状态(地图);有没有更简单的可能性?
我看过一本关于C++的书,提到使用静态转换导航继承层次结构比使用动态转换更有效.
例:
#include <iostream>
#include <typeinfo>
using namespace std;
class Shape { public: virtual ~Shape() {}; };
class Circle : public Shape {};
class Square : public Shape {};
class Other {};
int main() {
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation …Run Code Online (Sandbox Code Playgroud) 我仍然远离掌握C#,但我的孩子正在推动我每天继续改进我的编程.
当我创建一个WinForms应用程序时,我想要实际更改并使用大量控件.
我不明白的是当我需要使用this.control关键字时,我应该只使用control.
示例:
如果我想更改标签的文字,我可以写
mylabel.text = "Text for label"
Run Code Online (Sandbox Code Playgroud)
要么
this.mylabel.tex = "Text for label"
Run Code Online (Sandbox Code Playgroud)
以下哪一种是正确的方法?this在WinForms中使用控件时(例如数据网格,文本,表格等),何时使用关键字有一个简单的解释?
我正在研究英特尔的IA-32软件开发人员手册.特别是,我正在阅读以下手册:http://www.intel.com/Assets/PDF/manual/253666.pdf.我们以ADD指令为例.在第79页上写入,您可以将r8(8位寄存器)添加到r/m8(8位寄存器或存储单元).在下面的几行中,还写入了可以将r/m8添加到r8.问题是:如果我添加两个8位寄存器,我正在使用哪条指令?谢谢.
在比较两个方面,这是C++中的有效代码吗? const char *
const char * t1="test1";
const char * t2="test2";
t2 = "test1";
if ( t1 == t2 ) {
cout << "t1=t2=" << t1 << endl;
}
Run Code Online (Sandbox Code Playgroud)
没用strcmp?
我正在努力学习逆向工程,而且我仍然坚持这个小东西.我有这样的代码:
.text:10003478 mov eax, HWHandle
.text:1000347D lea ecx, [eax+1829B8h] <------
.text:10003483 mov dword_1000FA64, ecx
.text:10003489 lea esi, [eax+166A98h]<------
.text:1000348F lea edx, [eax+11FE320h]
.text:10003495 mov dword_1000FCA0, esi
Run Code Online (Sandbox Code Playgroud)
我想知道,它在C或C++中看起来如何?特别是箭头标出的两个指令.HWHandle是变量,它保存从GetModuleHandle()函数返回的值.更有趣的是,这条指令下面的几行dword_1000FCA0用作函数:
.text:1000353C mov eax, dword_1000FCA0
.text:10003541 mov ecx, [eax+0A0h]
.text:10003547 push offset asc_1000C9E4 ; "\r\n========================\r\n"
.text:1000354C call ecx
Run Code Online (Sandbox Code Playgroud)
这将在我的游戏控制台中绘制此文本.伙计们,你有什么想法吗?
我想知道malloc/new是否从Cache或RAM返回内存块.
提前致谢.
考虑一下我的系统有内存,但它分散在不同的地方(碎片).没有四个连续的内存位置是免费的.在那种情况下,如果我用C语言声明一个大小为10的字符数组,会发生什么?