我想知道如何使用C#从派生类中的构造函数中捕获异常.这样的东西:
public class MyClassA
{
public MyClassA()
{
//Do the work
if (failed)
{
throw new Exception("My exception");
}
}
}
public class MyClassB : MyClassA
{
public MyClassB()
{
//How to catch exception from a constructor in MyClassA?
}
}
Run Code Online (Sandbox Code Playgroud) 我以为我非常了解VS 2008 C++编译器:
CString str;
str.Empty();
LPCTSTR pStr = str.IsEmpty() ? NULL : str;
::MessageBox(NULL, pStr ? L"pStr is NOT null" : L"pStr is null", L"Result", MB_OK);
Run Code Online (Sandbox Code Playgroud)
有人可以解释我为什么得到这个?

我需要使用全局互斥锁来同步多个进程对相互共享文件的访问。我这样创建互斥锁:
HANDLE hMutex = ::CreateMutex(NULL, FALSE, L"Global\\MySpecialName");
Run Code Online (Sandbox Code Playgroud)
然后在:
//Entering critical section
VERIFY(::WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0);
Run Code Online (Sandbox Code Playgroud)
进而:
//Leave critical section
VERIFY(::ReleaseMutex(hMutex));
Run Code Online (Sandbox Code Playgroud)
该问题源于以下事实:共享此互斥锁的进程是本地系统服务和几个使用登录用户凭据运行的用户模式进程。因此,如果互斥锁首先由服务创建,那么当用户模式进程尝试打开它时,会CreateMutex失败并显示错误代码ERROR_ACCESS_DENIED。
在创建互斥锁之前,我正在阅读为它指定一个安全描述符,但我似乎无法弄清楚如何使其可访问everything,我在这里真的不需要任何复杂性?
我一直在避免在 C++ 中C++03使用以下内容(我相信在 VS 2008 中使用过),但现在我很好奇是否可以这样做?让我用代码解释一下。
//Definitions.h header file
//INFO: This header file is included before CMyClass definition because
// in contains struct definitions used in that class
struct MY_STRUCT{
void MyMethod()
{
//How can I call this static method?
int result = CMyClass::StaticMethod();
}
};
Run Code Online (Sandbox Code Playgroud)
然后:
//myclass.h header file
#include "Definitions.h"
class CMyClass
{
public:
static int StaticMethod();
private:
MY_STRUCT myStruct;
};
Run Code Online (Sandbox Code Playgroud)
和:
//myclass.cpp implementation file
int CMyClass::StaticMethod()
{
//Do work
return 1;
}
Run Code Online (Sandbox Code Playgroud) 说,我创建了我的图标:
//'ghIcon' of type HICON
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, nCx, nCy, 0);
Run Code Online (Sandbox Code Playgroud)
然后将其设置为显示在系统托盘上:
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hMyWnd;
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.uCallbackMessage = TRAY_NOTIFICATION_ID1;
nid.hIcon = ghIcon;
Shell_NotifyIcon(NIM_ADD, &nid);
Run Code Online (Sandbox Code Playgroud)
然后在某个时候我想用一个新图标替换它:
if(ghIcon)
{
//Delete old icon first
DestroyIcon(ghIcon);
}
//Load new icon
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, nCx, nCy, 0);
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hMyWnd;
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.hIcon = ghIcon;
Shell_NotifyIcon(NIM_MODIFY, …Run Code Online (Sandbox Code Playgroud) 我只是注意到,如果我在一个标签中放大网页(通过执行Ctrl-Plus),然后打开我的Chrome扩展程序的弹出窗口,它也会按比例放大.不幸的是,它使它显示垂直,并且在更大的范围内,甚至是水平滚动条.
我看到其他扩展以某种方式通过仅以100%缩放显示弹出窗口来阻止此缩放.问题是如何做到这一点?
javascript css google-chrome popupwindow google-chrome-extension
我有从Chrome扩展程序的后台脚本调用的以下方法.目标是将消息发送到特定选项卡,然后使用结果调用提供的回调方法.重要的是callbackDone必须始终在某个时间点调用.所以它是这样的:
function sendToTab(nTabID, callbackDone)
{
(function()
{
chrome.tabs.sendMessage(nTabID, {
action: "update01"
},
function(response)
{
if(chrome.runtime.lastError)
{
//Failed to send message to the page
if(callbackDone)
callbackDone(nTabID, null); //Page never received the message
}
else
{
//Sent message OK
if(response.result === true)
{
if(callbackDone)
callbackDone(nTabID, true); //Success!
}
else
{
if(callbackDone)
callbackDone(nTabID, false); //Page returns failure
}
}
});
}());
}
Run Code Online (Sandbox Code Playgroud)
然后从处理消息的页面内(可以注入content script)我处理它:
chrome.runtime.onMessage.addListener(onMessageProc);
function onMessageProc(request, sender, sendResponse)
{
if(request.action == "update01")
{
//Do …Run Code Online (Sandbox Code Playgroud) javascript google-chrome message-passing google-chrome-extension
当我在VMWare Workstation虚拟机中运行的Windows 7 x64的内核模式下运行以下汇编序列时:
xor eax, eax
mov ax, gs
mov gs, ax ; this instruction
Run Code Online (Sandbox Code Playgroud)
最后一条mov gs, ax指令会立即导致该VM崩溃(或可能是错误检查),并显示以下弹出消息:
发生故障导致虚拟CPU进入关闭状态.如果此故障发生在虚拟机之外,则会导致物理计算机重新启动.通过错误配置虚拟机,客户机操作系统中的错误或VMWare Workstation中的问题可以达到关闭状态.
重新加载gs寄存器会导致内核中的问题,还是虚拟化问题?
我没有看到mov英特尔手册中有关该指令的任何异常.
PS.顺便说一句,更换gs寄存器fs不会导致此错误.
编辑:回答有关GDT中段描述符状态的问题.这里是:
0: kd> r gs
gs=002b
0: kd> dg 28
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0028 00000000`00000000 00000000`ffffffff Data RW Ac 3 Bg Pg P …Run Code Online (Sandbox Code Playgroud) 我不确定为什么我会得到这个视觉神器?
以下是如何重现:
我正在使用Visual Studio 2017社区.创建一个新的C++ - > MFC项目:
然后指定"基于对话框":
然后构建为"Debug"x86应用程序并运行它.
所以我在Windows 10上运行它.
当这个基于对话框的过程具有焦点时,它看起来像我期望的那样:
但如果我将键盘焦点切换到其他应用程序(通过点击它),这个基于对话框的过程仍然保留其标题栏颜色:
我不确定这是否只是一个视觉故障的问题,或者是否有更深层次的窗口消息处理问题.我该如何纠正?(对于较旧的MFC项目,这不是问题.)
c++ ×5
javascript ×2
mfc ×2
winapi ×2
.net ×1
assembly ×1
c# ×1
class ×1
constructor ×1
css ×1
email ×1
kernel ×1
mutex ×1
php ×1
popupwindow ×1
sendgrid ×1
struct ×1
system-tray ×1
trayicon ×1
vmware ×1
windows ×1
windows-10 ×1