大浪淘沙

大浪淘沙,吹尽狂沙始到金!

博客园 首页 新随笔 联系 订阅 管理
  14 Posts :: 0 Stories :: 48 Comments :: 2 Trackbacks

2004年11月28日 #

Visual C++开发com 应用

用Visual C++开发Com主要包括用win32 SDK开发com,MFC类库开发com和使用ATL模板库开发com。
使用win32 SDK开发com,非常灵活,但是开发的效率比较低,需要编写大量的代码。使用MFC类库开发
com可以大大简化代码。ATL主要侧重于Com应用的开发,适用于建立小型、快捷的com组件。

1、win32 SDK开发com
win32 SDK是开发windows应用程序的最基本的开发工具,功能最强大,由于只提供C语言的API,所有的接口都是
以C函数和结构的形式提供,所以开发的代码量相当大。win32对Ole提供了强有力的支持。在Win32 SDK中我们可以看到
Com库的所有API函数,以及Com和Ole定义的标准接口。通过宏定义可以定义com的接口,这样使程序的可读性好,但是确掩盖了一些基本的定义。
宏定义com接口:
DECLARE_INTERFACE(iface) //声明接口iface,它不从其它的接口派生
DECLARE_INTERFACE_(iface, baseiface) //声明接口iface,它从接口baseiface派生
STDMETHOD(method) //声明接口成员函数,函数返回的类型HRESULT
STDMETHOD_(type, method) //声明接口成员函数,返回类型type。

2、MFC类库开发com应用
MFC类库开发,除了SDI,MDI,基于对话框的应用程序,还可以开发DLL等等其它。
MFC支持三种DLL应用:
静态连接MFC库的正规DLL、动态链接MFC库的正规DLL和MFC扩展DLL。
进程内的组件程序应该使用前两种DLL应用。它们都包括一个CWinApp派生的应用类实例。在应用类的IninInstance()种进行DLL的初始化,在ExitInstance函数中进行终结操作。其所有的应用都是引出函数来的。
正规的DLL是一种标准的DLL程序,可被各种语言编写的的程序调用。而MFC扩展的DLL只能被MFC的应用程序调用。但是MFC扩展的DLL可以直接引出整个C++类。
如果要生成一个进程外的Com组件的程序框架,可以生成一个支持自动化的对话框应用程序,然后去掉与对话框有关的代码。
MFC在基本Com接口和对象方面提供的支持,主要包括MFC实现Com接口的机制,CCmdTarget实现IUnknown以及MFC Com程序中类厂的实现原理。

1.1、MFC用嵌套类来实现Com接口
在用C++实现Com的接口,主要是通过多重继承来实现的。MFC实现Com的接口主要采用的嵌套类的原理来实现的。
代码如下:

在嵌套类中通过定义一个指向父类的指针m_pParent来在父类的构造函数中进行指针的初始化。
接口映射表
MFC对Com的支持是从CCmdTarget类开始的,使用接口映射表实际上就是嵌套类,但是在实现过程中通过一组宏来隐藏了具体的实现的细节。
Com的接口的实现关键是引用计数和QueryInterface的函数的实现。
引用计数主要是通过CCmdTarget的m_dwRef数据成员作为计数器的,所用的接口共享引用这个计数。
QueryInterface函数的实现,是通过CCmdTarget类中的每个嵌套类的接口ID及及接口vtable与父类this指针之间的偏移量。但是如何获得父类的指针呢?接口映射表,是通过该类与父类的偏移量来计算得到。

 

 

posted @ 2004-11-28 15:55 大浪淘沙 阅读(997) 评论(0) 编辑

2004年11月26日 #

//逆序排列字符串
CString CMultiLineToolTipInControlDlg::ArrangeCString(char *string)
{
 long lStringLen;
 lStringLen = strlen(string);
 char *string2;
 string2 = (char *)malloc(lStringLen);

 for(long i = 0; i < lStringLen; i++)
 {
  string2[i] = string[lStringLen - 1 -i];
 }
 string2[lStringLen] = '\0';
 return string2;
}

posted @ 2004-11-26 10:42 大浪淘沙 阅读(1058) 评论(0) 编辑

2004年11月8日 #

 CString strWorkAreaPath;
 char path[MAX_PATH];
 strcpy(path,"E:\\文件夹");
  SetCurrentDirectory(_T("C:\\"));
 strWorkAreaPath = path;
 
 strWorkAreaPath += '\0';
 SHFILEOPSTRUCT fileop;
 fileop.fFlags = FOF_ALLOWUNDO ;
 fileop.hwnd = NULL;
 fileop.pFrom = strWorkAreaPath;
 fileop.pTo = NULL;
 fileop.wFunc = FO_DELETE;
 fileop.fAnyOperationsAborted = TRUE;
 fileop.hNameMappings = NULL;
 fileop.lpszProgressTitle = _T("正在删除文件");
// fileop.fFlags &= ~FOF_ALLOWUNDO;
 SHFileOperation(&fileop);
posted @ 2004-11-08 22:23 大浪淘沙 阅读(1441) 评论(1) 编辑

 double f1 = 7.9;
 double f2 = 7.4;
 double f3 = -7.1;
 double f4 = -7.6;
 double y;
 y = floor(f1);//
    y = floor(f2);
 y = floor(f3);
 y = floor(f4);
posted @ 2004-11-08 22:18 大浪淘沙 阅读(733) 评论(0) 编辑

 HDC       hScrDC;     
 // 屏幕和内存设备描述表
 int       xScrn, yScrn;        
 // 屏幕分辨率
 
 //为屏幕创建设备描述表
 hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
 // 获得当前屏幕分辨率
 xScrn = GetDeviceCaps(hScrDC, HORZRES);
 yScrn = GetDeviceCaps(hScrDC, VERTRES);


 DeleteDC(hScrDC);
 CString str;
 str.Format("X=%d\n Y=%d",xScrn,yScrn);
 MessageBox(str,"当前屏幕分辨率",MB_OK);
//设置分辨率 
 
 DEVMODE DevMode;
 DevMode.dmBitsPerPel=16;
 DevMode.dmPelsWidth=800 ;       //水平分辨率
 DevMode.dmPelsHeight=600;      //垂直分辨率
 DevMode.dmDisplayFrequency=85;
 DevMode.dmSize=sizeof(DevMode);
 DevMode.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL|DM_DISPLAYFREQUENCY;
 long result;
 result=ChangeDisplaySettingsEx(NULL,&DevMode,NULL,0,NULL);
 CString str1;
 str1.Format("X=%d\n Y=%d",DevMode.dmPelsWidth,DevMode.dmPelsHeight);
 MessageBox(str1,"当前屏幕分辨率",MB_OK);
posted @ 2004-11-08 22:13 大浪淘沙 阅读(3854) 评论(1) 编辑

2004年7月31日 #

1 从两个结构相同表中查询记录
select *
from table1
select *
from table2;
 
table1和table2结构必须完全相同!
posted @ 2004-07-31 10:47 大浪淘沙 阅读(1718) 评论(0) 编辑

2004年7月27日 #

一、建立一个MDI的工程。
二、添加一个新的基于CFormView的类。 (new Form)
三、将app中的InitInstance()函数中的一下代码注释掉。

  CMultiDocTemplate* pNewDocTemplate = new CMultiDocTemplate(
   IDR_FORMEX_TMPL,
   RUNTIME_CLASS(CMDISplittWndDoc),  // document class
   RUNTIME_CLASS(CMDIChildWnd),  // frame class
   RUNTIME_CLASS(CFormEx));  // view class
  AddDocTemplate(pNewDocTemplate);
四、在CChildFrame类中重载虚函数OnCreateClient
添加一下代码

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 // TODO: Add your specialized code here and/or call the base class

 CRect rect;
 GetClientRect(&rect);
 CSize size1, size2;

 size1 = rect.Size();
 size1.cx = size1.cx;
 size1.cy = size1.cy/2;
 size2.cx = size1.cx;
 size2.cy = size2.cy/2;


 BOOL bCreateSpltr = m_wndSplitter.CreateStatic( this, 2, 1);
 m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMDISplittWndView), size1,
  pContext);
 m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CFormEx), size2,
  pContext);
 
 return TRUE;//必须更返回值为TRUE;
// return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}
五、运行编译,即可。

posted @ 2004-07-27 15:28 大浪淘沙 阅读(1875) 评论(0) 编辑

2004年7月7日 #

摘要: 最近,再我的IBM笔记本中,安装了虚拟机vmware并安装了win2003,系统刚刚安装完成后,启动虚拟机进入win2003!打开Ie,想浏览网页,但是再打入含有小键盘的字母时,总是不能输入正确的字母,而是与之对应的小键盘的数字键,甚是郁闷。于是,并发现小键盘的指示灯再亮着。原来问题就在他啊!由于很少使用小键盘,所以不知道,如何切换使用小键盘。经去IBM上网查询,为shift+enter。切换成功...阅读全文
posted @ 2004-07-07 22:43 大浪淘沙 阅读(3163) 评论(1) 编辑

2004年6月30日 #

摘要: 求StretchBlt中缩放位图的解决,颜色失真的问题方法!阅读全文
posted @ 2004-06-30 23:04 大浪淘沙 阅读(5420) 评论(2) 编辑

摘要: 多次打开bmp文件!请大家给予指正其中的不合适的地方!BOOL LoadBitmap(LPCTSTR szFilename , CBitmap& bitmap) { ASSERT(szFilename); if(bitmap.m_hObject) bitmap.DeleteObject(); HBITMAP hBitmap = NULL; hBitmap = (HBITMAP)Load...阅读全文
posted @ 2004-06-30 23:01 大浪淘沙 阅读(1625) 评论(0) 编辑