小编Cod*_*der的帖子

冷启动优化

我试图搜索,但到目前为止没有运气.有谁知道一个好的资源应该如何进行冷启动优化?

该应用程序是C++/MFC应用程序,使用VS2010编译,完整版,内置分析器可用.我试图减少所有额外的重量,以使热启动的负载时间可以接受,但冷启动是完全不可接受的.有时接近30秒,并没有什么是慢代码明智的.热启动时CPU负载达到80%,冷启动时低于20%.

我今天尝试使用延迟加载链接器设置,但我不太明白它们如何影响性能.此外,我尝试了可执行的打包程序,但VM上的测试似乎没有那么快.还有什么我可以尝试的吗?

c++ optimization mfc visual-studio-2010

6
推荐指数
1
解决办法
1488
查看次数

有关Windows程序员(C/C++)的Linux编程的任何提示吗?

可能重复:
从Windows转换到*nix编程平台

有谁知道一个好的,紧凑的资源,允许我从Windows编程迁移到Linux编程?

我设法运行简单的应用程序,检查守护程序架构,但不知何故,我不知道从哪里开始更好地了解架构的最佳实践和常见解决方案.

我想所有线程,互斥,关键部分,i/o,(命名?)管道的东西都可能远离Windows开发.但我找不到一个好的,紧凑的文档.

Linux中的守护进程似乎比在Windows中更简单,但我已经偶然发现了完全不寻常的fork函数,并且应该有其他类似的东西.

那么,所有POSIX合规性的东西是什么?我听说它应该是平台无关的,但我也读到它在一些发行版下并不完全支持.

c c++ linux

6
推荐指数
2
解决办法
1814
查看次数

MFC数据通过PostMessage转发到主线程

我有一个C++/MFC应用程序,我需要重组.该应用程序用于处理大部分在主线程中的数据,从而阻断输入,现在我想改变它的话,所有的GUI更新是通过PostMessage的完成.

不幸的是,我似乎找不到如何实现这一目标的良好来源.

现在我正在考虑创建一个优先级队列,使用临界区保护,一个处理此队列的工作线程(while(true)),以及将数据指针发送到主线程的PostMessage机制.

使用这种方法让我害怕的是PostMessage根本不能保证到达主线程,所以,如果我理解正确,就有可能发生内存泄漏.

第二个问题是另一个应用程序可以向我的应用程序发送自定义消息,我的应用程序可能会尝试取消引用WPARAM或LPARAM作为指针,从而导致AV.

有谁知道这些任务的最佳实践是什么?

数据可以是用于Web控件的HTML内容,也可以是列表框,下拉列表等的其他内容.

c++ mfc postmessage visual-studio-2010

5
推荐指数
1
解决办法
9395
查看次数

COM + 等待单对象

在过去的几天里,我一直在努力为一个应用程序找到一个好的架构,经过一番研究后,我终于陷入困境,原因就是 COM。

相关应用程序将有多个 GUI 线程,它们将为工作线程安排工作项。工作线程将通过 CoInitialize(NULL); 初始化 COM,创建一些 COM 组件,然后进入一个等待 WaitForMultipleObjects(2, ...) 的循环(ExitEvent - 指示应用程序正在关闭,ManualResetEvent - 指示实际上有工作项需要处理),并且在成功等待后,将处理这些项并将它们发送回 GUI 线程。如果队列为空,ManualResetEvent 将在工作线程内部重置,并将发生在队列关键部分内。

问题是,像往常一样,COM 让一切都变得困难 1000 倍......

如果我理解正确的话,CoInitialize(NULL); 创建一个隐藏窗口,在 WaitForSingle/MultipleObject/s 期间发布的任何消息都可能导致死锁。

因此,我需要调用 MsgWaitForMultiple 对象。如果消息没有正确泵送,这反过来可能会失败。不幸的是,我不太明白如何以正确的方式泵送它们。我必须创建自己的消息循环吗?如果 COM 决定创建消息框,应用程序会崩溃吗?

到目前为止,我似乎必须这样进行?

HANDLE hEvents[2] = {};

int ThreadProc(LPVOID lpParam) {
    int nRetVal = 0;

    CoInitialize(NULL);

    CComPtr<ISomething> smthn;
    smthn.CoCreateInstance(...);

    MSG msg = {};

    bool bRun = true;

    while(bRun) {
        while(PeekMessage(&msg, ??NULL/-1??, 0, 0, PM_REMOVE)) { /*Which one here?*/
            if(msg.Message == WM_QUIT) {
                bRun = false;
                nRetVal = msg.wParam;
                break; …
Run Code Online (Sandbox Code Playgroud)

c++ com winapi multithreading synchronization

5
推荐指数
1
解决办法
2183
查看次数

你能强迫MSI永远是管理员吗?

据我所研究并询问其他人,似乎常规MSI在大多数时间内作为有限用户运行,尤其是在GUI阶段.

但是应用程序在安装阶段需要提升提示,我希望在GUI选择阶段执行的自定义操作期间拥有管理员权限.难道真的没有办法在开始时强制UAC提示吗?

此外,在Active Directory安装期间也需要执行一些自定义操作,如果MSI以guest身份或其他方式运行,也无法执行.

install windows-installer

5
推荐指数
1
解决办法
3472
查看次数

检查本机应用程序中的自动更新的最麻烦的方法

什么是最好的方法?

到目前为止,我可以想到:

  • HKLM\Run的超级小型WinMain exe,每天检查两次

  • Windows服务,每天检查两次

  • 计划任务(似乎无法通过用户帐户,桌面隔离和东西找到启动GUI任务的方法)

  • 应用程序本身(如果有多个exes,则不起作用,例如,在Sysinternals Suite中,许多应用程序,一个大型套件)

还要别的吗?我希望它保持原生,避免突兀或延迟冷启动的启动.

c++ windows native

5
推荐指数
1
解决办法
401
查看次数

NSIS使用条款

任何人都可以向我解释NSIS许可条款的含义是什么?http://nsis.sourceforge.net/License

到目前为止,该系统似乎可用于商业产品,但ZLIB/PNG/BZIP2/LZMA/CPL1.0部分让我感到困惑.

我是否必须在用户必须同意的设置中包含一个包含所有这些许可证的许可证页面?或者它们仅用于源代码修改?或者仅当您使用其中一个库压缩数据时?

licensing nsis

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

C++类中的内联规则是什么?

从我很久以前读到的内容看来,如果你想在编译阶段内联类成员函数,那么函数必须在类声明块中定义.

但这有一个细节泄漏的缺点.恕我直言,其他程序员在打开.h文件时应该只看到类接口.

在现代C++中,第一个陈述是否仍然如此,是吗?有没有办法强制内联声明的函数,最好是在另一个文件中?

将短成员函数保留在类声明块中通常更好吗?

c++ inline

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

MFC/WinAPI的大问题

我需要创建一个带有formview的SDI表单,该表单有两个选项卡,它们将多个对话框封装为选项卡内容.但表格必须有彩色背景.

像这样的事情让我讨厌编程.

首先,我尝试通过资源编辑器CTabControl尝试了不同的东西,但是没有记录的行为和没有答案的怪癖让我陷入了障碍.

经过几个小时的搜索,我发现有一个名为属性表的控件,这实际上就是我所需要的.

稍后再搜索一下,我发现属性表甚至可以实际嵌入到CFormView中,如下所示:http://www.codeguru.com/Cpp/controls/propertysheet/article.php/c591

并且可以通过CPropertySheet的AddPage方法将从CPropertyPage派生的对话框类直接添加为页面.

大!不是这样......有些控件没有用,而且没有被创建,遇到了奇怪的断言.结果是对话框中缺少DS_CONTROL样式.在http://blogs.msdn.com/b/oldnewthing/archive/2007/01/08/1434501.aspx上完全意外地发现它,在MSDN上没有关于它的消息!属性页必须包含:DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP,可以有:DS_SHELLFONT | DS_LOCALEDIT | WS_CLIPCHILDREN样式!没有任何其他,默认情况下使用资源编辑器创建.为软件开发人员提供的超级隐藏信息!

该页面评论中的引用:"OMG.这就是那种行为的来源......

事实证明,当在64位计算机上播放声音时,PlaySound API依赖于这种行为."拉里奥斯特曼,据我所知,他在微软工作了20年,让我大笑起来.

无论如何,固定的是,对话框控件(CPropertyPages)现在按预期创建,而那部分看起来有点远,但是下一部分颜色再次死路一条!

通常你重写WM_CTLCOLOR,检查控件ID或hwnd并提供必要的画笔来设置你需要的颜色.对于CPropertySheet来说并不是这样,整个顶行保持灰色!对于CTabCtrl,它以某种方式工作,对于CPropertySheet它没有.

为什么?似乎CPropertySheet有点嵌入CTabControl或其他东西,因为如果我重写WM_ERASEBKGND,只有内部部分改变颜色.

现在看来CPropertySheet中有一个GetTabControl()方法,它返回CPropertySheet的实际CTabCtrl*.但由于它是在内部构建的,我无法找到如何覆盖它的WM_CTLCOLOR消息处理.

似乎有一种方法可以对windowproc进行子类化,但经过多次尝试后,我找不到任何关于如何做到这一点的好消息来源.MSDN上的SubclassWindow doc说:"调用此函数时,窗口不得已经附加到MFC对象."?!那是什么?

我尝试通过MFC向导创建一个基于CTabCtrl的自定义CCustomTabCtrl类,创建一个实例,从一个CCustomPropertySheet处理程序调用SubclassWindow来覆盖内部CTabCtrl,但没有任何作用,神秘崩溃在MFC内部深处.

尝试使用GCL_HBRBACKGROUND为内部CTabCtrl设置WindowLong,没有任何改变.

最糟糕的是,我找不到任何关于该主题的有用文档或教程.

我发现大多数是如何拥有标签控件,但这在很多方面严重错误,我想要一个标准的控制行为减去背景颜色,我不想支持不同的颜色方案,Windows版本,IAccesible接口和所有这些东西,我见过的所有者抽样样本都没有得到所有标准控制行为的10%.我没有幻想我会创造更好的东西,我不会掌握手头的资源.

我偶然发现了这个帖子,我不能同意作者更多:http : //arstechnica.com/civis/viewtopic.php?f=20&t=169886&sid=aad002424e80121e514548d428cf09c6所有者绘制控件都是无证件的PITA,那是不可能的是的,MSDN上有NULL信息可以提供帮助.

那么有什么我错过或没有尝试过吗?如何更改CPropertySheet的顶部条带背景颜色?任何人?

winapi mfc visual-studio

3
推荐指数
1
解决办法
1663
查看次数

在WINAPI中执行透明按钮的正确方法

试图谷歌,但无法找到明确的答案.

如何使覆盖WM_PAINT的按钮透明.这样你就可以在所有地方看到它的形式,除非画出一些东西.同时避免闪烁.

我看到了SetBkMode(HDC,TRANSPARENT)的示例,使用了NULL_BRUSH,带有CompatibleDC和BitBlts的示例,但我不太确定哪种方法是正确的,以及在父窗口上设置WM_CLIPCHILDREN时它的行为方式.我做过的大部分实验都有一些奇怪的行为.在MSDN上根本找不到关于WM_ERASEBKGND/WM_CTLCOLOR/WM_PAINT/WS_EX_COMPOSITED/WS_CLIPCHILDREN/etc内部关系的好文档.

有没有人知道我在哪里可以阅读关于这个主题与所有相关的陷阱?

winapi

3
推荐指数
1
解决办法
4949
查看次数

您如何阅读以下文档?

IDispatch::GetTypeInfoCount

从返回的HRESULT获得的返回值是以下之一:[S_OK - > Success],[E_NOTIMPL - > Failure]

并且底部的样本返回E_INVALIDARG并且NOERROR.

据我所知,E_INVALIDARG不是S_OK,也不是NOERROR,所以你做什么?你检查无效指针还是不检查?

COM似乎是一切的基础,我找不到关于简单行为的正确信息的一个很好的信息来源IDispatch.您如何处理生产代码中的这种不一致?

c++ com

3
推荐指数
1
解决办法
150
查看次数

数组参数的完整性检查(strlen等)

无法通过搜索(可能是错误的关键字)找到答案,所以我正在创建一个新问题.

如何使用字符串参数处理dllexported方法的参数检查.一般规则永远不会信任用户,但实际上呢?例如:

int foo(const char *bar)
{
    if(!bar)
        return FAIL;

    ???
}
Run Code Online (Sandbox Code Playgroud)

假设库的用户调用我们的函数,如:

foo(reinterpret_cast<char*>(0x00000008));
Run Code Online (Sandbox Code Playgroud)

这应该首先导致AV:

strlen(bar);
Run Code Online (Sandbox Code Playgroud)

有办法防范这个吗?正确处理错误的方法?

我知道IsBadReadPtr是不可能的,因为这个函数是一类危险的,永远不会被使用.但是,我有什么方法可以处理这个问题吗?我不能__declpec(dllexport)std :: string,可以吗?此外,即使我愿意,std :: string也有某种线程本地存储或静态,当我从不同的模块使用时会导致访问冲突(据我所知(由静态或不同的堆引起?).

使用这些功能存在安全风险,堆栈溢出(R/E)IP覆盖,还是只会导致安全的AV?

c c++ windows dll

1
推荐指数
2
解决办法
1075
查看次数