Windows进程间消息通信

高低权限进程通信(ChangeWindowMessageFilter, WM_COPYDATA) 低权限进程向高权限进程发送消息时会返回拒绝访问, windows为我们提供了ChangeWindowMessageFilter, 直接上代码(client.cpp用非管理员启动, server.cpp用管理员启动, 通过SendMessage WM_COPYDATA进行通信) 阅读详情

Windows改进的安全机制

windows 7增加了session隔离机制,Windows 实现了各Session之间的独立,使得操作系统的安全性,有了较大的提高。windows的服务进程都运行在system下在系统的Session 0里。

用户界面特权隔离

在早期的Windows操作系统中,同一用户下运行的所有进程,有着相同的安全等级,拥有相同的权限。例如,一个进程可以自由地发送一个窗口消息给其他进程的窗口。而从Windows Vista、7开始,某些关键的Windows消息就不能自由发送了。

Win7后进程拥有一个新的属性——特权等级(Privilege Level)。即便两个进程在相同的用户权限下运行,一个特权等级较低的进程向一个特权等级较高的进程发送消息会被过滤拦截掉。

UIPI的作用是防止恶意程序发送消息给那些拥有较高权限的窗口,从而获取较高的权限。在计算机系统中,这是一种维护系统安全的有效方式。因此,在 Windows 7 操作系统中运行的用户进程,在运行时具有不同的完整性(MIC)等级,那么相互间的通信无法像 Windows XP 那样正常进行。

UIPI的运行机制

UIPI:用户界面特权隔离(User Interface Privilege Isolation),是 Windows 7 通过 MIC 机制新引入的一种安全特性,用于拦截比自身进程 MIC 等级低的进程发来的消息。

        UIPI 的目的是为了规范跨进程间的窗口消息,默认情况下,高权限进程不会接收到低权限进程发送的窗口消息的,但是低权限进程能够接收到高权限进程的窗口消息。UIPI 的本质是系统检查目标窗口和发送方是否具有相同的 MIC 等级或者发送方具有更高的 MIC 等级,如果符合上述条件,则允许消息的传递,否则将消息丢弃。

        在 Windows 7 操作系统中运行的用户进程,如果运行时具有不同的完整性等级(特权),即具有不同的 MIC 等级,那么相互间的通信将会被隔离。

Windows 7: Message Integrity Check(消息完整性检查)
  MIC消息完整性检查(Message Integrity Check),是 Windows 7 增加的 Windows 安全对象访问控制安全机制,系统利用完整性级别标记一个安全对象,通过降低进程的完整性级别限制进程对安全对象的写入权限,类似于用户帐户组的成员被限制访问系统组件的方式。完整性检查机制降低进程修改系统或损害用户数据文件的可能性。

消息完整性检查分为 6 个等级:


MIC等级    说明
SECURITY_MANDATORY_UNTRUSTED_RID    不信任的MIC等级


SECURITY_MANDATORY_LOW_RID    低MIC等级,如IE
SECURITY_MANDATORY_MEDIUM_RID    中MIC等级,默认为这个等级,如Explorer
SECURITY_MANDATORY_HIGH_RID    高MIC等级,以管理员身份运行的程序
SECURITY_MANDATORY_SYSTEM_RID    系统MIC等级,一般是服务应用程序


SECURITY_MANDATORY_PROTECTED_PROCESS_RID    被保护进程的MIC等级


MIC 等级的获取是和父进程完整性级别相关的。

在 Windows 7 系统中 Explorer.exe 的完整性级别是中 MIC 等级,因为权限继承的关系,其启动的进程具有的 MIC 等级也都默认是中 MIC 等级。一个安全对象的 MIC 等级由其访问控制列表项中的某一项标识,可以使用工具 Process Explorer 查看一个进程的 MIC 等级。

Windows 7 系统正常启动后,Explorer.exe 进程的 MIC 等级默认为:中 MIC 等级。

UIPI的等级划分为低等级(low),普通(normal),高等级(high),系统(system)。

在Windows 7中,当UAC(User Account Control)在启用时,UIPI的运行可以得到最明显的体现。当管理员用户登录系统后,操作系统会创建两个令牌对象(Token Object):第一个是管理员令牌,拥有大多数特权(类似于Windows Vista之前的System用户),而第二个是一个过滤后的简化版本令牌,只拥有普通用户的权限。

默认情况下,以标准用户启动的进程,拥有普通等级特权。以管理员运行的进程,例如,用户右键单击选择“以管理员身份运行”或者是通过添加“runas”参数调用ShellExecute运行的进程,这样的进程就拥有较高(high)的特权等级。

同一用户下,系统可以运行两种不同特权等级的进程。我们可以使用Windows Sysinternals工具集中的进程浏览器(Process Explorer)查看各个进程的特权等级。 

UIPI所带来的限制

进程之间Windows消息通信发生问题时,不妨使用进程浏览器查看一下两个进程之间是否有合适的特权等级。

等级的划分,是为了防止以下犯上。

有了用户界面特权隔离,一个运行在较低特权等级的应用程序,它的行为就受到了诸多限制,它不可以:

  • 验证由较高特权等级进程创建的窗口句柄
  • 通过调用SendMessage和PostMessage向由较高特权等级进程创建的窗口发送Windows消息
  • 使用线程钩子处理较高特权等级进程
  • 使用普通钩子(SetWindowsHookEx)监视较高特权等级进程
  • 向一个较高特权等级进程执行DLL注入

但是,一些特殊Windows消息是容许的。因为这些消息对进程的安全性没有太大影响。这些Windows消息包括:

  0x000 - WM_NULL
  0x003 - WM_MOVE
  0x005 - WM_SIZE
  0x00D - WM_GETTEXT
  0x00E - WM_GETTEXTLENGTH
  0x033 - WM_GETHOTKEY
  0x07F - WM_GETICON
  0x305 - WM_RENDERFORMAT
  0x308 - WM_DRAWCLIPBOARD
  0x30D - WM_CHANGECBCHAIN
  0x31A - WM_THEMECHANGED
  0x313, 0x31B (WM_???)

ChangeWindowMessageFilterEx 

Windows引入了一个新的API函数ChangeWindowMessageFilter。
如果我们想容许一个消息发送给较高特权等级的进程,我们可以在较高特权等级的进程中调用ChangeWindowMessageFilter函数,以MSGFLT_ADD作为参数,将消息添加进消息过滤器的白名单。同样的,我们也可以以MSGFLT_REMOVE作为参数,将这个消息从白名单中删除。

消息的发送包括:系统消息的发送和用户自定义消息的发送。

ChangeWindowMessageFilter 与 ChangeWindowMessageFilterEx 这两个 API 为 Win7 系统新增的API接口,而 WinXP 系统没有这两个接口。

查看MSDN可知,ChangeWindowMessageFilter 作用:从 UIPI【用户界面特权隔离】消息过滤器中增加或移除一个消息。ChangeWindowMessageFilterEx 作用:为特定窗口修改 UIPI【用户界面特权隔离】消息过滤器。

ChangeWindowMessageFilterEx 函数

ChangeWindowMessageFilterEx 函数,指定窗口修改用户界面特权隔离 (UIPI) 消息过滤器。

函数原型:

BOOL WINAPI ChangeWindowMessageFilterEx(
  __in HWND hWnd,
  __in UINT message,
  __in DWORD action,
  __inout_opt PCHANGEFILTERSTRUCT pChangeFilterStruct
  );


【参数】
hWnd                         要修改其 UIPI 消息过滤器的窗口句柄。
message                    要允许或阻止通过消息过滤器的消息。
action                        要执行的操作,可以采取下列值之一:


MSGFLT_ALLOW :
允许消息通过过滤器。允许窗口接收该消息,不管源消息是什么,甚至它来自一个低特权的进程。

MSGFLT_DISALLOW :
如果消息来自低特权的进程,阻止它转递给窗口。

MSGFLT_RESET :
为窗口重置消息过滤器为默认,任何全局允许消息或进程范围内的将通过。但不包含这两个类别,其中其中来自低特权的进程将被阻塞。

pChangeFilterStruct
指向CHANGEFILTERSTRUCT结构指针的可选项。


【返回值】
如果函数成功,则返回值为非零值。
如果该函数失败,则返回值为零。要获取扩展的错误的信息,请调用GetLastError 。

对于系统消息的处理,非常简单,接受消息的进程需要将该消息加入到白名单中,可以通过下面的代码实现:
需要在高权限程序开始的地方加入以下代码,指定什么消息可以接受


例子:
//设置高权限程序的消息过滤白名单
BOOL bRes = ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL);
   

解决文件拖放失效的问题,由于Win7的安全机制,导致与文件拖放的WM_DROPFILES消息和WM_COPYGLOBALDATA消息被系统拦截了,从而导致了文件拖放失效的问题。

解决问题的办法就是,调用ChangeWindowMessageFilter函数,放行WM_DROPFILES消息和WM_COPYGLOBALDATA消息。

放行文件拖放相关事件消息
ChangeWndMessageFilter( WM_DROPFILES, TRUE );
ChangeWndMessageFilter( WM_COPYGLOBALDATA, TRUE );

上述代码让系统对该程序不再过滤掉【WM_DROPFILES】消息和【WM_COPYGLOBALDATA】消息。再次生成可执行程序,【以管理员身份运行】程序窗口就可以接收到拖放文件消息【WM_DROPFILES】了。

原因是 WinXP 及 Win2003 系统用户库 USER32.dll 没有 ChangeWindowMessageFilter、ChangeWindowMessageFilterEx 这两个接口,而 Windows 7 系统下,则新增之。

由于 WinXP、Win2003 系统安全机制不会拦截消息,因此也就没有必要运行上述新增的代码了。但若想该测试程序在 WinXP、Win2003 系统下运行正常,且要在 Win7 系统下能正常接收上述消息,可直接从 Win7 之 USER32.dll 库中获取上述 API 函数入口地址,在 Win7 系统下肯定是可以获取到入口地址的;而在 XP 系统下就肯定获取不到其入口地址,但没关系不会影响程序运行,亦不会报错。

     typedef BOOL (WINAPI * ChangeWindowMessageFilterOkFn)( UINT ,  DWORD );
     HMODULE hModUser32 = NULL;
     hModUser32 = LoadLibrary(_T( "user32.dll" ));
     if (hModUser32 == NULL) {
         return FALSE;
     }
 
     ChangeWindowMessageFilterOkFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterOkFn) GetProcAddress(hModUser32,  "ChangeWindowMessageFilter" );
     if (pfnChangeWindowMessageFilter == NULL)
     {
         FreeLibrary(hModUser32);
         return FALSE;
     }
 
     FreeLibrary(hModUser32);
 
     return pfnChangeWindowMessageFilter(nMessage, bAllow ? MSGFLT_ADD : MSGFLT_REMOVE);
}

MFC模拟进程创建以及通信 MFC模拟实现进程通信 阅读详情

相关推荐

别再纠结高侧低侧了!用INA199/INA219这类集成电流检测芯片,5分钟搞定精准电流测量

本文详细解析了使用INA199/INA219等集成电流检测芯片实现精准电流测量的高效方案。通过对比传统分立元件方案,突出集成芯片在精度、温度稳定性和设计简化方面的优势,并提供硬件设计避坑指南和软件实现最佳实践,帮助开发者快速掌握电流检测技术。

weixin_42685438的博客 471

ChangeWindowMessageFilterEx 概述

ChangeWindowMessageFilterEx 函数,为指定窗口修改用户界面特权隔离 (UIPI) 消息过滤器。 函数原型: BOOL WINAPI ChangeWindowMessageFilterEx(   __in HWND hWnd,   __in UINT message,   __in DWORD action,   __inout_opt PCHANGEFILTERS

HelloKandy's Blog 7077

ArcGIS实战:利用IDW反距离权重法实现气象数据的批量空间插值

本文详细介绍了如何利用ArcGIS中的IDW反距离权重法实现气象数据的批量空间插值。通过实战案例和脚本示例,展示了IDW插值在气象数据分析中的高效应用,包括算法原理、参数调优、批处理自动化及常见问题解决方案,帮助用户快速生成连续分布的气象地图。

weixin_29051149的博客 240

用户界面特权隔离

写这篇文章源于本人在开发过程中遇到向某个进程发送消息失败而起。 一、用户界面特权隔离 在早期的Windows操作系统中,在同一用户下运行的所有进程有着相同的安全等级,拥有相同的权限。例如,一个进程可以自由地发送一个Windows消息到另外一个进程的窗口。从Windows Vista开始,当然也包括Windows 7、Windows 10,对于某些Windows消息,这一方式再也行不通了。进程(...

while(1) { smile(); } 2492

深入剖析QWEN 2.5模型架构:从GQA到RoPE的技术实现

本文深入解析了QWEN 2.5模型架构,重点介绍了其创新的GQA(分组查询注意力)和RoPE(旋转位置编码)技术实现。通过详细代码解读,展示了这些技术如何提升模型的计算效率和长文本处理能力,适用于代码生成和数学推理等任务。文章还提供了实践部署建议和调优经验,帮助开发者更好地应用这一先进模型。

weixin_42548816的博客 390

Python实战:ERA5风场数据区域提取与风向合成可视化全流程解析

本文详细解析了使用Python处理ERA5风场数据的完整流程,包括NC文件读取、特定区域数据提取、u/v分量合成风向风速的计算,以及利用Matplotlib进行风场时空演变可视化。内容涵盖从环境搭建、数据获取到高级绘图与性能优化的实战经验,为气象数据分析、风能评估及气候研究提供了一套清晰、可操作的技术指南。

swift5iosmith的博客 303

ChangeWindowMessageFilterEx 关于接收管理员权限问题

管理员身份运行的程序,需要接收非管理员身份发送的消息,需要使用windows Api。

weixin_38940097的博客 803

SpringBoot项目启动后ShardingSphere5.0首次SQL查询慢?这个预热技巧帮你搞定

本文针对SpringBoot项目集成ShardingSphere 5.0后首次SQL查询慢的问题,深入剖析了其根源在于SQL解析引擎的懒加载与缓存初始化。文章提供了三种有效的预热技巧,包括精准的SQL解析引擎预热、简单查询触发全链路预热以及可配置的生产级方案,帮助开发者将初始化成本提前至应用启动阶段,从而消除性能毛刺,提升用户体验与系统稳定性。

chair的专栏 1062

【UE4】进程间通过Windows消息通信

  记录一下探究成果。我做的是基于UE项目的独立模块与UE项目编辑器窗口的通信,简化一下,这里用Windows控制台程序向UE4程序发消息的例子来说明流程,原理上是一样的。代码就不一一贴上来了,附上源码链接(点这里)。要注意发送程序关注的进程名要和接收程序一致,否则无法实现通信。 发送程序   发送程序需要找到需要发消息的窗口句柄,然后打包信息利用Windows的SendMessage()函数发送...

wymdhr的博客 3455

随机森林遥感反演详细教程

通过这篇文章,我们展示了如何使用Python对筛选后的影响因子进行随机森林建模,并应用于遥感数据反演森林生物量的任务。该流程不仅可以提高预测精度,还能有效处理大规模的遥感数据,为生态监测和森林管理提供重要支持。

热爱分享,热爱记录 2952

Windows支持进程间的消息通信:注册消息(register messages)

WM_*和WM_COPYDATA都需要提前获取目标窗口的句柄)。 注册消息:可以不指定目标窗口句柄。 发送方和接收方都需要做的: // 1、定义注册消息:参数字符串必须在系统内保证唯一 static const UINT WM_CHECK_ITS_ME = RegisterWindowMessage(_T("##DUIVISION_APPLICATION##")); // 2、定...

iMatt的专栏 1227

MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计

MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计

qq_45806640的博客 455

自定义消息在进程间通讯

进程间通讯应该是老的内容了,相信用VC的大侠们都知道,书本上也都有介绍。我在这只是对自己用过的东西简单的总结一下,希望对有兴趣者有帮助。 WINDOWS中进程间通讯的方式很多,如:消息机制,共享内存机制,SOCKET,COM,RPC等等,需要时可以根据具体情况来选择使用的方式。我在这本文中仅介绍进程间的自定义消息通讯机制。 1,WINDOWS中自定义消息的定义和使用; 在WNDOWS中消息分

WUYUAN2011WOAINI的专栏 884

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

开源 C# 快速开发(十五)进程--windows消息

本文介绍了使用C#实现Windows进程间消息通信的完整方案。主要内容包括:1. 通过Windows API实现WM_COPYDATA和自定义消息两种通信方式,详细解析了FindWindow、SendMessage等关键API的使用方法;2. 设计了消息发送器(MessageSender)和接收器(MessageReceiver)两个程序,展示了完整的通信流程;3. 重点分析了消息封装、内存管理、线程安全等核心技术点,提供了COPYDATASTRUCT结构体定义和消息处理的具体实现;4. 程序具备双向通信能

ajassi2000的博客 1425

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Windows下进程通信的几种方式介绍

Windows下进程通信的几种方式 一、消息通信 所谓消息通信,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息通信是Windows桌面应用程序最常见的一种通信方式了。 示例: 在Windows应用程序下,创建两个应用,一个APPA,一个APPB。 自定义消息类型WM_SE...

MusicMan 911

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Windows下多线程常用函数

1.线程创建 该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。 HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCrea

白永辉的专栏 2473

注册主窗口消息响应函数-用于进程通信

进程间消息通信的时候,在window下我们可以通过在主窗口上注册消息回调函数,来响应消息的处理:首先是定义一个唯一标识的消息id,然后定义并注册窗口消息回调函数来响应这个消息。 UINT g_myM

春夜喜雨的专栏 1092

C++封装Windows命名管道:实现轻量级进程间通信库

进程间通信(IPC)是操作系统提供的核心机制,用于在不同进程间安全高效地交换数据。其原理基于内核提供的共享资源或通信端点,如管道、共享内存、消息队列等。在Windows平台上,命名管道作为一种经典的IPC技术,因其稳定、高效且支持双向通信,在本地进程数据交换场景中具有重要价值。它尤其适用于客户端-服务器模型,为桌面工具、服务管理、插件系统等应用场景提供了可靠的底层通信支撑。本文聚焦于如何用C++封装Win32 API,构建一个开箱即用的单头文件库,通过RAII、异步I/O等工程实践,将复杂的API调用简化为

weixin_30977485的博客 303

创建接收消息的windows窗口

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33859504的博客 439

从WM_USER想到的,进程间通信

 事关WM_USER 进程间通信Range      Meaning 0 through WM_USER–1    Messages reserved for use by the system. WM_USER through 0x7FFF    Integer messages for use by private window classes. WM_APP through 0xBFFF

212

electronJS 开发linux App

electronJS 是一个跨平台软件开发工具,使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用。由于使用了HTML 所以开发的界面更加丰富,美观和快捷。缺点是哪怕是一个Hello the world,也有几百M,程序很庞大。个人觉得electronJS 适合界面要求比较高的App开发。 使用electron开发的App可以在windows,iOS,li...

姚家湾博客 1720

后端大模型流式输出被springcloud gateway“阻塞“的解决办法

可以使用此函数允许将特定消息传递到窗口,即使消息源自较低完整性级别的进程也是如此。与控制进程消息筛选器的 ChangeWindowMessageFilter 函数不同, ChangeWindowMessageFilterEx 函数控制窗口消息筛选器。如果进程消息筛选器或窗口消息筛选器允许该消息,则会将其传递到窗口。允许全局或进程范围内的任何消息都将通过,但任何未包含在这两个类别中以及来自较低特权进程的消息都将被阻止。这使 hWnd 能够接收消息,无论消息的来源如何,即使消息来自较低特权进程也是如此。

csdhshses的博客 291

SendMessage

LRESULT SendMessage( HWND hWnd, // handle to destination window UINT Msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message paramete...

302
上一篇: 逆序链表
下一篇: http上传文件
边缘计算机
博客等级 码龄17年 185粉丝 125原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值