DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 541 评论 :: 1614万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

08 2013 档案

摘要:面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。图1 对话框资源设计窗口(2)定义一个名称为CTextDlg的抽象类,因为需要访问动态链接库中的CTextDlg类,因此客户端需要定义一个框架,即抽象类CTextDlg。class CTextDlg//定义抽象类CTextDlg{public:virtual void __stdcall ShowTextDlg(char* pchText) = 0;//定义纯虚方法};(3)定义两个函数指针,用于关联动态链接库中的全局函数。typed 阅读全文
posted @ 2013-08-30 17:00 DoubleLi 阅读(3018) 评论(0) 推荐(0) 编辑

摘要:近来在论坛上很有多帖子问到如何使用DLL中的资源(包括对话框,图标等)的问题,现在笔者就来就此问题谈谈,包含在DLL内部使用资源,DLL中使用其它DLL中的资源和在应用程序中使用资源。 我们先以图标为例说起(其它的资源与此图标的加载原理大致相同),我们要加载图标,一般是调用AfxGetApp()->LoadIcon(…);下面是CWinApp::LoadIcon的实现(afxwin2.inl):_AFXWIN_INLINE HICON CWinApp::LoadIcon(LPCTSTR lpszResourceName) const{ return ::LoadIcon(AfxFindR 阅读全文
posted @ 2013-08-30 16:59 DoubleLi 阅读(3878) 评论(0) 推荐(1) 编辑

摘要:from:http://www.cppblog.com/fwxjj/archive/2009/09/25/97219.html 阅读全文
posted @ 2013-08-30 16:57 DoubleLi 阅读(303) 评论(0) 推荐(0) 编辑

摘要:是时候总结一下__declspec(dllimport)的作用了。可能有人会问:__declspec(dllimport)和__declspec(dllexport)是一对的,在动态链接库中__declspec(dllexport)管导出,__declspec(dllimport)管导出,就像一个国家一样,有出口也有进口,有什么难理解的呢?这是一种很自然的思路,开始我也是这样理解。但是在两年前的一个项目中,我发现不用__declspec(dllimport)似乎也可以。比如现在我新建一个使用共享MFC DLL的规则DLL工程:DllDlg。然后我新建两个文件:DllApi.h和DllApi.c 阅读全文
posted @ 2013-08-30 16:56 DoubleLi 阅读(6010) 评论(0) 推荐(1) 编辑

摘要:__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要注意了,只有用相同的方法才能够调用成功.另外,像printf这样接受可变个数参数的函数只有用cdecl才能够实现. __declspec主要是用于说明DLL的引出函数的,在某些情况下用__declspec(dllexport)在DLL中生命引出函数,比用传统的DEF文件方便一些.在普通程序中也可以用__declspec(dllimport)说明函数是位于另一个DLL中的导出函数.int WIN.. 阅读全文
posted @ 2013-08-30 16:36 DoubleLi 阅读(1412) 评论(0) 推荐(0) 编辑

摘要:这是给编译器用的参数设置,有关结构体字节对齐方式设置,#pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) 作用:C编译器将按照n个字节对齐。#pragma pack ()作用:取消自定义字节对齐方式。#pragma pack (push,1)作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐#pragma pack(pop) 作用:恢复对齐状态因此可见,加入push和pop可以使对齐恢复到原来状态,而不是编译器默认,可以说后者更优,但是很多时候两者差别不大如:#pragma pack(push) //保存对齐状态#pragma pack(4 阅读全文
posted @ 2013-08-30 09:40 DoubleLi 阅读(548) 评论(0) 推荐(0) 编辑

摘要:在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。例如,下面的结构各成员空间分配情况:struct test{ char x1; short x2; float x3; char x4;};结 构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节 对界,因此,编 阅读全文
posted @ 2013-08-30 09:36 DoubleLi 阅读(469) 评论(0) 推荐(0) 编辑

摘要:文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000... 阅读全文
posted @ 2013-08-30 09:30 DoubleLi 阅读(524) 评论(0) 推荐(0) 编辑

摘要:VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。 对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)Char 偏移量必须为sizeof(char)即1的倍数int 偏移量必须为sizeof(int)即4的倍数float 偏移量必须为sizeof(float)即4的倍数double 偏移量必须为sizeof(double)即8的倍数Short 偏移量必须为sizeof(short)即2的倍数若现存char 偏移量为1 那么再存int (1不是4的整数倍)就不可以了下面 阅读全文
posted @ 2013-08-30 08:57 DoubleLi 阅读(994) 评论(0) 推荐(1) 编辑

摘要:为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数?MSDN里对这个问题的答案十分的晦涩。不过现在我们已经有了足够的知识来解答这个问题。考虑下面的情况: (a)DllB静态链接DllA (b)DllB在DllMain里调用DllA的一个函数A1() (c)DllA在DllMain里调用LoadLibrary("DllB.dll")分析:当执行到DllA中的DllMain的时侯,DllA.dll已经被映射到进程地址空间中,已经加入到了module list中。当它调用LoadLibrary("DllB.dll")时,首先会调 阅读全文
posted @ 2013-08-29 17:58 DoubleLi 阅读(2979) 评论(0) 推荐(1) 编辑

摘要:1、What is achieved by prefixing the 'static' keyword to a file-level function or file-level variable declaration?使用static关键字修饰文件级的函数和变量起到什么作用?key:对变量来说,不允许文件外的程序访问;对函数来说,该函数的实现必须在这个文件内完成,并且不允许文件外的程序调用。2、Describe the difference between the“IS A”and“HAS A”object relationships. Which is the str 阅读全文
posted @ 2013-08-27 14:56 DoubleLi 阅读(479) 评论(0) 推荐(0) 编辑

摘要:提示1:对“内存结构”表示有疑问或不解的,先参考:http://blog.csdn.net/guogangj/archive/2007/05/25/1625199.aspx,本文使用的表示方法和VC6的Memory视图一致,即:左上表示低位。提示2:下文提到的“类大小”严格上来说是该类经过实例化的对象的大小。当然了,光研究长度的话,两者差别不大,因为:CClassA objA,sizeof(CClassA)和sizeof(objA)得到的结果都是一样的。一、真空类class CNull{};长度:1内存结构:??评注:长度其实为0,这个字节作为内容没有意义,可能每次都不一样。二、空类class 阅读全文
posted @ 2013-08-27 14:54 DoubleLi 阅读(528) 评论(0) 推荐(0) 编辑

摘要:(本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++、Windows编程及MFC经验,还得有一定动手能力。文中可能出现一些术语不统一的现象,比如“子窗口”,有时候我写作“child window”,有时候写作“child”,我想应该不会有太大影响,文章太长,不一一更正了)问题开始于我的最近的一次开发经历,我打算把程序的一部分界面放在DLL中,而这部分界面又需要使用到Tooltip,但DLL中的虚函数PreTranslateMessage无法被调用到,原因大家可以在网上搜索一下,这并不是我这篇文章要讲的。PreTranslateMes 阅读全文
posted @ 2013-08-27 14:52 DoubleLi 阅读(26112) 评论(5) 推荐(2) 编辑

摘要:一、parent:创建者,owner:所有者小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner二、1.Pop-up窗口:一个弹出窗口是必须具有WS_POPUP属性的窗口,弹出窗口只能是一个Top-Level窗口,不能是子窗口,弹出窗口多用于对话框和消息框,也可以用于应用程序的主窗口,弹出窗口可以不必具有标题栏2.Overlapped窗口:一个重叠窗口是一个必须具有WS_OVERLAPPED属性的窗口,也就是一个重叠窗口必须具有边框,标题栏,客户区域。重叠窗口可以是一个子窗口,也可以是一个Top-Level窗口,重叠窗口一般都用于一个应用程序的主窗口3.Top 阅读全文
posted @ 2013-08-27 14:49 DoubleLi 阅读(3120) 评论(0) 推荐(1) 编辑

摘要:一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口。 文档/视图结构中,框架窗口是视图窗口的父窗口。 同时在使用CreateWindow和CreateWindowEx时可以指定父窗口,建立窗口的父子关系。另外,网上有篇文章讲Windows窗口的层级关系,也颇清楚,故转来备查:一、windows窗口之间的关系包括所有与被所有关系,父子关系等。 操作系统为每个窗口实例都分配一个内存空间,该空间被称为窗口实例的信息结构。该结构包含了窗口实例的所有... 阅读全文
posted @ 2013-08-27 14:36 DoubleLi 阅读(5192) 评论(0) 推荐(0) 编辑

摘要:一、概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表。系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口。这个数据结构中有四个数据用来构建list,即child、sibling、parent、owner四个域。所以我们可以看到,窗口之间的关系有两种:owner-owned 关系和 parent-child关系。前者称之为拥有/被拥有关系,后者称之为父/子关系。在这篇文字中,我把owner窗口称之所有者窗口。换句话说,一个窗口在有一个父窗口(parent)的同时,还可能被不同的窗口拥有(owner),也可以有自己的子窗口(child)。在MFC 阅读全文
posted @ 2013-08-27 14:35 DoubleLi 阅读(1836) 评论(0) 推荐(0) 编辑

摘要:这篇讲得很清楚,就转过来了,原文如下:因项目需要,最近在学习MFC,下午在一篇教程中提到了临时窗口、永久窗口,作者让读者自行查阅MSDN,了解临时窗口与永久窗口的概念,出于好奇,出于方便,直接百度一下,看到了几篇题为解释临时窗口与永久窗口的文章,随后网友在论坛中附上了MSDN中的原文,仔细翻译一下,发现网上查到的几篇文章,对这个概念的解释是有问题和不足的。首先我要说明一点的就是窗口是没有临时与永久之分的,窗口是一种资源,随着CreateWindow的调用而产生,随着DestroyWindow的调用而被销毁(资源所占据的内存被回收),在windows程序设计中通过句柄(这里可以将句柄看成是C++ 阅读全文
posted @ 2013-08-27 14:33 DoubleLi 阅读(752) 评论(0) 推荐(0) 编辑

摘要:子类化,通俗来讲就是用自己的窗口处理函数来处理特定消息,并将自己其他消息还给标准(默认)窗口处理函数。在SDK中,通过SetWindowLong来指定一个自定义窗口处理函数:SetWindowLong(hwnd, GWL_WNDPROC, (LONG)UserWndProc);。可是到了MFC中,大部分基础的东西都被封装起来了,那么,这是该怎么实现子类化呢?先来看一个例子:要求:定义一个Edit控件,让它能够对输入进行特定的处理输入进行处理-----只能输入英文字母,对其他输入作出提示。分析:1)处理输入当然是响应WM_CHAR消息了,然后对输入字符进行判断,并做相应处理。那么,我们有怎么才能 阅读全文
posted @ 2013-08-27 14:27 DoubleLi 阅读(4736) 评论(1) 推荐(1) 编辑

摘要:1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;然后将图像格式和矩阵运算,然后将各个算法的实现函数。我用它来做了一个Harris角点检测器和Canny边缘检测器,总共就花了一个小时(第一次用OpenCV)。而且该库显示图像极其方便,两句话就可以。但该库似乎不大稳定,对32F和16S、8U的图像数据支持上bug重重。我用 cvFilter2D函数进行线性滤波,屡屡出错,后来一查原来是大bug。后来用cvmGet来取矩阵元素也是频繁出错,仔细检查了N遍确保程序没问题之后在ya 阅读全文
posted @ 2013-08-27 14:22 DoubleLi 阅读(1750) 评论(0) 推荐(0) 编辑

摘要:1、利用IPicture接口加载、显示图片IPicture接口管理一个图片对象和它的属性。图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持。图像对象的主要接口是IPicture和IPictureDisp。IPictureDisp从IDispatch继承,提供了通过自动化访问图片属性的能力。图片对象可通过OleCreatePictureIndirect创建。关于IPicture支持的其他接口和方法可以看MSDN,一般创建图片对象可以用OleLoadPicture函数,它简化了基于流内容创建图片对象。IPicture接口管理一个图片对象和它的属性。图片对象提供对Bitm 阅读全文
posted @ 2013-08-27 14:21 DoubleLi 阅读(690) 评论(0) 推荐(0) 编辑

摘要:当我们想仔细观察某个细微的东西时,一般都会使用放大镜。而要看清显示在计算机屏幕上的图片或文字时通常也可以借助于Windows操作系统附带的放大程序来实现。但该程序只能以固定的放大倍数去进行观看,有时并不能满足我们的需要。本文就通过MFC基本类库提供的StretchBlt函数来实现对屏幕图象的局部放大,并且可以随意放大、缩小,选取到合适的放大倍数来对图像的细节进行观察。设计与实现本程序主要用来对图像的局部进行可调倍数的放大,应当具有以下主要功能:1. 移动MOUSE放大显示图像的不同部位2. 左击增加放大倍率、右击减少放大倍率。从光学角度来看,对物体的放大成像是通过把较小的真实物体显示成尺寸较大 阅读全文
posted @ 2013-08-27 14:20 DoubleLi 阅读(2457) 评论(0) 推荐(0) 编辑

摘要:基础知识1.PictureBox控件的使用2.加载位图文件1.通过文件路径获得位图句柄//获得位图句柄void CMovePictureDlg::GetHandleFromPath(CString path){ hBitmap= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);//创建位图句柄}2.通过位图句柄创建位图对象并获得位图信息//获取位图对象void CMovePictureDlg::GetBitMap(HBITMAP hBit 阅读全文
posted @ 2013-08-27 14:19 DoubleLi 阅读(1559) 评论(0) 推荐(0) 编辑

摘要:1.读取图片数据函数原型:bool LoadImage(const char *pName, unsigned char *pBitData);函数功能,读取pName指向的图片文件的位图数据bool LoadImage(const char *pName, unsigned char *pBitData){ HDC hdcTemp; // DC用来保存位图 HBITMAP hbmpTemp; // 保存临时位图 IPicture *pPicture; // 定义IPicture Interface OLECHAR wszPath[MAX_PATH+1]; // 图片的完全路径 char sz 阅读全文
posted @ 2013-08-27 14:18 DoubleLi 阅读(1682) 评论(0) 推荐(0) 编辑

摘要:// MySkinDlg.cpp : implementation file//#include "stdafx.h"#include "MySkin.h"#include "MySkinDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// 阅读全文
posted @ 2013-08-27 14:16 DoubleLi 阅读(1275) 评论(0) 推荐(0) 编辑

摘要:1.WindowProc是你给自己的窗口定义的窗口处理函数DefWindowProc是windows平台提供的默认窗口处理函数如果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作"2.根据1,显然,你只能定义WindowProc而不能定义DefWindowProc看看MFC的CWnd源码就一目了然了LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// OnWndMsg does most of the wor 阅读全文
posted @ 2013-08-27 14:15 DoubleLi 阅读(910) 评论(0) 推荐(0) 编辑

摘要:msdn上的解析CWnd::SubclassWindowBOOL SubclassWindow( HWND hWnd );Return ValueNonzero if the function is successful; otherwise 0.ParametershWndA handle to the window.RemarksCall this member function to "dynamically subclass" a window and attach it to this CWnd object. When a window is dynamical 阅读全文
posted @ 2013-08-27 14:11 DoubleLi 阅读(625) 评论(0) 推荐(0) 编辑

摘要:序:本人对Windows系统、MFC谈不上有深入的了解,但对MFC本身包装API的机制很有兴趣,特别是读了候老师的《深入浅出MFC》后,感觉到VISUAL C++的Application FrameWork十分精制[不敢用“完美”一词]。在以前,我对SDI结构处理消息有一定的认识,但对于模式对话框的消息机制不了解,读了《深入》一书也没能得到解决,近日,通过在CSDN上网友的帮助,和查阅MSDN,自认为已经了解。一时兴起,写下这些文字,没有其它目的,只是希望让后来者少走弯路,也希望和我一样喜欢“钻牛角尖”的人共同讨论、学习。如果你是牛人,那么你现在要慎重考虑有没有充足的时间读这些幼稚文字[何出此 阅读全文
posted @ 2013-08-27 13:42 DoubleLi 阅读(457) 评论(0) 推荐(0) 编辑

摘要:走出MFC子类化的迷宫KEY WORDS:子类化SUBCLASSWINDOWMFC消息机制许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习,有些人可能对子类化机制比较陌生。我们先看看什么是Windows的子类化。Windows给我们或是说给它自己定义了许多丰富的通用控件,如:Edit、ComboBox、ListBox……等,这些控件功能丰富,能为我们开发工作带来极大方面,试想:我们单单是自己实现一个EDIT控件是多么的艰难!但是,在实际开发中还是有些情况这些标准控件也无能为力,比如:在我们的应用中要求一个EDIT得到老师对学生的评价A、B、C 阅读全文
posted @ 2013-08-27 12:54 DoubleLi 阅读(447) 评论(0) 推荐(0) 编辑

摘要:1、CWnd::AttachBOOLAttach(HWNDhWndNew);返回值:如果成功,则返回非零值;否则返回0。参数:hWndNew指定了Windows窗口的句柄。说明:将一个Windows窗口与CWnd对象相连接。CWnd::SubclassWindowBOOLSubclassWindow(HWNDhWnd);返回值:如果函数成功,则返回非零值;否则返回0。参数:hWnd窗口句柄。说明:调用这个成员函数以动态子类化一个窗口,并将它与这个CWnd对象相连接。当窗口被动态子类化时,窗口消息将通过CWnd的消息映射,并首先调用CWnd类中的消息处理函数。发送给基类的消息将被传递给窗口的缺省 阅读全文
posted @ 2013-08-27 12:45 DoubleLi 阅读(1132) 评论(0) 推荐(0) 编辑

摘要:CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是 句柄,(包括窗口句柄,DC句柄,线程句柄等)。 m_hWnd m_hDC m_hThread 如果这些类对象的这些句柄为空,就表示无效对象。比如你 CWnd * pWnd = new CWnd,执行是合法的,但是没有Create就没有窗口句柄,基本上就是一个无效对象,只是系统内存申请了内存分配空间而已,很多操作都无法执行(debug模式下会出现断言错误窗口)。 但是,假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是 阅读全文
posted @ 2013-08-27 12:35 DoubleLi 阅读(2475) 评论(0) 推荐(0) 编辑

摘要:一、Windows对象和MFC对象的区别?MFC对象实际上并没有把整个Windows对象都包装在其中。对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的。如果你还不明白,请回忆一下,当我们使用MFC创建一个窗口时,是分两步进行的:第一步,new一个CWnd对象,这一步是创建MFC对象,但是其中的HWND还是非法的,因为对应的Windows对象还没有被创建出来;第二步,调用CWnd的成员函数Create创建真正的Windows对象,同时,把先 阅读全文
posted @ 2013-08-27 11:35 DoubleLi 阅读(873) 评论(0) 推荐(0) 编辑

摘要:这些小技巧之所以特别,是因为这些信息通常吧不能在C++书籍或者网站上找到。比如说,成员指针,即使对于高级程序员也是比较棘手,和易于产生bugs的,是应该尽量避免的问题之一。 What makes these tips special is that the information they provide usually cannot be found in C++ books or Web sites. For example, pointers to members are one of the most evasive, tricky, and bug-prone issues for 阅读全文
posted @ 2013-08-27 11:22 DoubleLi 阅读(4041) 评论(0) 推荐(1) 编辑

摘要:一、程序风格: 1、严格采用阶梯层次组织程序代码: 各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对继行则要求再缩进4格。例如: 2、提示信息字符串的位置 在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。 3、对变量的定义,尽量位于函数的开始位置。二、命名规则: 1、变量名的命名规则①、变量的命名规则要求用“匈牙利法则”。即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写。 即: 变量名=变量类型+变量的 阅读全文
posted @ 2013-08-27 10:10 DoubleLi 阅读(987) 评论(0) 推荐(0) 编辑

摘要:我们知道,c++中,类的静态成员是要在.cpp文件中定义的,如果在.h中定义,会出现重复定义。但是在写类模板时,一般所有的代码都是放在.h文件中的,如果要做分离是一件很麻烦的事。那如果出现了静态成员怎么办?如://====ca.h=====templateclassca{public:staticstd::vectorm_vec;};对于这个m_vec怎么办呢?难道要我们在每个使用该类模板的.cpp中,都手动增加一个定义吗?不用那么麻烦。就在ca.h中,加上一条//=====ca.h=====templatestd::vectorca::m_vec;这样,就可以对所有的类型自动定义该静态变量啦 阅读全文
posted @ 2013-08-23 18:01 DoubleLi 阅读(2745) 评论(1) 推荐(1) 编辑

摘要:一个最简单Singleton的例子:///////// Test.h /////////template class CTest{private:_T n;static CTest* m_pInstance; // Notice: static member variable in template classprivate:CTest() { n = 0; }~CTest() { }public:static CTest* Instance(){if (!m_pInstance){m_pInstance = new CTest();}return m_pInstance;}void Set( 阅读全文
posted @ 2013-08-23 15:53 DoubleLi 阅读(1299) 评论(0) 推荐(0) 编辑

摘要:Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意?A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型:代码:int i;double d;i = (int) d;或者:i = int (d);对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:' 阅读全文
posted @ 2013-08-22 17:59 DoubleLi 阅读(632) 评论(0) 推荐(0) 编辑

摘要:1.今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter);不解为什么要用WINAPI宏定义,查了后发现下面的定义。于是乎需要区别__stdcall和__cdecl两者的区别; #define CALLBACK __stdcall#define WINAPI __stdcall#define WINAPIV __cdecl#define APIENTRY WINAPI#define APIPRIVATE __stdcall#define PASCAL __stdcall#define cdecl 阅读全文
posted @ 2013-08-22 13:49 DoubleLi 阅读(1051) 评论(0) 推荐(0) 编辑

摘要:Directive Parameter order Clean-up Passes parameters in registers?register Left-to-right Routine Yespascal Left-to-right Routine Nocdecl Right-to-left Caller Nostdcall Right-to-left Routine Nosafecall Right-to-left Routine No调用约定 压参数入栈顺序 把参数弹出栈者 函数修饰名(Calling convention)----------------------------- 阅读全文
posted @ 2013-08-22 13:44 DoubleLi 阅读(320) 评论(0) 推荐(0) 编辑

摘要:__declspec(dllexport)2009-03-04 17:25 我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的:不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dlli 阅读全文
posted @ 2013-08-20 16:37 DoubleLi 阅读(886) 评论(0) 推荐(0) 编辑

摘要:一、CString GetCurPath() { TCHAR exeFullPath[MAX_PATH]; CString strPath; GetModuleFileName(AfxGetInstanceHandle(),exeFullPath,MAX_PATH); strPath.Format("%s", exeFullPath); if(strPath.Right(1)!="//") strPath += "//"; return strPath; }二、 HINSTANCE hOcx = ::GetModuleHandle(& 阅读全文
posted @ 2013-08-17 12:28 DoubleLi 阅读(956) 评论(0) 推荐(0) 编辑

摘要:当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄。 使用GetModuleHandle函数格式:HMODULE GetModuleHandle( LPCTSTR lpModuleName); 参数 lpModuleName: [in]用指针指向一个包含模块名以NULL字符结尾的串,模块是.dll或.exe文件。如果文件扩展名省略,则增加默认的扩展名.dll。文件名串可以是省略号(...),表示模块名没有扩展名。这个串不是必须指定一个路径。当指定一个路径时,确定要用反斜线(\),而不是斜线(/)。这个模块名将和当前映射到调用进程地址... 阅读全文
posted @ 2013-08-16 19:35 DoubleLi 阅读(8923) 评论(0) 推荐(0) 编辑

摘要:ActiveX异步回调JavaScript开发环境:VC6.0。背景知识:COM/ActiveX/JavaScript/MFC/Thread想必用过Ajax的童鞋们都知道xmlhttp这个东西吧,通过设定onreadystatechange属性,我们就可以指定他状态改变的回调函数,当状态改变时,ActiveX控件就会调用我们通过onreadystatechange属性制定的回调函数。从而就出现了Ajax给我们带来的精彩。关于Ajax的技术我们这里不做讨论,我们的目的就是实现像xmlhttp这样具有异步回调JavaScript功能的ocx控件来。Let’s go!1.建立MFC ActiveX 阅读全文
posted @ 2013-08-16 19:05 DoubleLi 阅读(1853) 评论(1) 推荐(1) 编辑

摘要:第一种:通过execScript调用。这种方法,虽然操作方便,但不能获取返回值。m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);VARIANT ret;ret.vt = VT_EMPTY;BSTR bstr = sScript.AllocSysString();bRet = m_pHtmlWindow->execScript(bstr, L"javascript", &ret);::SysFreeString(bstr);sRet = CString(ret);第二种:先用GetIDsOfNames找到 阅读全文
posted @ 2013-08-16 18:51 DoubleLi 阅读(3920) 评论(0) 推荐(0) 编辑

摘要:DLL工程,Debug版本下输出文件由basetool.dll basetool.lib 改为basetoolD.dll basetoold.lib 需设置:1、配置属性-常规-目标文件名 $(ProjectName) 加d2、配置属性-连接器-常规-输出问件 由 加d3、配置属性-连接器-高级-导入库,设置文件名$(OutDir)$ProjectName)d.lib4、如果有导出文件,.def文件中也一定要修改导出库的名字 LIBRARY "BaseTool" 变为 LIBRARY "BaseToold"关于相对目录相对目录是相对某个文件而言的,例如在 阅读全文
posted @ 2013-08-16 09:17 DoubleLi 阅读(26242) 评论(1) 推荐(4) 编辑

摘要:论坛有会员用到了。,今天给大家说说CSring如何在非mfc下的调用第一:先要包含 #include "afx.h"包含之后会报windows.h重复定义我们需要把这个头文件包含在windows.h的前面第二:alt+f7 快捷键 设置---或者菜单--工程--设置---点击常规--使用MFC作为静态的 或者可以设置MFC为共享的DLL第三:alt+f7 快捷键 设置---或者菜单--工程--设置---切换到C\C++点击Code Generation --use-run-time library 选择MUltithranded如果你第二:选择的是MFC作为共享的dll的话 阅读全文
posted @ 2013-08-16 08:47 DoubleLi 阅读(624) 评论(0) 推荐(0) 编辑

摘要:VC2008环境中ICE的配置ICE 3.4.0的下载页面http://www.zeroc.com/download_3_4_0.html环境变量配置1、Ice-3.4.0安装到c:\Ice-3.2.0-VC712、Ice-3.2.0-ThirdParty-VC71.msi到D:\Ice-3.4.03、在OS系统环境变量中添加ICEROOT,指向D:\Ice-3.4.04、在OS系统环境变量path添加“%ICEROOT%\bin;”、“%ICEROOT%\lib;”VC环境配置“工具”\“选项”\“项目”\“VC++目录”选择“可执行文件”: 增加“$(ICEROOT)\bin”选择“包含文 阅读全文
posted @ 2013-08-15 14:51 DoubleLi 阅读(367) 评论(0) 推荐(0) 编辑

摘要:示例程序一1)ICE文件 Printer.icemodule demo{ interface Printer { void printString(string s); };};2)Server端开发选择Win32控制台空白项目 添加Iced.lib IceUtild.lib增加Server.cpp,内容:#include "Printer.h"#include #include using namespace std;using namespace demo;class PrinterI : public Printer{ public: // 重载实现接口逻辑 virt 阅读全文
posted @ 2013-08-15 14:50 DoubleLi 阅读(408) 评论(0) 推荐(0) 编辑

摘要:http://www.acejoy.com/bbs/viewthread.php?tid=2878&extra=page%3D1ICE开发初级研究(一)最近一段一直在忙于工作,事情比较多,除了偶尔在这里看看帖子,一直没有写什么东西。再加上忙于PurenessScopeSerever0.72版本的开发,争取0.72版再次给大家带来一些提升。其实想想,技术这种东西,并非一定要高深到谁也看不懂才叫牛。技术这样的东西,分享是很关键的。只有简单好用的技术,才会获得大规模的应用。ICE这个东西,说实话以前我比较惧怕。到处看到的文章都是说,重量级的中间件,虽说是源于Corba,但是复杂度感觉不低于A 阅读全文
posted @ 2013-08-15 14:49 DoubleLi 阅读(613) 评论(0) 推荐(0) 编辑

摘要:文章一今天我笔记本的VC编译器莫名其妙的就进入不了断点了,而台式机确是好的,问题是一进入调试,断点就自动被取消了,郁闷了一下午,无法进入断点的原因很多,都有想重装VC编译器的打算了,晚上回来查查资料,发现原来是我的VC配置出了问题,解决方法:Project -> Setting -> Linkgenrealselectd“ Generate debug info”现在把与此问题相关的一些设置和问题的解决方法奉献给大家:1、Project -> Setting -> c/c++ table->genreal“debug info” set to “program d 阅读全文
posted @ 2013-08-15 12:36 DoubleLi 阅读(3858) 评论(0) 推荐(1) 编辑

摘要:Ice笔记-利用Ice::Application类简化Ice应用作者:ydogg,转载请申明。在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信器初始化、异常捕获,以及应用终止后的销毁。鉴于每个应用都需要,Ice运行时库提供了Ice::Application类来解放用户,避免重复劳动,消除繁琐的初始化和销毁细节。Ice::Application虽然实用,但总体来说是个比较简单的类,主要提供了Ice通信器初始化和信号捕获处理两大功能。下面将从功能和实现两方面进行阐述,并给出常见用法和注意事项。源码版本为Ice-3.2.1。一.Ice::Appl 阅读全文
posted @ 2013-08-15 10:06 DoubleLi 阅读(636) 评论(0) 推荐(0) 编辑

摘要:DWORD GetCurrentDirectory( DWORD nBufferLength, // size of directory buffer LPTSTR lpBuffer // directory buffer ); 函数功能: 找到当前进程的当前目录(.dsw所在文件夹) 参数说明: 参数 类型及说明 nBufferLength 缓冲区的长度 lpBuffer 指定一个预定义字串,用于装载当前目录 返回值 调用成功 返回装载到lpBuffer的字节数。 如nBufferLength的长度不够,不足以容纳目录,则返回值是必要的缓冲区长度(要求至少这个长度),... 阅读全文
posted @ 2013-08-14 19:41 DoubleLi 阅读(3305) 评论(0) 推荐(0) 编辑

摘要:DOS批处理命令,永远是不朽的命令,不仅功能强大,同时,速度也是最快的!但是,很多新手学习计算机,都已经遗忘了本不该忘记的批处理命令。 我们不可数典忘祖,该学习的还是要学习,不该忘记的还是不能忘记,尤其是DOS批处理命令,在开发软件或项目的时候,都离不开这些基本的原始的命令。本文,我们来学习Xcopy的参数及实例 一、Xcopy参数介绍 命令格式:XCOPY source [destination] 一堆可选的参数 参数介绍 source 指定要复制的文件。 destination 指定新文件的位置和/或名称。 /A 只复制有存档属性集的文件, 但不改变属性。 /M 只复制有存... 阅读全文
posted @ 2013-08-14 19:39 DoubleLi 阅读(594) 评论(0) 推荐(0) 编辑

摘要:源代码下载:MyActiveX20081229.rar声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。在上一篇文章《COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)》中介绍了ActiveX控件中使用多线程的基本需求,并提出了一个简单的线程模型,但却出现了意想不到的问题,本文将尝试给出问题的一个可行的解法,并同时解决上文中提出的第二个问题。其实解决的思路也很简单,一开始我也早就想到了的, 阅读全文
posted @ 2013-08-13 23:13 DoubleLi 阅读(616) 评论(0) 推荐(0) 编辑

摘要:声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。最近遇到两个需求:1)在ActiveX控件中使用工作线程来完成底层的硬件设备扫描任务,并在工作线程中根据操作结果回调外部web页面的JavaScript函数;2)能根据控件任务的不同自动调整控件大小。但在查阅了大量资料后,发现网上讨论ActiveX中多线程开发的文章基本没有,最后在csdn论坛里遇到一个高手帮忙后,摸索了几天才解决这两个问题,本文的目的就在于记录下我解决这两个问题的 阅读全文
posted @ 2013-08-13 23:12 DoubleLi 阅读(725) 评论(0) 推荐(0) 编辑

摘要:转载自:http://dhailin.blog.163.com/blog/static/230738322011128102043880/首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法:[cpp]view plaincopy STDMETHODIMPCtest::test(void)//无输入输出参数{//TODO:在此添加实现代码MessageBox(NULL,L"test",L"test",MB_OK);returnS_OK;}STDMETHODIMPCtest::test1(BSTRa1)//有一个字符串输入参数{// 阅读全文
posted @ 2013-08-13 23:00 DoubleLi 阅读(2243) 评论(0) 推荐(0) 编辑

摘要:转载自:http://blog.csdn.net/cheungmine/article/details/1451489要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度。这就要求使用回调函数,设其名称为scriptCallbackFunc。实现这个技术很简单:1 、组件方(C++)组件A 的方法在IDL中定义:[cpp]view plaincopy [id(2)]HRESULTlongCalc([in]DOUBLEv1,[in]DOUBLEv2,[in,optional]VARIANTs 阅读全文
posted @ 2013-08-13 22:58 DoubleLi 阅读(598) 评论(0) 推荐(0) 编辑

摘要:欢迎大家拍砖!一、应用背景有一个在win7中用VS2008编译成功,运行正常的程序:Exe+DLL;放到XP虚拟镜像上运行却提示:LoadLibrary返回14001。(1) 后来采用了下面方法中的“方法一”解决了。(2)但在方法一的基础上还要安装VS2008对应的分发包vcredist_x86.exe(VS2005的安装目录下提供了此文件,但在VS2008去不提供,但可到网上下载)。参考文章:http://hi.baidu.com/roger_long/item/867a7cf6fd8cf4cc521c26c5二、网上资料有些机器出现这样的问题,有些没有!有些控件无问题,有些有问题。以前做安 阅读全文
posted @ 2013-08-13 22:52 DoubleLi 阅读(866) 评论(0) 推荐(0) 编辑

摘要:版权所有,转载请注明:http://blog.sina.com.cn/u/1978765352由于工作中需要用到JSON数据,所以解析JSON数据就成了一个非常重要的工作内容。其实用C++解析数据是很繁杂的任务,涉及到很多的数据处理和数据安全问题。好在网上提供了很多的JSON解析库,其中不乏很优秀的,出于效率,还是使用这些第三方的库比较好。我使用的是jsoncpp,这是一个开源的C++的JSON解析库,我将写两篇博文来介绍如何使用jsoncpp,而本文将介绍jsoncpp的添加。首先,需要在网上下载jsoncpp的程序文件,这里提供链接,无毒无公害,请放心使用:http://www.oschi 阅读全文
posted @ 2013-08-13 10:37 DoubleLi 阅读(4996) 评论(0) 推荐(0) 编辑

摘要:许多初学 VC 的朋友也许都为那么一个问题困扰过: 为什么所有的 cpp 都必须 #include "stdafx.h" 也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含。可是,这到底是为什么呢?预编译头有什么用呢? 这得从头文件的编译原理讲起。其实头文件并不神秘,它的全部作用,就是把自己的所有内容直接“粘贴”到相应的 #include 语句处。如果不相信的话,不妨做个实验,将一个 cpp 中的所有 #include 语句删掉,并将它包含的文件粘贴到相应的位置,你会发现,文件的编译和运行都完全没有受到影响。其实,编译器在编译你的程序的时候,所做的第一件事,也就是 阅读全文
posted @ 2013-08-12 20:50 DoubleLi 阅读(669) 评论(0) 推荐(0) 编辑

摘要:错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?错误分析:此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束。没有找到预编译指示信息的头文件"stdafx.h"。(因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它) 阅读全文
posted @ 2013-08-12 18:35 DoubleLi 阅读(557) 评论(0) 推荐(0) 编辑

摘要:一,hashtable原理:哈希表又名散列表,其主要目的是用于解决数据的快速定位问题。考虑如下一个场景。一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较key啊,呵呵。大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的。具体如何做呢?大家是否有注意到前面说的话:“数组可以通过下标直接定位到相应的空间”,对就是这句,哈希表的做法其实很简单,就是把Key通过一 个固定的算法函数既所谓的哈希函数转换成一个整型数字 阅读全文
posted @ 2013-08-12 15:44 DoubleLi 阅读(5739) 评论(0) 推荐(1) 编辑

摘要:hash_map和map的区别分类:STL2008-10-15 21:245444人阅读评论(0)收藏举报class数据结构编译器存储平台tree这里列几个常见问题,应该对你理解和使用hash_map比较有帮助。4.1 hash_map和map的区别在哪里?构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。4.2什么时候需要用hash_map,什么时候需要用map?总 体来说,hash_map查找速度会比map快,而且查找速度基本 阅读全文
posted @ 2013-08-12 14:07 DoubleLi 阅读(627) 评论(0) 推荐(0) 编辑

摘要:这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自alvin_lee ,codeproject,codeguru.baidu等等!先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题!实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的。做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了。今天改进代码,顺便又来温习基础功课了。 还记得Herb Sutter那极有味道的《C. 阅读全文
posted @ 2013-08-12 13:54 DoubleLi 阅读(406) 评论(0) 推荐(0) 编辑

摘要:------------------前言------------------开发了这么多年,发现最困难的程序开发就是通讯系统。其他大部分系统,例如CRM/CMS/权限框架/MIS之类的,无论怎么复杂,基本上都能够本地代码本地调试,性能也不太重要。(也许这个就是.net的企业级开发的战略吧)可是来到通讯系统,一切变得困难复杂。原因实在太多了,如:性能永远是第一位:有时候一个if判断都要考虑性能,毕竟要损耗一个CPU指令,而在通讯系统服务器,每秒钟都产生上百万级别的通讯量,这样一个if就浪费了1个毫秒了。系统环境极其恶劣:所有我们可以想象的恶意攻击、异常输入等都要考虑;网络说断就断:在socket 阅读全文
posted @ 2013-08-10 22:57 DoubleLi 阅读(872) 评论(0) 推荐(0) 编辑

摘要:一个 VC Project 中,可能有很多地方需要用到版本号,比如 About 对话框、版本资源等。如果每次版本更改都一一去改变这些值,不但非常麻烦,而且有悖唯一原则。 巧妙地使用宏定义,可以很好地解决这个问题。 先来看看几个预处理操作符 (Preprocessor Operators):OperatorActionStringizing operator (#)Causes the corresponding actual argument to be enclosed in double quotation marksCharizing operator (#@)Causes the co 阅读全文
posted @ 2013-08-09 17:39 DoubleLi 阅读(1135) 评论(0) 推荐(0) 编辑

摘要:一、oracle10g安装,比较简单 1.去Oracle网站下载Vista版的Oracle:Oracle Database 10gRelease 2 (10.2.0.4) for Microsoft Windows Vista x64 and Microsoft Windows Server 2008 x64 2.解压下载的安装文件10204_vista_w2k8_x64_production_db.zip 3.修改验证文件来支持windows7 修改\stage\prereq\db\refhost.xml 加入 ... 阅读全文
posted @ 2013-08-01 16:11 DoubleLi 阅读(8709) 评论(0) 推荐(1) 编辑

摘要:软件景象:64位win7、32位Oracle 10g、 PL/SQL 9.0.4.1644 媒介:以前开辟用的都是32位体系,忽然换到64位上,安装景象真的有点麻烦了,尤其对于PL/SQL只支撑32位等。看了很多的材料,但一些题目并不克不及直接解决。花了一天时候终于安装成功了,下文将安装过程中碰到的题目记录下,以便作为今后的参照,也对大师解决类似题目有效。情景:安装完win7后,新建了一个用户,但在安装完Oracle后,点击Net Configuration Assistant,,没有任何反响。 原因:权限题目,须要有高等经管员权限; 解决办法:win7体系内置administor高... 阅读全文
posted @ 2013-08-01 15:53 DoubleLi 阅读(4249) 评论(0) 推荐(0) 编辑

摘要:问题是:我在自己电脑(win764bit)上安装了oracle的64位数据库 通过sqlplus能正常连接主要是安装pl/sql时 我是这样安装的1、在网上下载了个instantclient-basic-nt-11.2.0.3.0包解压放在E盘下 路径如下E:\instantclient-basic-nt-11.2.0.3.0\instantclient_11_22、我在PL/SQL中的perferences中connection中的oracle_home:E:\instantclient-basic-nt-11.2.0.3.0\instantclient_11_2 ... 阅读全文
posted @ 2013-08-01 15:47 DoubleLi 阅读(16198) 评论(0) 推荐(1) 编辑

摘要:如果系统里安装了多个ORACLE产品,那么在注册表里,有可能也会有多个ORACLE HOME,在不设置系统环境变量的情况下,默认情况使用哪个ORACLE HOME?HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ALL_HOMES\DEFAULT_HOME这个值就是默认的ORACLE HOME,有了DEFAULT_HOME的值,你可以在HOME0或HOME1或HOME2...中的ORACLE_HOME_NAME找到对应值,所处的HOMEx就是默认的ORACLE_HOME.如何在注册表里更改ORACLE_HOME?把HKEY_LOCAL_MACHINE\SOFTWARE\O 阅读全文
posted @ 2013-08-01 14:46 DoubleLi 阅读(959) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示