随笔分类 -  ATL

COM在注册表中的相关键值及其意义
摘要:转自https://www.cnblogs.com/developersupport/archive/2013/06/02/COM-registry.html 概要 当编写好一个COM并将其在系统中注册之后,这些注册表项到底位于Register中的什么位置,系统是如何通过这些注册表项在Runtime 阅读全文
posted @ 2021-11-18 11:59 归海一刀
[WTL] 窗体Style的含义
摘要:比较有用的设置:(1)WS_POPUP:弹出式窗体,没有标题栏!WS_BORDER:细的黑边框WS_OVERLAPPED:一般的有标题栏的窗体,见多了。WS_CHILD:子窗体,一般用于Frame里面的窗体(2)WS_CAPTION:标题栏WS_SYSMENU:系统菜单(只有设置后才有最小化、最大化... 阅读全文
posted @ 2014-10-24 15:56 归海一刀
ATL & WTL 实现分析(五)
摘要:转载自:http://www.cnblogs.com/macrolee/archive/2013/04/22/3036609.htmlCDialogImpl对话框本质上是布局和行为受约束的窗口。最原始的模态对话框API是:1: WINUSERAPI2: INT_PTR3: WINAPI4: ... 阅读全文
posted @ 2014-10-22 15:05 归海一刀
ATL & WTL 实现分析(四)
摘要:转载自:http://www.cnblogs.com/macrolee/archive/2013/04/22/3036606.html消息链(Message chaining)当我们一次又一次用相同的方式来处理消息时,一定想到了重用消息处理的实现。一种直接而简单的想法实现如下: 1: templa... 阅读全文
posted @ 2014-10-22 15:02 归海一刀
ATL & WTL 实现分析 (三)
摘要:转载自:超类化Windows窗口对象模型定义窗口类并创建窗口对象实例,和c++的对象模型十分相似。HWND之于WNDCLASSEX结构体正如同this指针之于c++的类。如果仍然按照c++的面向对象模型来进一步用于Windows,那么我们也可以延伸出继承这个特性:Windows superclass... 阅读全文
posted @ 2014-10-22 14:58 归海一刀
ATL & WTL实现分析 (二)
摘要:转载自:http://www.cnblogs.com/macrolee/archive/2013/04/02/2996981.html现在分析ATL中窗口过程的实现。这部分功能在CWindowImplBaseT类中实现。在Win32程序中,窗口过程(WndProc)是一个回调函数,且其指针保存在WN... 阅读全文
posted @ 2014-10-22 14:45 归海一刀
ATL & WTL 实现分析(一)
摘要:典型的Win32程序可以分为这几部分:注册窗口类(WNDCLASSEX的一个实例,可认为是一个类对象);创建窗口对象(HWND hwnd来保持);创建窗口过程(WndProc,在注册窗口类时完成WndProc的注册,本质是回调函数);创建并开始消息循环(MSG对象)。 整个过程有很多繁琐和例行的步骤... 阅读全文
posted @ 2014-10-22 14:35 归海一刀
ATL中窗口句柄与窗口过程的关联方法
摘要:{return0;}pThis->m_hWnd = hWnd;// Initialize the thunk. This is allocated in CWindowImplBaseT::Create,// so failure is unexpected here.pThis->m_thunk.... 阅读全文
posted @ 2014-10-21 16:18 归海一刀
在COM方法中用VARIANT类型传递数组数据
摘要:在使用COM/DCOM写组件时经常要传递数组,一般比如SHORT,LONG等指针可以直接传递相应的指针,但是当遇到需要传递BYTE数组就有问题了,COM不支持BYTE类型参数,传递BYTE数组也就无从说起了。经过查找资料发现使用VARIANT变量可以传递任何类型的数组,随将使用VARIANT数组的方法总结一下。其实在VARIANT传递数组的方法非常简单,只要理解SAFEARRAY数组的使用方法即可,实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray使用步骤如下:步骤一:生成SafeArray数组VARIANT varChunk;S 阅读全文
posted @ 2013-08-15 22:02 归海一刀 阅读(1433) 评论(0) 推荐(0)
SAFEARRAY的使用(转载)
摘要:以下就是SAFEARRAY的Win32定义: typedef struct tagSAFEARRAY { unsigned short cDims; unsigned short fFeatures; unsigned long cbElements; unsigned long cLocks; void * pvData; SAFEARRAYBOUND rgsabound[ 1 ]; } SAFEARRAY; 这个结构的成员(cDims,cLocks等)是通过API函数来设置和管理的。真正的数据存放在pvData成员中,而SAFEARRAYBO... 阅读全文
posted @ 2013-08-15 21:59 归海一刀 阅读(2204) 评论(0) 推荐(0)
RedrawWindow, UpdateWindow,InvalidateRect 用法
摘要:1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过 InvalidateRect 和 InvalidateRgn 函数来完成的。 InvalidateRect 和 InvalidateRgn把指定的区域加到窗口的 Update Region 中,当应用的消息队列没有其他消 阅读全文
posted @ 2013-04-12 14:38 归海一刀
ISWindowUnicode
摘要:IswindowUnicode函数功能:该函数确定指定的窗口是否是一个本地Unicode窗口。函数原型: BOOL IswindowUnicode(HWND hwnd);参数:hWnd:被测试窗口的句柄。返回值:如果窗口是一个本地Unicode窗口,返回值为非零;如果窗口不是一个本地Unicode窗口,返回值为零,同时说明窗口是一个ANSI窗口。备注;一个窗口的字符集是由函数RegosterClass决定的。如果窗口类是以ANSI版的RegisterClass ( RegjsterClassA)注册的,则窗口字符集是ANSI的;如果窗口类是以Unicode版的Registerclass( Re 阅读全文
posted @ 2013-04-03 10:06 归海一刀
vc中调用Com组件的方法详解
摘要:引用自:http://www.cnblogs.com/jcss2008/archive/2009/10/30/1592907.html1.创建myCom.dll,该COM只有一个组件,两个接口IGetRes--方法Hello(), IGetResEx--方法HelloEx()2.在工程中导入组件或类型库 #import "组件所在目录myCom.dll" no_namespace 或 #import "类型库所在目录myCom.tlb" using namespace MYCOM; --Method 1-------------------------- 阅读全文
posted @ 2013-04-02 14:55 归海一刀
BSTR与其它字符串类型转换
摘要:引用自:http://liulinqi206.blog.163.com/blog/static/1346047662012431101242694/1类型转换常用字符串件的类型转换。FromToSample字符串常量BSTRRight:BSTR bs = ::SysAllocString(_T("Test string"));…::SysFreeString();Wrong:BSTR bs = _T("Test string"); //ERRORLPWSTR /LPCWSTR /WCHAR* /wchar_tBSTRRight:LPCTSTR sz1 = 阅读全文
posted @ 2013-04-02 14:37 归海一刀
IDL详解
摘要:Question:什么是IDL和MIDL?Answer:IDL是接口定义语言。MIDL是Microsoft的IDL编译器。在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。一个例子:import “unknown.idl” ///用于将其他IDL文件中的定义包含到当前文件中///Interface IX[ ///注意是[ ]不是 {}object, ///所定义的接口是一个COM接口uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相应的接口IIDhelpstring(“IX Interface”), / 阅读全文
posted @ 2013-03-29 10:54 归海一刀
智能指针CComPtr 和 CComQIPtr
摘要:1 简介:ATL 提供了2个智能指针的模板包装类,CComPtr<> 和 CComQIPtr<>,这两个类都在 <atlbase.h> 中声明。CComQIPtr<> 包含了 CComPtr<>的所有功能,因此我们可以完全用 CComQIPtr<> 来使用智能接口指针,唯一要说明的一点就是:CComQIPtr<> 由于使用了运算符的重载功能,它会自动帮我们调用QueryInterface()函数,因此CComQIPtr<> 唯一的缺点就是不能定义 IUnknown * 指针。 // 智能指针 sma 阅读全文
posted @ 2013-03-29 10:12 归海一刀
#error 的用法
摘要:#error msg 指定错误,使编译不能过,debug wnd显示消息fetal error : msg。此预处理一般和#ifndef一起使用,用来判定某个条件编译条件是否满足使用样例如下: 阅读全文
posted @ 2013-03-28 14:36 归海一刀 阅读(280) 评论(0) 推荐(0)
无注册表的COM调用
摘要:对于COM,一般用CoCreateInstance来创建对象,这就要求COM的dll要用regsvr32注册,因为CoCreateInstance是要读注册表信息完成相应操作的。CoCreateInstance主要的工作是读注册表,然后CoLoadLibrary,调用DllGetClassObject,最后CreateInstance创建对象。如果我们自己来实现CoCreateInstance的工作,就可以实现无注册表的COM调用。假设有个简单COM,接口很简单,就是个减法函数。普通COM的代码是这样的://普通COMvoid TestCom1(){cout<<"Test 阅读全文
posted @ 2013-03-14 14:06 归海一刀
IUnknown接口QueryInterface函数介绍
摘要:一、COM组件的目标:COM组件的一个主要优势是:便于升级。要实现这个优势需要满足一下两个条件:1、运行时从客户程序动态加载和卸载,采用DLL技术可以实现。2、为了更好的突出DLL的优势,还需要信息隐藏,即封装性。二、COM组件的信息隐藏采用IUnknown接口来实现: 1、IUnknown接口功能简介:IUnknown意思是未知,即未知的接口。采用这个名字是为了简单起见,所有的COM接口都需要继承IUnknown,因此若某个客户拥有一个IUnknown接口的指针,也就不知道接口到底是什么类型的,只需要知道此接口可以用来查询其他接口。IUnknown接口有一个用来查询接口的函数QueryInt 阅读全文
posted @ 2013-03-11 15:55 归海一刀 阅读(1881) 评论(0) 推荐(0)