VC 杂记

    技术2022-05-11  73

    关于VC的编译模式 有很多人问为什么VC编译出来的程序都要上兆。而且有些人还总结出条结论:VC做出的东西是又大又慢。其实这实在是冤枉了VC了。其实VC做的工程是个能包含多个子工程的工程文件。一般用AppWizard生成的工程里就包含了两个子工程:Win32 Debug工程和Win32Release工程。而缺省激活的工程是Win32 Debug工程,用这个子工程编译出来的执行文件由于包含大量的调试信息所以一般都要1M以上,有的甚至超过2M。很多人就以为这就是最终的文件了,看看这么大的文件,于是产生了VC做出的东西好大而望而却步。其实,那个执行文件只是为了调试用的。真正发行的时候需要切换到Release模式下去重新编译。切换方式是在Build菜单中选Set Active Configure...。会出来个对话框,在框中选Win32 Release模式,然后再重新编译。这样就能在你的工作目录下多出了Release目录,你的可发行的exe也在这个目录里。一般Release模式下,动态连接的程序 < 50K, 静态连接的程序 < 400k。有了这样的程序不会再说VC做的东西太大了吧。

    几个 Internet 编程小技巧  

    1、如何从应用程序中打开URL? 使用 ShellExecute API 函数可从应用程序中打开URL,例如:要访问Visual C++知识库主页可以这样写:

    ShellExecute(m_hWnd, NULL, "http://extend.hk.hi.cn/~zxn/vckbase.htm", NULL, NULL, NULL);   2、如何从应用程序中发送电子邮件? 使用 ShellExecute API 函数可从应用程序中发送电子邮件,例如:

    ShellExecute(m_hWnd, NULL, "mailto:zxn@hq.cninfo.net", NULL, NULL, NULL);  3、在打开新连接之前,是否要删除掉通过CInternetSession::GetHttpConnection 获得的CHttpConnection 对象?或调用CInternetSession::Close() 函数吗? 应该关闭连接,即 pInternetSession->Close() ,然后再连接新的服务器,也就是:

     pInternetSession->GetHttpConnection(strServer).

    如果删除对象(delete pInternetSession) 而不是关闭连接,那么在连接新服务器时就必须打开另一个会话和连接,这是不必要的。 

    内存文件与多进程  内存文件从行为特征,操作上都与磁盘文件一样。不同的是内存文件是驻留于内存的,而不是存储在磁盘上。内存文件因驻留于内存,所以比磁盘文件快,因为是与内存交换数据的这一特点,内存文件常用来做临时文件,或在不同的应用程序中交换少量数据或对象,所以内存文件成为多进程共享数据进行通信的重要手段之一。

    下面来介绍一下操作内存文件的一个类:CMemFileCMemFile类就是MFC提供的对内存进行创建和操作的类,它是由CFile派生的。CMemFile对象可以自动分配或由人工调用Attach函数进行分配。此外CMemFile对象所创建的内存文件是自动打开的,不必调用CFile::Open之类的函数,因为对磁盘操作的打开和关闭文件不在适用于CMemFile对象。CMemFile对象也不支持CDuplicate函数,LockRage函数,和UnLockRange函数。其特色函数如下:Attach()    将内存附到CMemFile对象 Detach()    将一内存块从CMemFile对象 上分离出来,返回内存指针Alloc()        虚拟函数内存分配操作Free()        解除内存配置Realloc()    从新分配内存Memcpy()    对内存文件进行拷贝GrowFile()    处理内存文件增长  在“文档/视窗结构”的项目中删除对文档视窗的支持  在AppWizard建立好非基于对话框的项目后,作如下步骤修改:一、去掉CMyApp::InitInstance中的所有初始化代码,增加如下代码:CMainFrame* pFrame;pFrame=new CMainFrame();///分配窗口对象pFrame->LoadFrame(IDR_MAINFRAME);///初始化窗口对象LoadFrame也可以改写成CreatepFrame->ShowWindow(m_nCmdShow);m_pMainWnd=pFrame;二、将MAINFRAME.H中的CMainFrame()构造函数置为公用public.三、通过Project|Files来去除Doc.cpp和View.cpp四、去掉对两个头文件DOC.H和VIEW.H的引用。五、删除资源中不必要的项。至此完成了全部的修改。   VC++中怎样使程序自动运行

    我用VC++,希望该程序能在其MainFrameWindow出现在屏幕后自动运行,而无需等待任何消息。所以想知道哪些函数在窗口出现后会被自动调用?----首先,在Windows中没有任何一个消息用来通知窗口初始化完毕,所以在VC中也没有相应的函数,但您的问题可用下面的办法解决。用VC++5.0编写应用程序,MFCAppWizard会自动生成程序的框架,其中CTestView类的函数OnDraw()在窗口出现后自动调用。当然,此函数在窗口的大小发生改变(如最大、最小化)以及窗口由被遮住(一部分)到重新显现时也会被调用。所以为了使某些代码能够自动运行并且只运行一次,除了要将其代码写在OnDraw()函数中外,还要在CTestView类中添加一个用于标记的BOOL型变量x(用户可以自己定义变量名),在该类的构造函数中赋值为true。在OnDraw()函数里加上判断语句:当x为true时执行要求首先运行的代码,然后将x置为false;当x为false时什么也不做。这样就可以保证特定的代码在窗口出现时自动运行而且只执行一次。----具体的程序片段如下:(CTestView.h 文 件 中)class CTestView : public CView{    public:    BOOL x;    ......   // 其 他 的 语 句}(CTestView.cpp 文 件 中)CTestView::CTestView(){    // add construction code here    x=TRUE;}void CTestView::OnDraw(CDC* pDC){  CTestDoc*pDoc=GetDocument();    ASSERT_VALID(pDoc);    if(x==TRUE ){      x=FALSE;      ......// 要 求 首 先 运 行 的 代 码    }}        


    最新回复(0)