Jiangsheng的CSDN Digest(May 15, 2006)

为了便于搜索(http://search.csdn.net),这里尽可能保留了论坛上讨论的原文,但是这并不表示本人赞同帖子中的表述方式和观点。

CSDN 讨论总结系列:


内码转换(Shift-JIS -> GBK)中遇到的问题(VB 基础类)


 

 
 
 
Function SJisToGBK(sSJis As String) As String Dim iLen As Integer Dim sUnicode As String Dim sGbt As String Dim sGbs As String iLen = LenB(sSJis) sUnicode = Space(iLen + 1) MultiByteToWideChar 932, 0, sSJis, -1, sUnicode, iLen iLen = LenB(sUnicode) sGbt = Space(iLen + 1) sGbs = Space(iLen + 1) WideCharToMultiByte 936, 0, sUnicode, -1, sGbt, iLen, vbNullString, 0 iLen = LenB(sGbt) LCMapString &H804, &H2000000, sGbt, iLen, sGbs, iLen SJisToGBK = sGbs End Function

是由网上搜来的一个 BIG5 -> GBK 的函数改的, 不过其中一些参数没弄得很明白, 只好照抄. 试了一下, 发现一些问题, 一是片假名无法转换, 二是部分汉字的转换会出现异常, 返回值里有一大堆问号.


 

 
 
 
DECLARE FUNCTION ConvertINetString _ LIB "MLANG.DLL" _ ALIAS "ConvertINetString" ( _ BYREF lpdwMode AS DWORD, _ BYVAL dwSrcEncoding AS DWORD, _ BYVAL dwDstEncoding AS DWORD, _ BYREF lpSrcStr AS ANY, _ BYREF lpnSrcSize AS LONG, _ BYREF lpDstStr AS ANY, _ BYREF lpnDstSize AS LONG _ ) AS LONG

也可以尝试使用ConvertINetUnicodeToMultiByte、ConvertINetMultiByteToUnicode。


如何用VBA将一个word中某一特定样式的文本替换为空(其他开发语言 Office开发/ VBA)


 

   
   
   
Selection.Find.ClearFormatting Selection.Find.Style = ActiveDocument.Styles( " Heading 1 " ) Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Style = ActiveDocument.Styles( " palawheading " ) With Selection.Find .Text = " ^?" .Replacement.Text = " " .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find. Execute Replace : = wdReplaceAll

 


 

线程中动态更改页面(html)元素(VC/MFC ATL/ActiveX/COM)


编译环境 VS.NET 2003。使用 MSDN 的例子 mfcie 测试。 当页面下载完毕后,开启一线程,在线程中获得页面上的 IMG 元素,想动态更改其 src ,使用 put_src 就会出错 mfcie.exe 中的 0x7ccf9edf 处最可能的异常: 0xC0000005: 读取位置 0x00000034 时发生访问冲突。 但 put_height 、put_alt 等都没有问题,究竟是怎么回事呢?


it should be safe if IHTMLDocument2 interface is marshaled correctly. i.e. by CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream or via the IGlobalInterfaceTable interface.

see also http://vcfaq.mvps.org/com/1.htm


查询IHTMLDocument2接口失败(VC/MFC ATL/ActiveX/COM)


 

   
   
   
   
   
CComQIPtr < IWebBrowser2, & IID_IWebBrowser2 > m_spWebBrowser2; < IDispatch > pDisp; HRESULT hr = m_spWebBrowser2 -> get_Document( & pDisp);
...... CComPtr
 CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML;
spHTML = pDisp;
if (spHTML) { …… } 

spHTML总是为空,是什么问题呢?


需要处理DocumentComplete事件,参考http://www.codeproject.com/shell/AutomateShellWindow.asp


App.Path 函数不识映射驱动器,怎么办(VB 基础类)


我把服务器(机器名为htc-4100)上的某个文件夹 z 映射为本机的Z盘,我有一个VB程序,里面有 App.Path 语句。我把这个VB程序放在服务器上而不是我的本机上。当我在本机上执行这个服务器上的程序时,App.Path 返回的结果是一个绝对路径如下://htc-4100/z/serverInfo 。现在我想让它返回我映射的Z盘,即Z:/serverInfo,而不是//htc-4100/z/serverInfo,程序该如何写?


 

   
   
   
Public Function GetAppDir() As String ' converts UNC of mapped drive to Logical Drive:/Path Dim fso As New FileSystemObject Dim dc As Variant Dim d As Variant Dim S As String Dim strPathName As String On Error GoTo DriveErr strPathName = App.Path Set dc = fso.Drives For Each d In dc S = d.ShareName If InStr ( 1 , S, fso.GetDriveName(strPathName), vbTextCompare) Then GetAppDir = Replace (strPathName, fso.GetDriveName(strPathName), d.DriveLetter & " : " , 1 , 1 , 1 ) End If Next Set fso = Nothing Exit Function DriveErr: Resume Next End Function

 


 

文件路径和对话框的问题(C/C++ C++ 语言)


比如我的程序在d://programe,然后我调用GetCurrentDirectory(128,buf)函数获得的路径也确实是d:// programe。但是当我调用CFileDialog pMyOpenDlg(TRUE)用户通过打开文件对话框选择资源后,再调用GetCurrentDirectory函数得到的路径却是对话框所选择的对 话框(比如,用户使用对话框选择的路径是e://Mp3,则此时我程序中调用GetCurrentDirectory得到的路径是e://Mp3而不是我 程序的路径d://programe,这个问题该怎么解决啊?


不要依赖于GetCurrentDirectory返回的目录。获得当前模块所在目录可以用GetModuleFileName和PathRemoveFileSpec。


CStatic中怎样显示显示菜单的Prompt(VC/MFC 界面)


SDI中菜单的Prompt可以直接在CStatusBar中显示出来.现在想在Dialog窗体中的一个CStatic上显示菜单的Prompt,不知道怎么做.


Handle the WM_MENUSELECT message. The wParam is the menu index, which is also the index of the string table entry that describes the menu. This prompting is ordinarily handled by the mainframe, but in a dialog-based app you have to add your own handler

You can look at the code in the mfc/src/winfrm.cpp, although it is very general; you probably only need a subset of it.


一次性将页面中所有TextBox的值清成空,将DropDownList的默认选中值为第一行(.NET技术 ASP.NET)


想搞一个通用函数,能够将恢复页面的默认状态。


manually clearing all the entry fields controls may cause the page code become tight-coupled, but it'll be the most efficient way. Also, if you want to make it more flexible, you can use the FindControl method to find all the entry fields controls through the control ID and reset their text property, but this will be much less efficient.

   
   
   
foreach (Control control in Page.Controls[ 1 ].Controls) { switch(control .GetType().ToString()) { case "System.Web.UI.WebControls.TextBox": ((TextBox)control ).Text = ""; break; case "System.Web.UI.WebControls.DropDownList": DropDownList ddl = (DropDownList)control ; ddl.SelectedIndex = -1; break; } }

the best way to do this (assuming you can hard code your form) is to make the reset a standard HTML button:

<INPUT TYPE=BUTTON onClick="javascript:clearForm()" NAME="FormToClear">

and then code up some client side script to clear each of the form fields - Pseudo code:

function clearForm() { document.formname.FormToClear.value = "" ... etc }


DataGrid新增一行(.NET技术 ASP.NET)


 

   
   
   
private void bt_insert_Click( object sender, System.EventArgs e) { string sql="select * from Code where Codeid='1'"; executesql.RunSqlDataSet(sql); DataTable tbcode=executesql.RunSqlDataSet(sql).Tables[0]; DataRow dr = tbcode.NewRow(); dr[0] = 1; dr[1] = ""; dr[2] = ""; dr[3] = true; tbcode.Rows.Add(dr); //再次绑定 DataGrid1.DataSource = tbcode; DataGrid1.DataBind(); } 上面的代码是在Datagrid外部点一下按钮datagrid新增了一行 但是如果再点一下按钮 让datagrid再新增加一行,怎么做 我现在发现就是你点10次,它也就新增加一行 难道再每次点新增都要先遍列一遍datagrid插入数据库,然后再新增吗? private void bt_insert_Click( object sender, System.EventArgs e)
      
      
      
private void bt_insert_Click( object sender, System.EventArgs e) { string sql="select * from Code where Codeid='1'"; executesql.RunSqlDataSet(sql); DataTable tbcode=executesql.RunSqlDataSet(sql).Tables[0]; DataRow dr = tbcode.NewRow(); dr[0] = 1; dr[1] = ""; dr[2] = ""; dr[3] = true; tbcode.Rows.Add(dr); //再次绑定 DataGrid1.DataSource = tbcode; DataGrid1.DataBind(); //写入插入数据库的代码 }
} 有没有借助seesion的方法先把新增的存进去,最后点保存后直接全部更新数据库呢?怎么做啊 谢谢

可以参考 http://lucky.diy.myrice.com/javascriptexam/addelement.htm  一次存入数据库,或者用一个用session缓存中的DataSet来做数据源

参考http://dotnet.chinaitlab.com/ASPNET/363515.htmlhttp://msdn.microsoft.com/msdnmag/issues/03/07/DataPoints/


使用ActiveX控件时,怎么设定它的图像列表ImageList(VC/MFC ATL/ActiveX/COM)


在MFC客户程序中加了一个ActiveX控件, 这个控件有一个属性是设定它的ImageList的。 void CXYZ::SetImageList(LPUNKNOWN Value) { static BYTE parms[] = VTS_UNKNOWN; InvokeHelper(0x2c, DISPATCH_METHOD, VT_EMPTY, NULL, parms, Value); }

请问在我的程序中,该怎么传一个参数给它,试了CImageList类程序运行时会有错误。


Create a COM object using this CLSID

MSComctlLib.ImageListCtrl

This is Microsoft ImageList Control 6.0 (SP6).

http://msdn.microsoft.com/library/en-us/com/html/7295a55b-12c7-4ed0-a7a4-9ecee16afdec.asp


关于对话栏控件与视图的通信问题(VC/MFC 界面)


我建了一个SDI工程,静态分割成两个窗格,添加了对话栏。我在其中一个视图中打开一副图片,想在对话栏的ComboBox控件上显示其路径;或者我想点击对话栏的某个按钮,在一个视图中打开一副图片,应该怎么作?


DialogBar上的按钮可以当作工具栏按钮来映射命令消息。工具栏是框架的子窗口,可以通过框架来访问其中的控件


See the MFCIE sample(MFC) in MSDN toolbar和DialogBar都是ControlBar,控件消息都会往父窗口发的


问个关于网页和图片编程的问题(.NET技术 C#)


程序中有一个 axWebBrowser ,一个 PictureBox
现在我想实现的功能是:
用 axWebBrowser 浏览一个网页,然后找到网页里的验证码图片,把它显示在 PictureBox 里面
请问应该怎样做?
注意:由于要获取的图片是验证码,所以不能采用从网页中得到 src 然后通过 src 从网上重新下载这个最容易想到的方法

既然可以用 exeCommand 实现把图片复制剪贴板,
能不能用 exeCommand 实现把图片存在硬盘某文件夹下呢?


How To Programmatically Copy an IMG Element to the Clipboard
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B293125

it is already in the cache, use FindFirstUrlCacheEntry/FindNextUrlCacheEntry to look for it


UI Thread为什么必须先从CWinThread派生一个类(VC/MFC 基础类)


CWinThread本来就有一个消息循环,为什么还要从CWinThread派生一个类?难道是为了动态创建?在mfc中,一个worker thread是否也可以当作UI thread使用?
比如:
CWinThead* pThread=AfxBeginThread(ThreadFunc, ...)
...
这里就不能:pThead->Run();吗?也就是不能当作UI Thead使用吗?


派生是为了扩展自己的功能。如果不需要,那么也可以直接用CWinThread.你在线程外调用这个函数,那么代码就在当前调用线程中执行,而不是在创建的线程中执行。这样是跨线程访问MFC对象,比较危险。


installshield安装过程中调用dll的问题(Delphi 网络通信/分布式开发)


用installshield调用delphi编写的序列号验证的dll文件中的函数,出现如下错误:

Error Number: 0x80040707
Description: Dll Function Call Crashed
Setup will now terminate.


百度搜索的有位高人说,dll函数传递字符串参数不能超过两个吗?


不是参数数目的问题(http://www.codeproject.com/debug/debugis.asp),检查一下参数个数、类型和函数调用约定。参考

HOWTO: Making a Custom Delphi DLL Work as an Extension
http://support.installshield.com/kb/view.asp?articleid=Q100899


ole的自刷新(VC/MFC ATL/ActiveX/COM)


在容器中的ole对象,如何实现自刷新?ole对象如何得到自己在容器中的位置?


InvalidateControl

CComControl::FireViewChange or COleControl::Refresh()

OR

Invalidate the container window
http://support.microsoft.com/support/kb/articles/q150/2/04.asp


IWebBrowser2 的指针,能指向一个iframe么(VC/MFC 网络编程)


想要在iframe中读写元素 跟在网页中读取一摸一样,以便实现代码的较高可重用性。


不是很一样。虽然框架对象支持IWebBrowser2接口,但是并无Windows窗口对象与之对应。
参见blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspx中的源代码


WindowsXP SP2中使用rawsocket进行TCP传输(C++ Builder 网络及通讯开发)


send error!:10049
有人说:
为了预防 DDOS增加安全性MS做了修改
Raw Socket 在XP中已经不能实现发送TCP包了 UDP尚可 混合模式监听功能尚可
不知道是不是真的
那就没有办法用rawsocket进行TCP传输了???
那么的话就没有办法伪装IP了~~~???


no in user mode. in kernel mode, you can write a device driver that plugs into the NDIS stack and communicates directly with the network card device driver.


请教关于OpenGL屏幕模式的几个问题(VC/MFC 基础类)


对OpenGL不是很熟,不过迫切的想了解下面的几个关于OpenGL屏幕的问题,希望得到大家的帮助,谢谢!

OpenGL支持全屏幕“独占”模式吗?还是仅仅只支持将窗口客户区调整得跟屏幕一样的尺寸,而不是真正的独享屏幕显示资源?
OpenGL全屏模式下的双缓冲或多缓冲机制支持像DirectX全屏模式那样的真正的Flip机制吗?

以上问题仅限于讨论OpenGL的Windows版本。

OpenGL本身不支持所谓的全屏模式。相对而言,DirectX 是真正支持独占显示模式的,并且能决定有与之联系紧密的一些绘图特性,如Flip机制就能在显卡级别交换硬件的显示缓冲的地址,而OpenGL不可能做到。我的理解正确吗?

我的目的是想弄清楚OpenGL在利用硬件的能力上(OpenGL是支持硬件加速的吧)与Direct3D有哪些差别。

对于 Direct3D,按照你的说法,Direct3D也只是一个3D的API函数,它也没有界面和窗口,但是D3D有一个函数支持直接设置全屏独占模式: CreateDevice()参数中的pPresentationParameters->Windowed为FALSE的话,D3D就工作在全屏 独占模式,在这种模式下如果pPresentationParameters->SwapEffect为D3DSWAPEFFECT_FLIP的 话,在Present()的时候,就是交换硬件显示缓冲地址的。

对于OpenGL,也不尽然如你所说的,网上查到有个这样的函数:glutFullScreen()可以设置全屏方式,不过其具体的实现,仍然就是像你说的那样,是通过Windows里面的设置。

最后,回到我的疑问上来,不论OpenGL本身支持不支持,到底有没有可能通过某种非D3D的手段(通过其它第三方库等等),使OpenGL工作在类似于D3D的真正全屏模式下,并且SwapBuffers()函数交换的是硬件的显示缓冲地址?

基于我的一个初步的研究结果,对于swapbuffer这样的操作,基于OpenGL的程序,即使是在全屏模式下,没有任何一例是“通过寄存器来切 换地址”的,统统都是copy的方式,例如CS之类的游戏。而基于D3D的全屏方式的游戏,大部分都是真正的“通过寄存器来切换地址”,我曾想办法在 D3D全屏方式下正常显示窗口,结果失败了,窗口都是闪烁的,由此可见的确是“通过寄存器来切换地址”。这才引发了我对OpenGL的“全屏模式”是否能 “通过寄存器来切换地址”的疑问,因为若基于OpenGL的程序没有这个能力,我就可以确保正常显示出窗口而不用担心窗口会闪烁,然后我会集中精力想办法 去解决 D3D下如何不闪烁的问题。

讨论了半天,我还是没有得到一个确切的答案。我再把问题有针对性地描述一下:

OpenGL的swampbuffer在什么情况下是“通过寄存器来切换地址”的?如何能证明这一点?

本贴不是要讨论OGL和D3D孰优孰劣,仅仅只是希望能够确认一下我的研究结论而已。而且这个研究结论对于我手上的工作很重要。
我的研究结论是:

1)窗口模式下:
a. OpenGL的SwapBuffers()函数交换的是内部缓存的地址,前台缓存是copy到屏幕上的。
b. Direct3D的Present()函数也是交换的内部缓存的地址,前台缓存也是copy到屏幕上的。

结论:窗口模式下,因为需要与其它应用程序并存,所以不论是OpenGL还是D3D的底层实现都不允许硬件的显示缓存地址。

2)全屏模式下:
a. OpenGL的SwapBuffers()函数交换的仍然是内部缓存的地址,前台缓存仍然是copy到屏幕上的。工作方式与窗口方式无异,可以理解为假全屏,或者说OpenGL本身就无真全屏的概念。
b. Direct3D的Present()函数此时可能存在两种行为:一种仍然是交换内部缓存的地址,前台缓存仍然是copy到屏幕上的;另一种就是直接通知硬件交换显示缓存的地址。

结论:对于一个3D引擎来说,本来是不应该去牵扯窗口模式或全屏模式之类的问题,OpenGL可能就是这样想的,所以对于OpenGL来说,窗口和全屏没 有区别;但微软就不同,从DirectX诞生之日开始,对于窗口模式和全屏模式就有一定的区别对待,DirectX一直支持一种叫Flip的机制,在全屏 独占模式下就提供页翻转的能力(当然你也可以不用页翻转)页翻转会导致整个屏幕当前显示的内容所映射的显存物理地址会发生改变。对于现在的硬件性能来说, 的确也翻转也没有了太大的速度上的优势,copy已经足够快了,但是页翻转仍然是被DirectX所支持的。

最后,引用一段MSDN里的内容回应一下madmanahong(疯子阿虹)吧:
这是 D3DPRESENT_PARAMETERS 参数说明中的一小段文字:
SwapEffect - Member of the D3DSWAPEFFECT enumerated type. The run time will guarantee the implied semantics concerning buffer swap behavior. So if Windowed is TRUE and SwapEffect is set to D3DSWAPEFFECT_FLIP, then the run time will create one extra back buffer, and copy whichever becomes the front buffer at presentation time.

大意就是说,若Windowed为TRUE(也就是窗口模式下)同时SwapEffect指定为D3DSWAPEFFECT_FLIP,那么在运行时会自 动创建一个额外的后备缓冲(此时就至少会有2个后备缓冲了),每次Present的时候,就那个将要成为前台缓冲的内容copy到这个后台缓冲区中,然后 与下一个后备缓冲交换指针,从而完成假页翻转。
言外之意就是,若Windowed为FALSE(也就是全屏模式下)同时SwapEffect指定为D3DSWAPEFFECT_FLIP,就不会创建额外的后备缓冲,每次都会是真正的页翻转。

写过基于DirectDraw或Direct3D的中文网络游戏的人可能都遇到过这样的问题:
如果希望能在游戏中正常使用系统的各种输入法的话,那么在2D全屏游戏中不能用Flip()函数来交换前台和后备缓中,而只能用Blt()函数来copy它们;在3D全屏游戏中不能指定 D3DSWAPEFFECT_FLIP页翻转标志,而只能指定D3DSWAPEFFECT_COPY标志。否则输入法的窗口将会不断地闪烁,因为输入法的窗口并不能适应也翻转,它只能画在其中一页上。

对于OpenGL,似乎就没有以上这些设置,不过还好,它不会页翻转,所以窗口也不会闪烁。
我所担心的就是,OpenGL会不会什么时候也开始页翻转了,窗口就会闪烁了?


"Fulll-screen" isn't a mode, and there isn't an API to enter it -- full screen is just a consequence of other normal actions. What applications normally do is to create a WS_POPUP and WS_EX_TOPMOST window whose dimensions are GetSystemMetrics(SM_CXSCREEN), ...CYSCREEN. This obscures the rest of the screen and so looks full.

If an app has changed resolution first, using ChangeDisplaySettings(CDS_FULLSCREEN), then I don't know what GetSystemMetrics(...) returns. Note that, despite the name of this API call, I think it'd be wrong to call it a "mode". The function still allows other windows to be shown on the desktop normally, albeit at a different resolution. ChangeDisplaySettings is often used in OpenGL games.

Still, if you tried to grab exclusive mode for yourself and were denied, that'd be a good sign that someone else had it.

see also
Adding a Full Screen Feature to an MFC Application
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B164162

全屏幕确实是windows系统的问题,没有真正的全屏幕和非全屏幕的区别的

根据显示卡的工作原理, 一个屏幕上的内容占据的显存空间只是显卡的一个部分
具体的是哪个部分,是由硬件的寄存器来控制的
所谓的swapbuffer这样的操作,也只是通过寄存器来切换地址而已
显卡本身根据寄存器上的地址,状态,以及端口信息来解释该地址下面的内容如何显示
也正是因为这样,这个操作的速度才非常的快,可以在显示卡显示原有内容的同时,你处理后台buffer的内容,完成后再swap他们

显卡工作原理本身,不分全屏不全屏的,在它的眼中永远是全屏的;
分的是文本方式还是图形方式;用的是显存还是内存还是agp内存

dx 早期是不支持windows模式下的flip的,只支持全屏幕独占方式下的flip
windows下的不支持flip的原因很简单,因为大家都共享这个桌面,不能简单的替换

swapeffect是dx9后的概念,它在windows下的flip允许也是特殊实现的
如同前面说的,flip实际上是发生在backbuffer和一个中间内部buffer,然后从中间的内部buffercopy到桌面区域,这个copy也是显卡内部数据的copy,速度也是很快的

从pc显示卡工作的原理上来说,opengl支持这个层面是没有问题,但是opengl是一个跨平台的系统; 而directx是必须依赖于windows平台的,在单一平台下,微软可以控制一切
这种显卡内存显示地址flip属性在其他的计算机系统和操作系统上能否支持,是个疑问;

如果opengl没有提供这样的功能,个人认为也是考虑跨平台跨系统兼容效果的原因

至于opengl是否会突然改变策略,这个不值得担心!


如何取machine.config或者web.config中的<system.web>中设置的值(.NET技术 ASP.NET)


如:

   
   
   
< system .web > < httpRuntime executionTimeout ="120" maxRequestLength ="10240" useFullyQualifiedRedirectUrl ="false" minFreeThreads ="8" minLocalRequestFreeThreads ="4" appRequestQueueLimit ="100" enableVersionHeader ="true" /> </ system.web >



要取得maxRequestLength的值为10240


 

   
   
   
string filename = " c://inetpub//wwwroot//netcardsweb//Web.config " ; XmlTextReader xmlReader = new XmlTextReader(filename); XmlDocument xDoc = new X
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值