Article ID: 284948
Article Last Modified on 9/26/2005
APPLIES TO
- Microsoft Visual Basic 6.0 Enterprise Edition, when used with:
- Microsoft Windows 2000 Standard Edition
- Microsoft Visual Basic 6.0 Professional Edition, when used with:
- Microsoft Windows 2000 Standard Edition
This article was previously published under Q284948
SYMPTOMS
If you assign text that contains a single line feed character (LF, which is ASCII Character 10) or a single carriage return character (CR, which is ASCII Character 13) to the RichTextBox control, the text is modified when Riched20.dll processes the EM_STREAMIN and EM_STREAMOUT messages to include both a carriage return and line feed character (CR/LF).
This behavior only occurs on Windows 2000 and has changed (and thus regressed) since Microsoft Windows NT 4.0 Service Pack 6 (SP6). In Windows NT 4.0 SP6, the text remains unmodified.
RESOLUTION
To resolve this problem, obtain the latest service pack for Windows 2000. For additional information, click the following article number to view the article in the Microsoft Knowledge Base:
260910 How to Obtain the Latest Windows 2000 Service Pack
The English-language version of this fix should have the following file attributes or later:
Date Time Version Size File name ------------------------------------------------------- 4/16/2001 04:31p 5.30.23.1207 412,432 Riched20.dll
STATUS
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article. This problem was first corrected in Windows 2000 Service Pack 3.
MORE INFORMATION
For additional information about how to obtain a hotfix for Windows 2000 Datacenter Server, click the article number below to view the article in the Microsoft Knowledge Base:
265173 The Datacenter Program and Windows 2000 Datacenter Server Product
For additional information about how to install multiple hotfixes with only one reboot, click the article number below to view the article in the Microsoft Knowledge Base:
296861 Use QChain.exe to Install Multiple Hotfixes with One Reboot
Steps to Reproduce Behavior
Scenario 1
- On a Windows 2000-based computer, open Visual Basic 6.0.
- Create a new Standard EXE project with the sample code that is provided in the following Microsoft Knowledge Base article:
146022 HOWTO: Set Up the RichTextBox Control for WYSIWYG Printing
Run the project, and load a Unix-formatted TextFile, which uses LF characters only. Under Windows 2000, an infinite loop occurs in the following section of code:
' Get length of text in RTF. TextLength = Len(RTF.Text) ' Loop printing each page until done. Do ' Print the page by sending EM_FORMATRANGE message. NextCharPosition = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr) If NextCharPosition >= TextLength Then Exit Do 'If done then exit End If fr.chrg.cpMin = NextCharPosition ' Starting position for next page fr.hdc = Printer.hdc fr.hdcTarget = Printer.hdc Loop
SendMessage seems to be operating on the original, unconverted data, while the Len function returns results based on the CR/LF pairs.
Scenario 2
- On a Windows 2000-based computer, open Visual Basic 6.0.
- Create a new Standard EXE project. Form1 is created by default.
- From the Project menu, select Components. In the resultant dialog box, select the Microsoft RichTextBox Control check box, and then click OK. A RichTextBox icon appears on the controls Toolbox on the left.
- Place a RichTextBox control on Form1.
Double-click on Form1 to bring up the code window. Add the following code to Sub Form_Load:
Dim str As String Dim strLastChar As String Dim strSecondToLastChar As String RichTextBox1.Text = "Item" & Chr(10) ' Cache the richtext string. ' str = RichTextBox1.Text ' Pull the last and second to last characters. ' strLastChar = Right(str, 1) strSecondToLastChar = Mid(str, Len(str) - 1, 1) ' Display the string length and ASCII. ' MsgBox Len(RichTextBox1.Text) & " " & Asc(strSecondToLastChar) _ & " " & Asc(strLastChar)
- Press the F5 key to run the project. The message box displays "6 13 10". The string is 6 characters long and ends in an ASCII 13 (carriage return) and ASCII 10 (line feed) combination. This means that an ASCII 13 character (carriage return) is inserted into the string either at the time the text is set or before it is returned by Riched20.dll.
On Windows NT 4.0 SP6, the string "5 109 10" is returned. The string is 5 characters long and ends in an ASCII 109 "m" and ASCII 10 (line feed) character combination.
Scenario 2 becomes more problematic in the following case:
- Close Form1 to stop the project.
Replace the Form_Load code with the following code:
RichTextBox1.Text = "Item" & Chr(10) RichTextBox1.Span Chr(10), , True MsgBox Len(RichTextBox1.SelText)
- Press F5 to run the project. SelText has a length of 6 characters: the "Item" string, followed by a carriage return and line feed. On Windows NT 4.0 SP6, the return string contains the 4 characters, "Item", as expected.
Additional query words: kbOther RichEdit Riched20
Keywords: kbhotfixserver kbqfe kbbug kbcodesnippet kbfix kbother kbwin2000presp3fix kbwin2000sp3fix KB284948