问题四:如何使程序在启动时不创建一个新文档?
钥匙在这里: 在程序的InitInstance中的ProcessShellCommand函数之前加入:
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing 问题五:如何在MDI程序中得到所有的视图?
钥匙在这里:
必须用一些文档中没有记载的函数:
CDocument::GetFirstViewPosition(); // DOCCORE.CPP CDocument::GetNextView(); // DOCCORE.CPP CMultiDocTemplate::GetFirstDocPosition(); // DOCMULTI.CPP CMultiDocTemplate::GetNextDoc(); // DOCMULTI.CPP |
同时还需要与CWinApp的成员m_templateList打交道。
问题六: ADO中如何得到某个数据库中的所有表的数目?
钥匙在这里:
HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CatalogPtr pCatalog = NULL; _bstr_t strCnn("Provider=sqloledb;Data Source=MyServer;" "Initial Catalog=pubs;User Id=sa;Password=;"); try { file://Define a command object for a stored procedure. pConnection.CreateInstance(__uuidof(Connection)); hr = pCatalog.CreateInstance(__uuidof (Catalog)); hr = pConnection->Open(strCnn,"","",adConnectUnspecified); pCatalog->PutActiveConnection(_variant_t((IDispatch *) pConnection)); long nTBCount = pCatalog->Tables->Count;//这就是你想要的表的数目 pConnection->Close(); pConnection = NULL; } catch(_com_error &e) { .... } |
问题七:从应用角度讲阻塞与非阻塞SOCKET有什么区别?
钥匙在这里:
从系统性能上看,用非阻塞的socket效率和性能更高,但是编程(www.cppentry.com)更复杂,特别是当你使用事件或者消息的时候,但是,你可以通过4个工作线程管理100多个socket连接,效率非常高,不需要每个工作线程只管理一个socket连接。 用阻塞的方式比较简单,但当较多客户端时消耗系统资源太多。
所谓用4个线程管理100多socket,不过是这样一种构思:建立一个线程池,当有socket的事件需要处理时,从线程池中取一个线程来执行,执行完,将线程归还到线程池中。 这样的做法在如下的条件下会工作的更好:
(1)、每个socket连接的时间较长,不断的与服务器交互。
(2)、每个连接的socket并不是每时每刻都在收发数据 具体的实现方式:(我是在windows环境下实现的,linux上现在正在研究) 可以使用OVERLAPED IO,或者完成端口(CompeleteIO)
问题八: 怎样设置栈的大小?
钥匙在这里:
方法一:STACKSIZE 定义.def文件
语法:STACKSIZE reserve[,commit]
reserve:栈的大小;commit:可选项,与操作系统有关,在NT上只一次分配物理内存的大小
方法二:设定/STACK
打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。
注意:reserve默认值为1MB,最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较
大会使栈开辟较大的值,可能增加内存的开销和启动时间