MFC ATL 引发的思考

VS2017里给MFC程序塞个64位ActiveX控件,我踩过的坑你别再踩了 本文详细介绍了在VS2017环境下为MFC程序集成64位ActiveX控件的实战经验。针对32位IDE与64位控件不兼容的问题,提供了从环境配置、控件注册到类添加的完整解决方案,帮助开发者避免常见陷阱,实现高效集成。 阅读详情

1 最近在做ATL,  始终不能理解ATL的实质,  掌握不了它的基本原理. 因为自己"掌握"了MFC, 它们同样是一套类库, 而MFC不但是一套类库, 更是一套Application Framework. 所以觉得理解ATL不应该是问题. 但是最后不但没有理解ATL, 反而发现自己根本就没有"掌握"MFC.

比如MFC 与 windows sdk 之间的关系, 我只知道mfc包装了sdk, 但是究竟是怎么包装的,我根本不明白, 这也就是我不明白CWnd::FromHandle()的原因. 为什么这么多年来始终没有学习到这些东西呢? 从来没有认真的读过MSDN中的CWND的说明!

 

ATL是一组类, 要看一下它是如何包装的sdk, 与MFC有何不同, 为什么ATL在操作窗口类的时候要用fromhandle转换一下.?

理解MFC与ATL: 我们先来看windows sdk: 在windows sdk中, 我们这样创建窗口: HWND hwnd; // Save the application-instance handle. // Create the main window. hwnd = CreateWindow( "MainWClass", // name of window class "Sample", // title-bar string WS_OVERLAPPEDWINDOW, // top-level window CW_USEDEFAULT, // default horizontal position CW_USEDEFAULT, // default vertical position CW_USEDEFAULT, // default width CW_USEDEFAULT, // default height (HWND) NULL, // no owner window (HMENU) NULL, // use class menu hinstance, // handle to application instance (LPVOID) NULL); // no window-creation data if (!hwnd) return FALSE; 若干年前,windows的程序员们都是用这样的函数来写代码。 但是人们发现这样很麻烦。。。在C++被发明以后, 微软公司的程序员们想到这样一个办法, 创建一个类, 用它来把关于windows窗口的函数包装起来,这样其它人就很方便的写出创建和管理窗口方面的代码了。 这个类就叫做CWnd. 我们使用CWnd类的Create()函数来创建窗口,其实Create()内部是调用了windows sdk CreateWindow()函数的, 在Cwnd中有个HWND m_hWnd, 它里面保存CreateWindow()返回的hwnd. CWnd 又提供了其它的许多成员函数,通过它们来操作这个窗口(这些成员函数内部分别调用吧各种各样的windows sdk, 这些sdk需要的HWND参数可以从它的成员m_hWnd看获得)。 我们把这样的一套类称为MFC. 后来出现了COM技术, 一开始程序员们用comsdk来编写COM组件,comsdk同windows sdk一样不方便, 所以微软又开发吧ATL类库。为了理解ATL与MFC的不同, 我们抛开其它的类不管,专门看ATL中关于窗口的类,在ATL中, 包装窗口的类叫做CWindow. 同MFC的CWnd一样,它也有一个HWND m_hWnd,也有一个Create()函数,这两个Create()的一个重要区别是,在指定父窗口时,MFC的Create()的参数类型是CWnd*, 而ATL的Create()的参数类型是HWND. 虽然他们包装的方法上略有不同,但是它们包装的是同一个东西:windows window. 他们底层都是调用相同的windows sdk去操作一个用hwnd标识的窗口。所以理论上他们两个可以互相调用。 在一个ATL工程中,你可以声明一个MFC类的对象(因为MFC类也就是一个C++类。我们可以编写一个实现特定功能的类,然后给这些类起个名字)。 我们可以调用它的成员函数(因为MFC和ATL都是调用一样的底层windows sdk去操作由m_hWnd指定的窗口)。所以由此看来,对于windows窗口,我们可以混合使用ATL和MFC来对同一个窗口操作。唯一需要注意的是,MFC中CWnd的函数使用的是CWnd*参数, 而ATL中CWindow的函数使用的是HWND参数。所以我们需要在他们之间进行转换。从HWND转向CWnd*使用CWnd::FromHandle(HWND), 编译器可以根据hwnd来创建出一个CWnd来(它知道Cwnd的内存结构,而这个内存结构只和HWND有关,所以编译器有足够的信息创建出CWnd来)。 所以,MFC和ATL是两套不同的类库,但是它们包装的都是windows sdk. 只是包装的方法不同。 QA: 1 在ATL工程中是否可以使用MFC类?可以。 2 既然MFC中已经有了关于窗口的类,而且ATL中又可以使用MFC,那为什么ATL要单独开发自己的类Cwindow呢? 如果ATL使用MFC中的CWnd,那么这个程序就要依赖MFC运行时库。效率很低。 3 m_caseReport是一个MFC类对象, 为什么在MFC工程中,在 void CBrResourceMgr::createCaseListWindow() { if (!m_caseReport.Create(dwWndStyle, rtList, this, IDC_CASE_GRID))可以, } 但是在ATL中要 void CBrResourceMgrImpl::createCaseListWindow() { CWnd *pWnd = CWnd::FromHandle(m_hWnd); if (!m_caseReport.Create(dwWndStyle, rtList, pWnd, IDC_CASE_GRID)) } 因为MFC中的CBrResourceMgr是派生自CWnd, 所以create中的this本身就是CWnd*类型的。 但是ATL中的CBrResourceMgrImpl却是CWindow派生类,不能赋给CWnd.
Visual Studio 2022编译报错MSB8041:MFC库缺失的精准修复指南 本文详细解析了Visual Studio 2022编译报错MSB8041的解决方案,重点介绍了如何通过Visual Studio安装程序的单个组件功能精准安装缺失的MFC库。文章提供了从错误诊断到组件安装的完整指南,包括工具集版本匹配、Spectre缓解措施选择等实用技巧,帮助开发者高效解决这一常见编译问题。 阅读详情

相关推荐

VS2019 ATL开发用头文件与静态库整合包(含COM/OLE DB/窗口/字符串/注册表等全套支持)

专为Visual Studio 2019 C++项目准备的ATL开发支持集合,内含atldb.h、atlbase.h、atlcom.h、atlwin.h、atlstr.h、atltime.h、atlenc.h、statreg.h、atlhost.h、atlimage.h等近30个官方原生头文件,覆盖COM对象构建、ActiveX控件开发、本地Windows UI组件封装、OLE DB数据库访问、CStringT字符串处理、ATLTime时间操作、ATLEnc编码转换、STATREG注册表读写、ATLHost

ujm567890的博客 187

C++ 的MFC 和ATL 及COM 是什么?

一、什么是MFC         微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是WinOS下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个输助软件开发包,MFC作为与VC++血肉相连的部分

imJaron的博客 2438

海康视觉平台VisionMaster实战入门:从通讯配置到工具应用

本文为海康VisionMaster视觉平台实战入门指南,详细介绍了从软件安装准备、与PLC等外部设备的通讯配置,到匹配定位、测量、畸变矫正等核心工具的应用方法。通过实战案例拆解,帮助工程师快速掌握如何搭建完整的机器视觉检测与引导定位系统,实现工业自动化项目落地。

weixin_29224309的博客 1016

ATL CLR MFC Win32 常规 的区别--sdk与api的区别

ATL CLR MFCWin32常规 的区别 win32,mfc,clr这些控制台应用程序有什么区别啊? clr是.NET的程序 mfc就是把win32 C++化了 -------------------------------------------------- ATL用于编写COM程序, CLR是.NET的公共语言运行库, ...

baixingzhi2917的博客 295

基于51单片机的贪吃蛇游戏设计

本科时候做的一个课程作业,自己打一个很简易的电路,比较有意思且易上手,故将之记录下来。(全套的仿真及代码,演示视频,课程报告以及PPT展示上传在优快云下载区) 一. 实验目的 (1) 通过对C51语言的理解,编写程序实现对贪吃蛇的有效控制; (2) 通过对51单片机硬件的学习,学会运用面包板,独立按键、点阵屏等,完成对完整电路的搭建过程; (3) 通过对Proteus仿真软件的学习,实现基于STC89C52单片机的8*8点阵贪吃蛇的硬件电路仿真。 二. 实验介绍 贪吃蛇是一款经典小游戏,其游戏的规则是:玩

山山の十三先生 2万+

单细胞测序数据整合

基于Seurat 联合harmony进行单细胞数据整合分析

G2530051386的博客 9792

制作控件,ATL和MFC,应该使用哪个

摘要目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发。MFC代表了创建独立的Windows应用的一种简单、一致的方法;ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码。这两种框架在它们对于开发ActiveX的用途上会合了。我们将看看这两种框架是如何适用于创建ActiveX控件的——突出其优缺点,亲自经历创建一个控件的过程——以便你能够决定何时使用一

Little Things 3352

Windows C语言编程:Beep API实现蜂鸣器原理与实战

如果你在 Windows 上写过 C 语言程序,想给程序加个简单的提示音,第一个想到的可能是 printf("\a") 。这个转义字符确实能在某些终端里发出“嘀”的一声,但它太原始、太不可控了,而且很多时候根本没声音。那么,有没有一种更“Windows”、更可控、更专业的方法来让你的程序“说话”呢? 答案是肯定的,而且它比你想象的要强大和复杂。Windows 提供了一个名为 Beep 的 API 函数,专门用于生成蜂鸣声。你可能觉得这功能太简单,甚至有点过时——不就是让电脑“哔”一声吗?但恰恰是这个看似简单

weixin_34109408的博客 395

crt是什么意思 windows编程_[转]CRT与Windows的关系

CRT原先是指Microsoft开发的C Runtime Library(C语言运行时库),用于操作系统的开发及运行。后来在此基础上开发了C++ Runtime Library,所以现在CRT是指Microsoft开发的C/C++ Runtime Library。在VC的CRT/SRC目录下,可以看到CRT的源码,不仅有C的,也有C++的。CRT原先的目的就是支持操作系统的运行。因为Windows...

weixin_39878247的博客 3984

接口调试必看:status显示canceled的3种常见原因及修复方法

本文深度解析了接口调试中status显示canceled的三种核心原因:网络层中断(如请求超时)、应用层逻辑主动取消(如请求竞态、组件卸载)以及用户交互与浏览器行为。文章提供了从诊断到修复的系统性方案,包括分析Network Timing、使用Axios CancelToken、优化请求策略与性能,帮助开发者从根本上解决这一常见问题。

bb456的博客 937

SAP BTP Trial 生命周期全解析:90 天试用、30 天活跃规则、Kyma 有效期与向 Free Tier 的顺滑迁移

摘要: SAP BTP免费试用账号(trial)提供90天有效期,需每30天登录一次保持活跃状态。Kyma运行时有效期仅14天,需特别注意重建。到期后数据不可恢复,建议将关键配置脚本化并保存。若需长期使用,可迁移至无时间限制的免费层(free tier)。文章详细拆解了试用生命周期规则,包括续期、删除机制,并针对CAP开发、集成套件和Kyma等场景提供实操建议,帮助用户规避常见误区,高效利用试用资源。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 368

关于MFC和ATL

如果你希望用C++来写ActiveX®控件,有两个流行的框架,一个是Microsoft® Foundation Classes (MFC),另一个是ATL。我将深入的解释这两种框架对开发ActiveX控件所提供的支持,帮助你更好的决定哪种模型最适合你的开发环境和需求。 ActiveX控件的完全形态 ActiveX控件基于构件对象模型COM,使得ActiveX控件成为可

哈库纳的专栏 3419

【Go语言实战】(9) gRPC 实现一个简单微服务

文章目录写在前面1. 安装1.1 grpc1.2 proto1.3 protobuf2. 编写代码2.1 初始化项目2.2 编写proto2.3 编写服务端2.4 实现客户端3. 演示 写在前面 这一次我们用gRPC实现获取用户的信息 1. 安装 1.1 grpc grpc的安装直接go get即可 go get google.golang.org/grpc 1.2 proto 下载proto,我是下载这个的。 然后解压出来把bin目录放在直接放在系统变量当中 1.3 protobuf 我们在

面向生活编程 3272

关于对于VC/MFC/ATL的评论问题

关于对于VC/MFC/ATL的评论问题,其实我很早就想写一篇文章来阐述自己的观点,不过又觉得这种容易引发论战的文章实际上是在空耗大家的时间, 不如做点实际工作. 但是现在中国程序员群体的思想走向已经到了一种非常危险的一边倒的地步,上几期电脑报上登出了几名14岁的小孩子, 刚刚学会写几个程序, 就把VC列为自己的梦想. 我去年找工作的时候,连续被几个公司问会不会VC,得到我的答复之后,他们怎么也不能

sanjiang的专栏 697

高项备考论文:规划绩效域

高项备考论文:规划绩效域

liuxu324的博客 1128

深度学习工具包 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")

CVM免训练代码代理:用大模型精确控制视频生成运镜的完整方案

视频生成模型在处理“推拉摇移”等运镜指令时,往往因语义歧义导致画面失控。要解决这类问题,关键不是微调模型,而是构建一套确定性的控制链路:让大语言模型将口语化的运镜描述解析为结构化JSON参数,再通过代码代理进行校验、映射与兜底处理,最终驱动视频模型执行精确的镜头运动。这种基于代码驱动的视觉运动控制方案,具备高确定性、参数可复用和零训练成本的优势,尤其适合短视频批量生成、自动化剪辑和运镜模板沉淀等工程场景。本文以8GB显存环境为例,完整演示了从环境配置、Python代码实现到参数设计与踩坑排错的实践过程,为视

ciya3282的博客 359

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于对于VC/MFC/ATL的评论问题 (转)

关于对于VC/MFC/ATL的评论问题 (转)[@more@]关于对于VC/MFC/ATL的评论问题,其实我很早就想写一篇文章来阐述自己的观点,不过又觉得这种容易引发论战的文章实际上是在空耗大家的时间, 不如做点实际工作. 但是...

csd3176的博客 72

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MFC ActiveX 控件

MFC ActiveX 控件 Visual Studio .NET 2003 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,它支持广泛的 OLE 功能并可自定义以满足多种软件的需要。ActiveX 控件旨在用于普通的 ActiveX 控件容器和 Internet 上的万维网页。您既可以用此处介绍的 MFC 也可以用活动模板库 (ATL) 来创

ouhaochuan的专栏 664

wtl和atl的CString冲突时怎么办

WTL和ATL、MFC都有各自的CString类,类名相同,功能也都差不多,但是如果你同时用到了WTL和ATL,就会发生CString冲突的问题,从而编译器会报错,因为编译器不知道到底你要用的CString是哪个类。下面提供一组头文件包含的内容及顺序,如果你用到ATL和WTL,只要把下面这几行放到stdafx.h中,就搞定了。 #include #include #include

zero_226的专栏 834

MFC之ActiveX的使用

在ActiveX中提供了调度映射和事件映射。调度映射是为了外部应用程序可以方便地访问控件的属性和方法。而事件映射让控件可以向包含它的容器发送事件通知。     COleControl类(**Ctrl文件)是从CWnd类派生的。对控件窗口进行的操作都在**Ctrl类中完成     COlePropertyPage类派生于CDialog类,它以一种类似于对话框的图形界面显示一个自定义控件的属性。也

q5512049的博客 8081

WINDOWS.H already included. MFC apps must not #i

场景在win32工程中,使用MFC,选择MFC的使用方式:在共享 DLL 中使用 MFC,在调用CString的时候,出现如下的错误:c:\program files (x86)\microsoft visual studio 14.0\vc\atlmfc\include\afxv_w32.h(16): fatal error C1189: #error: WIND...

weixin_34248705的博客 268

ATL COM对象崩溃问题一例

转自:http://hi.baidu.com/smallay/item/ba925a3e105ae49bb80c03c8 先单步调试,找到崩溃处代码为: CComObject<foo>* p; CComObject<foo>::CreateInstance(&p); //<==此处 这应该是很正常的用法,排除了代码不正确的问题。继...

aozhi2719的博客 400

C++ COM组件开发实战:ATL/WTL实现跨语言对话框的完整指南

组件对象模型(COM)是Windows平台上实现二进制组件复用和跨语言交互的核心技术。其核心原理在于通过定义清晰的接口契约,实现不同编程语言和进程间的互操作。在桌面应用开发中,用户界面(UI)组件化是提升代码复用性和系统集成能力的关键。ATL(Active Template Library)作为专门为COM开发设计的轻量级模板库,结合WTL(Windows Template Library)的窗口类,为构建高效、可复用的UI组件提供了理想方案。这种技术组合特别适用于需要为现有逻辑组件添加用户交互功能,或封装

weixin_33937499的博客 326

MFC程序中添加ICONTEXTMENU菜单 VS2005编译错误

想在自己的MFC程序中添加ICONTEXTMENU菜单,于是找到了这篇文章:   自己动手写一个简单的Windows shell扩展程序   但是按照作者指示下载的代码是VC6的代码,在VS2005下编译,会有错误提示 BEGIN_COM_MAP(CImportShellExt)        COM_INTERFACE_ENTRY(IImportShellExt)        C

zaishaoyi的专栏 1525
上一篇: debug与release区别
下一篇: 创建frame/view
keepdoingit
博客等级 码龄17年 27粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值